睿阳知识库 睿阳知识库
首页
  • npm库配置
  • PC端

    • npm常用命令
    • vue问题记录
    • SEO基础知识及优化
    • 禁止别人调试我的前端页面代码
  • 移动端

    • 小程序
    • Risun.js使用说明
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
  • .NET

    • Nuget库配置
  • Python

    • Pypi库配置
  • 常见问题

    • Word转Pdf字体错乱
    • 使用Jacob进行Word导出PDF
  • 自动部署
  • 前端带路径
  • Linux

    • 应用部署
  • Windows

    • 应用部署
  • 视频监控
  • MySQL系列~
  • 应用高可用
  • 静态代码扫描
  • OpenSSH版本升级
  • 区块链~
  • 软件过程文档目录
  • 著作权申请须知及申报示例
  • 项目申报技巧
  • 项目竣工资料清单
  • 科技项目申报流程及注意事项
  • 初级职称申报
  • 产品需求文档基础知识
  • 产品经理需了解的技术知识
  • 墨刀原型设计指南
  • 文档规范
  • 文档规范
  • 投标工作总结(一)
  • 科技项目申报心得体会
  • 数字孪生
  • AI
  • RSP基础平台
  • RMCloud
  • 区块链
  • 网络态势感知
  • 国产化
  • 数据湖
  • 贡献度
  • 文档编写说明
  • Markdown教程
工作链接
首页
  • npm库配置
  • PC端

    • npm常用命令
    • vue问题记录
    • SEO基础知识及优化
    • 禁止别人调试我的前端页面代码
  • 移动端

    • 小程序
    • Risun.js使用说明
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
  • .NET

    • Nuget库配置
  • Python

    • Pypi库配置
  • 常见问题

    • Word转Pdf字体错乱
    • 使用Jacob进行Word导出PDF
  • 自动部署
  • 前端带路径
  • Linux

    • 应用部署
  • Windows

    • 应用部署
  • 视频监控
  • MySQL系列~
  • 应用高可用
  • 静态代码扫描
  • OpenSSH版本升级
  • 区块链~
  • 软件过程文档目录
  • 著作权申请须知及申报示例
  • 项目申报技巧
  • 项目竣工资料清单
  • 科技项目申报流程及注意事项
  • 初级职称申报
  • 产品需求文档基础知识
  • 产品经理需了解的技术知识
  • 墨刀原型设计指南
  • 文档规范
  • 文档规范
  • 投标工作总结(一)
  • 科技项目申报心得体会
  • 数字孪生
  • AI
  • RSP基础平台
  • RMCloud
  • 区块链
  • 网络态势感知
  • 国产化
  • 数据湖
  • 贡献度
  • 文档编写说明
  • Markdown教程
工作链接
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
    • 框架插件

      • 工作流
      • Word、PDF、Excel增强
        • 一. Word 合并
          • 1. 添加依赖
          • 2. 工具类
        • 二. Word 添加水印
          • 1. 添加依赖
          • 2. 工具类
        • 三. Pdf 添加水印
          • 1. 添加依赖
          • 2. 工具类
        • 四. Excel添加水印
      • 消息提醒
      • 资源打包成ZIP下载
      • 区分多个项目Redis缓存
      • 留言评论
      • 内部消息队列
      • 文件预览增强
      • 在线Excel报表设计
      • 自定义高级查询
  • .NET

  • Python

  • 常见问题

  • 后端
  • Java
  • 框架插件
孙超
2022-12-09
目录

Word、PDF、Excel增强

# 一. Word 合并

下面介绍如何将多个Word文档合并成一个Word文档。

# 1. 添加依赖

<dependency>
  <groupId>com.risun</groupId>
  <artifactId>spire-doc-free</artifactId>
  <version>5.2.0</version>
</dependency>

# 2. 工具类


WordMergeUtil.java
package org.dante.springboot.word2pdf.aspose;

import java.io.OutputStream;
import java.util.List;
import org.springframework.util.Assert;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import cn.hutool.core.collection.CollUtil;

/**
 * Word 合并工具类
 * 
 * @author dante
 *
 */
public class WordMergeUtil {
	
    /**
    * 合并多个Word文件,生成一个新的Word文件
    * 
    * @param sourceWordFiles 要合并的Word文件集合
    * @param targetWord	  合并后的Word文件
    */
    public static void mergeToFile(List<String> sourceWordFiles, String targetWord) {
        Assert.hasText(targetWord, "合并后的Word文件不能为空!");
        if(CollUtil.isEmpty(sourceWordFiles) || sourceWordFiles.size() == 1) {
          throw new IllegalArgumentException("要合并的Word文件必须多于一个!");
        }
        
        // 加载第一个文档到Document对象
        Document doc = new Document(sourceWordFiles.get(0));
        int size = sourceWordFiles.size();
        for (int i = 1; i < size; i++) {
          doc.insertTextFromFile(sourceWordFiles.get(i), FileFormat.Docx);
        }
        doc.saveToFile(targetWord, FileFormat.Docx);
        doc.close();
    }

    /**
    * 合并多个Word文件,生成一个新的Word文件
    * 
    * @param sourceWordFiles 要合并的Word文件集合
    * @param outputStream	  合并后的Word文件输出到流中
    */
    public static void mergeToStream(List<String> sourceWordFiles, OutputStream outputStream) {
        Assert.notNull(outputStream, "输出流不能为空!");
        if(CollUtil.isEmpty(sourceWordFiles) || sourceWordFiles.size() == 1) {
          throw new IllegalArgumentException("要合并的Word文件必须多于一个!");
        }
        
        // 加载第一个文档到Document对象
        Document doc = new Document(sourceWordFiles.get(0));
        int size = sourceWordFiles.size();
        for (int i = 1; i < size; i++) {
          doc.insertTextFromFile(sourceWordFiles.get(i), FileFormat.Docx);
        }
        doc.saveToStream(outputStream, FileFormat.Docx);
        doc.close();
    }
}

# 二. Word 添加水印

下面介绍如何为Word文档添加水印。

# 1. 添加依赖

<dependency>
  <groupId>com.risun</groupId>
  <artifactId>spire-doc-free</artifactId>
  <version>5.2.0</version>
</dependency>

# 2. 工具类


WordWaterMarkUtil.java
package org.dante.springboot.word2pdf.aspose;

import java.awt.Color;
import java.io.OutputStream;

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.HeaderFooter;
import com.spire.doc.Section;
import com.spire.doc.TextWatermark;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.ShapeLineStyle;
import com.spire.doc.documents.ShapeType;
import com.spire.doc.documents.WatermarkLayout;
import com.spire.doc.fields.ShapeObject;

/**
* Word 添加水印工具类
* 
* @author dante
*
*/
public class WordWaterMarkUtil {
  
  /**
     * 添加文本水印
     * 
    * @param sourcePath 源文件
    * @param targetPath 目标文件
  * @param waterText 水印文字
  */
  public static void addTextWatermark(String sourcePath, String targetPath, String waterText) {
      Document doc = addSingleTextWatermark(sourcePath, waterText);
      doc.saveToFile(targetPath, FileFormat.Docx);
      doc.close();
  }
  
  /**
  * 添加文本水印
  * 
  * @param sourcePath 源文件
  * @param outputStream 输出流
  * @param waterText	水印文字
  */
  public static void addTextWatermarkToStream(String sourcePath, OutputStream outputStream, String waterText) {
      Document doc = addSingleTextWatermark(sourcePath, waterText);
      doc.saveToStream(outputStream, FileFormat.Docx);
      doc.close();
  }
  
  private static Document addSingleTextWatermark(String sourcePath, String waterText) {
      //创建一个Document实例
      Document doc = new Document();
      //加载示例 Word 文档
      doc.loadFromFile(sourcePath);
      //获取第一节
      Section section = doc.getSections().get(0);
      //创建一个 TextWatermark 实例
      TextWatermark txtWatermark = new TextWatermark();
      //设置文本水印格式
      txtWatermark.setText(waterText);
      txtWatermark.setFontSize(40);
      txtWatermark.setColor(Color.red);
      txtWatermark.setLayout(WatermarkLayout.Diagonal);
      //将文本水印添加到示例文档
      section.getDocument().setWatermark(txtWatermark);
      return doc;
  }
  
  /**
  * 添加多行文本水印
  * 
  * @param sourcePath 源文件
  * @param targetPath 目标文件
  * @param waterText 水印文字
  */
  public static void addMutiTextWatermark(String sourcePath, String targetPath, String waterText) {
      Document doc = addMutiTextWatermark(sourcePath, waterText);
      doc.saveToFile(targetPath, FileFormat.Docx);
      doc.close();
  }
  
  /**
  * 添加多行文本水印
  * 
  * @param sourcePath 源文件
  * @param outputStream 输出流
  * @param waterText 水印文字
  */
  public static void addMutiTextWatermarkToStream(String sourcePath, OutputStream outputStream, String waterText) {
      Document doc = addMutiTextWatermark(sourcePath, waterText);
      doc.saveToStream(outputStream, FileFormat.Docx);
      doc.close();
  }
  
  private static Document addMutiTextWatermark(String sourcePath, String waterText) {
      Document doc = new Document();
      doc.loadFromFile(sourcePath);
      //添加艺术字并设置大小
      ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
      shape.setWidth(waterText.length() * 27);
      shape.setHeight(20);
      //设置艺术字文本内容、位置及样式
      shape.setVerticalPosition(30);
      shape.setHorizontalPosition(20);
      shape.setRotation(315);
      shape.getWordArt().setFontFamily("宋体");
      shape.getWordArt().setText(waterText);
      shape.setFillColor(Color.red);
      shape.setLineStyle(ShapeLineStyle.Single);
      shape.setStrokeColor(new Color(192, 192, 192, 255));
      shape.setStrokeWeight(1);

      Section section;
      HeaderFooter header;
      for (int n = 0; n < doc.getSections().getCount(); n++) {
          section = doc.getSections().get(n);
          //获取section的页眉
          header = section.getHeadersFooters().getHeader();
          Paragraph paragraph;

          if (header.getParagraphs().getCount() > 0) {
              //如果页眉有段落,取它第一个段落
              paragraph = header.getParagraphs().get(0);
          } else {
              //否则新增加一个段落到页眉
              paragraph = header.addParagraph();
          }
          for (int i = 0; i < 4; i++) {
              for (int j = 0; j < 3; j++) {
                  //复制艺术字并设置多行多列位置
                  shape = (ShapeObject) shape.deepClone();
                  shape.setVerticalPosition(120 + 150 * i);
                  shape.setHorizontalPosition(160 * j);
                  paragraph.getChildObjects().add(shape);
              }
          }
      }
      return doc;
  }
}

# 三. Pdf 添加水印

下面介绍如何为PDF文档添加水印(文字、图片)。

# 1. 添加依赖

<dependency>
    <groupId>com.risun</groupId>
    <artifactId>spire-pdf-free</artifactId>
    <version>5.1.0</version>
</dependency>

# 2. 工具类


PdfWaterMarkUtil.java
package org.dante.springboot.word2pdf.aspose;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfTilingBrush;
import com.spire.pdf.widget.PdfPageCollection;

/**
 * PDF 添加水印工具类
 * 
 * @author dante
 *
 */
public class PdfWaterMarkUtil {

    private static final String TXT = "txt";
    private static final String IMG = "img";

    /**
    * 添加文字水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addTextWatermark(String sourcePath, String targetPath, String watermark) {
        PdfDocument pdf = addWatermark(sourcePath, TXT, watermark);
        pdf.saveToFile(targetPath);
        pdf.close();
    }

    /**
    * 添加文字水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addTextWatermarkToStream(String sourcePath, OutputStream outputStream, String watermark) {
        PdfDocument pdf = addWatermark(sourcePath, TXT, watermark);
        pdf.saveToStream(outputStream);
        pdf.close();
    }

    /**
    * 添加文字水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addMultiTextWatermark(String sourcePath, String targetPath, String watermark) {
        PdfDocument pdf = addMultiWatermark(sourcePath, TXT, watermark);
        pdf.saveToFile(targetPath);
        pdf.dispose();
    }

    /**
    * 添加文字水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addMultiTextWatermarkToStream(String sourcePath, OutputStream outputStream, String watermark) {
        PdfDocument pdf = addMultiWatermark(sourcePath, TXT, watermark);
        pdf.saveToStream(outputStream);
        pdf.dispose();
    }

    /**
    * 添加图片水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addImageWatermark(String sourcePath, String targetPath, String imageWatermarkPath) {
        PdfDocument pdf = addWatermark(sourcePath, IMG, imageWatermarkPath);
        pdf.saveToFile(targetPath);
        pdf.close();
    }

    /**
    * 添加图片水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addMultiImageWatermark(String sourcePath, String targetPath, String imageWatermarkPath) {
        PdfDocument pdf = addMultiWatermark(sourcePath, IMG, imageWatermarkPath);
        pdf.saveToFile(targetPath);
        pdf.dispose();
    }

    /**
    * 添加图片水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addImageWatermarkToStream(String sourcePath, OutputStream outputStream,
        String imageWatermarkPath) {
        PdfDocument pdf = addWatermark(sourcePath, IMG, imageWatermarkPath);
        pdf.saveToStream(outputStream);
        pdf.close();
    }

    /**
    * 添加图片水印
    * 
    * @param sourcePath
    * @param targetPath
    * @param watermark
    */
    public static void addMultiImageWatermarkToStream(String sourcePath, OutputStream outputStream,
        String imageWatermarkPath) {
        PdfDocument pdf = addMultiWatermark(sourcePath, IMG, imageWatermarkPath);
        pdf.saveToStream(outputStream);
        pdf.dispose();
    }

    static PdfDocument addWatermark(String sourcePath, String type, String watermark) {
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile(sourcePath);
        PdfPageCollection pages = pdf.getPages();
        BufferedImage imageWatermark = null;
        if (TXT.equals(type)) {
            imageWatermark = txt2Image(watermark, 100);
        }

        for (Object pageObj : pages) {
            PdfPageBase page = (PdfPageBase) pageObj;
            if (TXT.equals(type)) {
              page.setBackgroundImage(imageWatermark);
            } else {
              page.setBackgroundImage(watermark);
            }
            // 设置背景区域
            Rectangle2D.Float rect = new Rectangle2D.Float();
            rect.setRect(280, 300, 150, 150);
            page.setBackgroundRegion(rect);
        }
        return pdf;
    }

    static PdfDocument addMultiWatermark(String sourcePath, String type, String watermark) {
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile(sourcePath);
        BufferedImage imageWatermark = null;
        if (TXT.equals(type)) {
            imageWatermark = txt2Image(watermark, 50);
        }
        for (int i = 0; i < pdf.getPages().getCount(); i++) {
            PdfPageBase page = pdf.getPages().get(i);

            Dimension2D dimension2D = new Dimension();
            dimension2D.setSize(page.getCanvas().getSize().getWidth() / 3, page.getCanvas().getSize().getHeight() / 3);

            PdfTilingBrush brush = new PdfTilingBrush(dimension2D);
            brush.getGraphics().setTransparency(0.2f);
            brush.getGraphics().translateTransform(brush.getSize().getWidth() / 10, brush.getSize().getHeight() / 10);
            brush.getGraphics().rotateTransform(30);

            PdfImage image = null;
            if (TXT.equals(type)) {
              image = PdfImage.fromImage(imageWatermark);
            } else {
              image = PdfImage.fromImage(watermark);
            }
            brush.getGraphics().drawImage(image, brush.getSize().getWidth() - image.getWidth() / 2,
                (brush.getSize().getHeight()) / 2);

            Rectangle2D rectangle2D = new Rectangle2D.Float();
            rectangle2D.setFrame(new Point(0, 0), page.getCanvas().getClientSize());
            page.getCanvas().drawRectangle(brush, rectangle2D);
        }
        return pdf;
    }

    /**
    * 文字转换成图片
    * 
    * @param str
    * @param font
    * @param height
    * @return
    * @throws Exception
    */
    static BufferedImage txt2Image(String str, Integer height) {
        Integer width = str.length() * 40;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Font font = new Font("宋体", Font.PLAIN, 32);
        Graphics g = image.getGraphics();
        g.setClip(0, 0, width, height);
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);// 先用黑色填充整张图片,也就是背景
        g.setColor(Color.black);// 在换成黑色
        g.setFont(font);// 设置画笔字体
        /** 用于获得垂直居中y */
        Rectangle clip = g.getClipBounds();
        FontMetrics fm = g.getFontMetrics(font);
        int ascent = fm.getAscent();
        int descent = fm.getDescent();
        int y = (clip.height - (ascent + descent)) / 2 + ascent;
        for (int i = 0; i < 6; i++) {// 256 340 0 680
          g.drawString(str, i * 680, y);// 画出字符串
        }
        g.dispose();
        return image;
    }
}

# 四. Excel添加水印

Excel添加水印,请参考示例。

工作流
消息提醒

← 工作流 消息提醒→

最近更新
01
vue问题记录
10-11
02
RSP进度
10-09
03
贡献度
09-28
更多文章>
Copyright © 2014-2025 甘肃睿阳科技有限公司 陇ICP备15001783-1号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式