前言:
最近需要一个功能,将word文件转换为pdf格式,并在中间加入水印信息,因aspose.word源码是加密的,看起来比较费劲,官方api也是不很友好,故特此记录。
附:https://reference.aspose.com/words/java/
第一步:
引入依赖
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<vresion>18.1</vresion>
</dependency>
第二步:
添加一个水印到文档中,并保存为pdf格式
@Test
public void testWord2PdfWithWaterMark() throws FileNotFoundException {
File file = new File("C:\\Users\\dell\\Desktop\\aaa.docx");
String targetPath = "C:\\Users\\dell\\Desktop\\test";
File targetFile = new File(targetPath);
if (!targetFile.exists()) {
targetFile.mkdir();
}
FileOutputStream outputStream = new FileOutputStream(targetPath + File.separator + "bbb.docx");
try (FileInputStream inputStream = new FileInputStream(file)) {
Document doc = new Document(inputStream);
InsertWatermarkText(doc, "你好啊");
//InsertWaterMarks(doc, "你好啊");
doc.save(outputStream, SaveFormat.DOCX);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
接下来就是具体的实现了:
/**
* 插入水印
* @param doc
* @param watermarkText
* @throws Exception
*/
private static void InsertWatermarkText(Document doc, String watermarkText) throws Exception {
Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
watermark.getTextPath().setText(watermarkText);
//设置水印样式
watermark.getTextPath().setFontFamily("Arial");//设置字体
watermark.setRotation(-40);//设置偏移角度
watermark.setHeight(100);//水印高度
watermark.setWidth(200);//水印宽度
watermark.setFillColor(Color.gray);//设置填充颜色
watermark.setStrokeColor(Color.gray);//设置描边颜色
//官方api给的解释 太官方了 (只插入一条水印 默认为这些数据)
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);//指定相对于水平放置的位置
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);//指定相对于形状垂直定位的位置
watermark.setWrapType(WrapType.TOP_BOTTOM);//定义水印的环绕模式
watermark.setVerticalAlignment(VerticalAlignment.CENTER);// 指定形状垂直放置的方式
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);// 指定形状如何水平放置
Paragraph watermarkPara = new Paragraph(doc);
watermarkPara.appendChild(watermark);
/*String text = watermarkPara.getText();
System.out.println("++++++++++" + text);
System.out.println("______________" + watermarkPara);
NodeCollection childNodes = watermarkPara.getChildNodes();
String text1 = childNodes.get(0).getText();
System.out.println("111111" + text);*/
for (Section section : doc.getSections()) {
InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_PRIMARY);
InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_FIRST);
InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_EVEN);
}
}
/**
* 将水印插入图像头部
* @param watermarkPara
* @param section
* @param headerType
*/
private static void InsertWatermarkIntoHeader(Paragraph watermarkPara, Section section, int headerType) {
HeaderFooterCollection headerFooters = section.getHeadersFooters();
HeaderFooter footer = headerFooters.getByHeaderFooterType(headerType);
if (footer == null) {
footer = new HeaderFooter(section.getDocument(), headerType);
section.getHeadersFooters().add(footer);
}
footer.appendChild(watermarkPara.deepClone(true));
}
第三步:
插入多个水印实现
/**
* 插入多个水印
*
* @param doc
* @param waterMark
* @throws Exception
*/
public static void InsertWaterMarks(Document doc, String waterMark) throws Exception {
Paragraph watermarkPara = new Paragraph(doc);
for (int j = 0; j < 500; j = j + 100) {
for (int i = 0; i < 700; i = i + 85) {
Shape waterShape = ShapeMore(doc, "—"+waterMark + "—", j, i);
watermarkPara.appendChild(waterShape);
}
}
String text = watermarkPara.getText();
System.out.println("++++++++++" + text);
System.out.println("______________" + watermarkPara);
NodeCollection childNodes = watermarkPara.getChildNodes();
String text1 = childNodes.get(0).getText();
System.out.println("111111" + text1);
/* Shape waterShape = ShapeMore(mdoc, wmText, 155, 300);
watermarkPara.appendChild(waterShape);*/
for (Section sect : doc.getSections()) {
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
}
}
多个水印处理
/**
* 设置水印属性
*
* @param doc
* @param waterMark
* @param left
* @param top
* @return
* @throws Exception
*/
public static Shape ShapeMore(Document doc, String waterMark, double left, double top) throws Exception {
Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
// Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
// Shape waterShape = new Shape(doc, ShapeType.IMAGE);
// waterShape.getImageData().setImage(wmText);
waterShape.getTextPath().setText(waterMark);
waterShape.getTextPath().setFontFamily("Arial");
waterShape.setWidth(40);
waterShape.setHeight(13);
waterShape.setRotation(-40);
waterShape.setFilled(true);
waterShape.getFill().setColor(Color.RED);
waterShape.setStrokeColor(Color.RED);
// waterShape.setStrokeColor(new Color(210,210,210));
//将水印放置在页面中心
waterShape.setLeft(left);
waterShape.setTop(top);
// //设置垂直对齐
// waterShape.setVerticalAlignment(VerticalAlignment.CENTER);
// //设置文本水平对齐方式
// waterShape.setHorizontalAlignment(HorizontalAlignment.CENTER);
//设置包装类型
waterShape.setWrapType(WrapType.NONE);
return waterShape;
}
效果展示:
具体样式可以自己调,比如颜色字体,水印一行个数,水印环绕格式等