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添加水印,请参考示例。