• 背景:工作中用到office文档互转的情况

    • Word 转 PDF
    • Excel 转 PDF
    • Excel 转 图片
  • 普通解决办法:

    • 开源软件 libreoffice、openoffice(需要服务器部署)
    • 注:此两种方式的使用方式相同,但libreoffice可以通过ip+端口的方式连接使用
  • 终极解决办法:

    • 使用收费软件 Aspose、Spire.Doc等

WORD转PDF

注:此为简单的转换,会出现word中部分内容空白的情况

  • 依赖
1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-Internal</artifactId>
<version>8.2.4</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>8.2.4</version>
</dependency>
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
public static void word2pdf(String source, String target) {

try {
WordprocessingMLPackage pkg = Docx4J.load(new File(source));

Mapper fontMapper = new IdentityPlusMapper();
fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
fontMapper.put("等线", PhysicalFonts.get("SimSun"));
fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));
pkg.setFontMapper(fontMapper);

Docx4J.toPDF(pkg, new FileOutputStream(target));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Docx4JException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

}

EXCEL转PDF

此处记录例子为 通过libreoffice转换

  • linux 安装libreoffice并启动(网上一大堆教程)
  • 贴上本地打包到docker的dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM centos:latest

WORKDIR /libreoffice

ENV TZ=Asia/Shanghai

COPY LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz /libreoffice

RUN tar -xzvf LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz

RUN rm -rf LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz

RUN yum install ./LibreOffice_7.1.7.2_Linux_x86-64_rpm/RPMS/*.rpm

EXPOSE 8100

ENTRYPOINT ["/usr/bin/libreoffice7.1","--headless","--accept='socket,host=0.0.0.0,port=8100;urp;'","--nofirststartwizard","&"]
  • springboot接口
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
public boolean convertFile(){
File inputFile = new File("C:\\Users\\1234\\Desktop\\测试ppt.pptx");
File outputFile = new File("C:\\Users\\1234\\Desktop\\文件测试.pdf");

//获取连接
SocketOpenOfficeConnection connection = new SocketOpenOfficeConnection("192.168.0.105", 8100);
try {
connection.connect();
System.out.println("连接成功");
} catch (java.net.ConnectException e) {
System.out.println("连接失败");
e.printStackTrace();
}
StreamOpenOfficeDocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);

try{
converter.convert(inputExcel, outputPdf);
System.out.println("转换成功");
return true;
} catch (Exception e) {
System.out.println("转换失败");
e.printStackTrace();
return false;
}finally {
connection.disconnect();
}
}

后续例子待更新