Aspose实现文件转PDF在线预览及水印功能

文件转换及在线预览

因为项目是做OA这一块,有很多附件需要实现在线预览附件,在网上也看了很多相关的资料。主要实现方式就是 (openoffice+swftools+flexpaper)和(aspose+pdfjs预览)。

主要步骤:

1.需要先将文档转换为PDF文件。
2.用pdfjs预览PDF文件

转换步骤:

* 使用OpenOffice/Aspose 将ppt、word、excel、txt类型的文件转换为pdf

预览步骤:

* 高版本浏览器上,使用pdf.js直接预览PDF文件
* 低版本浏览器上,使用swftools将PDF文件转换为swf文件,再使用flexpaper预览swf(没有做这个步骤)

组件安装:

Aspose
由于OpenOffice的转换效果并不太佳,这里选择了Aspose
在Aspose官网下载Aspose的Java版本,主要选择
* Aspose.words
* Aspose.cells(Excel)
* Aspose.slides(PPT)
* Aspose.pdf
下载完成后,在工程中引用jar包即可。

功能实现:

这里采用的所有组件版本为:
名称 版本
Aspose.words 16.8.0
Aspose.cells 9.0.0
Aspose.slides 116.7.0
Aspose.pdf 11.8.0
文档转换为PDF

使用Aspose进行文档转换很简单,直接引入相应的jar包,调用save方法,转换为PDF即可。

注意:

  1. 使用Aspose时,每一个模块(words,cells)都可能有相同的类,如License类,SaveOptions类,SaveFormat类。而在各自模块使用时,一定要用对应模块的类,这个坑我已爬过。
    使用Aspose时,需要每次进行转换操作前调用设置License方法。

水印功能
编辑卡片描述
部署Aspose附件转换服务,该服务主要功能是将系统中所有附件(格式为word、EXCEL、PPT、PDF)转换为H5页面,类似百度文库查看word附件的效果,转换的文件后,在系统打开附件时,呈现的效果就是在线阅览并且带有水印的模式

水印功能

Aspose.words之插入水印

1. 前言

继几个月前的word模板打印美化之后,最近又接到的一个需求是需要给由word转换为的pdf打上水印。经过几个小时的折腾发现直接在pdf打上的水印将下面的字体覆盖效果过于明显,试图插入背景图片又发现会被pdf自身的背景色给遮挡。无奈只能从源头的word入手。

2. 详解

以下就是核心代码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**  
* Inserts a watermark into a document. you need saved the doc by yourself.
*
* @param doc The input document file.
* @param watermarkText Text of the watermark.
*/
public static void insertWatermarkText(Document doc, String watermarkText) {
// 居中
insertWatermarkText(doc, watermarkText, new Function<Shape, Object>() {
@Override
public Object apply(Shape watermark) {
// Place the watermark in the page center.
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.setWrapType(WrapType.NONE); // TOP_BOTTOM : 将所设置位置的内容往上下顶出去
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);

return null;
}
});
// 顶部
insertWatermarkText(doc, watermarkText, new Function<Shape, Object>() {
@Override
public Object apply(Shape watermark) {
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.MARGIN);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.MARGIN);
watermark.setWrapType(WrapType.NONE);
// 我们需要自定义距离顶部的高度
// watermark.setVerticalAlignment(VerticalAlignment.TOP);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置距离顶部的高度
watermark.setTop(160);

return null;
}
});
// 底部
insertWatermarkText(doc, watermarkText, new Function<Shape, Object>() {
@Override
public Object apply(Shape watermark) {
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.MARGIN);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.MARGIN);
watermark.setWrapType(WrapType.NONE);
// 我们需要自定义距离顶部的高度
// watermark.setVerticalAlignment(VerticalAlignment.BOTTOM);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置距离顶部的高度
watermark.setTop(480);

return null;
}
});
}

private static void insertWatermarkText(Document doc, String watermarkText,
Function<Shape, Object> watermaskPositionConfigFunc) {
// Create a watermark shape. This will be a WordArt shape.
// You are free to try other shape types as watermarks.
Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
// Set up the text of the watermark.
watermark.getTextPath().setText(watermarkText);


// Set up the text of the watermark.
// 这里设置为宋体可以保证在转换为PDF时中文不是乱码.
watermark.getTextPath().setFontFamily("宋体");//Arial;
try {
// 水印大小
watermark.setWidth(200);
watermark.setHeight(50);
} catch (Exception e) {
throw new RuntimeException(e);
}
// Text will be directed from the bottom-left to the top-right corner.
// 左下到右上
watermark.setRotation(-40);

// Remove the following two lines if you need a solid black text.
final String colorStr = "E0E0E0";
watermark.getFill().setColor(new java.awt.Color(Integer.parseInt(colorStr, 16))); // Try Color.lightGray to get more Word-style watermark
watermark.setStrokeColor(new java.awt.Color(Integer.parseInt(colorStr, 16))); // Try Color.lightGray to get more Word-style watermark

// Place the watermark in the special location of page .
watermaskPositionConfigFunc.apply(watermark);

// Create a new paragraph and append the watermark to this paragraph.
Paragraph watermarkPara = new Paragraph(doc);
watermarkPara.appendChild(watermark);

// Insert the watermark into all headers of each document section.
for (Section sect : doc.getSections()) {
// There could be up to three different headers in each section, since we want
// the watermark to appear on all pages, insert into all headers.
insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
// 以下注释掉不影响效果, 未作深入研究, 时间有限.
// insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
// insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
}
// 参考下API : https://apireference.aspose.com/java/words/com.aspose.words/ShapeBase
//watermark.setZOrder(-100);
}

private static void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect,
int headerType) {
HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);

if (header == null) {
// There is no header of the specified type in the current section, create it.
header = new HeaderFooter(sect.getDocument(), headerType);
sect.getHeadersFooters().add(header);
}

// Insert a clone of the watermark into the header.
try {
header.appendChild(watermarkPara.deepClone(true));
} catch (Exception e) {
throw new RuntimeException(e);
}
}

4. 效果