背景:工作中用到office文档互转的情况
- Word 转 PDF
- Excel 转 PDF
- Excel 转 图片
普通解决办法:
- 开源软件 libreoffice、openoffice(需要服务器部署)
- 注:此两种方式的使用方式相同,但libreoffice可以通过ip+端口的方式连接使用
终极解决办法:
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","&"]
|
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(); } }
|
后续例子待更新