Windows和Linux平台上实现Word转PDF

  • 前言
  • Windows平台Word转PDF
  • Linux平台Word转PDF
  • 参考文献

前言

调研后发现网上有很多解决办法,Windows平台上word和PDF可以完美的转换,但大部分业务是要求在Linux上运行的,基于Windows的方法无法移植到Linux上运行,现有的Linux上的Word文档转换为PDF的方法验证后大多数存在PDF和Word格式不一致的问题(比如PDF与Word排版页数不一致,文字排列更紧凑等),所以本文的主要目标是解决Linux平台上Word转为PDF之后的格式版面不一致的问题,先放结论,对于大部分测试用例文档格式在转换后基本一致,存在少部分不一致的问题。并且将java项目打包成jar包并在linux平台上调用命令行测试通过。

Windows平台Word转PDF

import win32com  # python -m pip install pypiwin32
from win32com.client import Dispatch
import sysdef word2pdf(file_path='/documents/4-科园商务会议服务协议_20191105广州.doc'):word = Dispatch('Word.Application')word.Visible = 0 # 后台运行,不显示word.DisplayAlerts = 0  #不警告path = sys.path[0] + file_pathdoc = word.Documents.Open(FileName=path, Encoding='gbk')doc.SaveAs(path[:-5]+'_pdfed.pdf', 17) #  txt=4, html=10, docx=16, pdf=17doc.Close()word.Quit()print("Word2Pdf 转换完成,PDF文件和Word在同级目录中。")if __name__ == '__main__':# word2pdf('/documents/1-技术服务合同.docx')file_path = sys.argv[1]print(file_path)word2pdf(file_path)

win32com只能在windows平台上运行,linux上没有类似的依赖包。

Linux平台Word转PDF

1.基于unoconv工具实现word转为PDF
安装:yum install unoconv
使用:unoconv -f pdf XXX.docx

2.使用cups-pdf工具实现word转PDF
安装:sudo apt-get install cups-pdf
使用:oowriter -convert-to pdf:writer_pdf_Export XXX.docx

3.使用libreoffice测试:
soffice --headless --invisible --convert-to pdf XXX.docx

4.使用apose-words-15.8.0工具hacked(pojie)版,java编程实现word转PDF。(推荐,目前验证该方法Word转为PDF后格式变化最小)

Eclipse项目目录结构:(文末有完整项目源代码和打包的jar包,jar包测试可以直接调用)

【出现的问题记录】打成jar包后只能把jar包和待转换的word文档放在同一个目录下,并且生成的目录也只能放在同一个目录下,这和Java中getResourceAsStream的用法有关系:

getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
引用自:https://www.iteye.com/blog/riddickbryant-436693

【已解决,封装jar包后读取项目目录外的文件】
之前打开word的文件的方法是利用getResourceAsStream:
file_path = "C:\\Users\\16616\\Desktop\\XXX.docx";
word = TestWord.class.getClassLoader().getResourceAsStream(file_path);
Document doc = new Document(word);
现在直接用new Document打开:
Document doc = new Document(file_path);

最后是源代码:

package com.demo;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.stream.Stream;import com.aspose.words.Document;
import com.aspose.words.FileFormatUtil;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;/*** * 由于ASPOSE比较吃内存,操作大一点的文件就会堆溢出,所以请先设置好java虚拟机参数:-Xms512m -Xmx512m(参考值)<br>* 如有疑问,请在CSDN下载界面留言,或者联系QQ569925980<br>* * @author Spark**/
public class TestWord {private static InputStream license;private static InputStream word;/*** 获取license* * @return*/public static boolean getLicense() {boolean result = false;try {license = TestWord.class.getClassLoader().getResourceAsStream("license.xml");// license路径
//            word = TestWord.class.getClassLoader().getResourceAsStream("\\4-广州.doc");License aposeLic = new License();aposeLic.setLicense(license);result = true;} catch (Exception e) {e.printStackTrace();}return result;}public static void word2pdf(String file_path,String save_path) {//      word = TestWord.class.getClassLoader().getResourceAsStream("\\XXX.doc");// 原始word路径word = TestWord.class.getClassLoader().getResourceAsStream(file_path);// 验证Licenseif (!getLicense()) {return;}try {long old = System.currentTimeMillis();
//            Document doc = new Document(word);Document doc = new Document(file_path);
//            File file = new File("C:\\Users\\16616\\Desktop\\AsposeWord\\src\\test.pdf");// 输出路径//存为新PDF文件,文件名需要从file_path中提取出来File tempFile =new File(file_path.trim());String fileName = tempFile.getName();System.out.println("fileName = " + fileName);String[] tmp = fileName.split("\\.");String pdf_name = tmp[0]+".pdf";System.out.println("pdfName = "+ pdf_name);File file = new File(save_path+"/"+pdf_name);FileOutputStream fileOS = new FileOutputStream(file);doc.save(fileOS, SaveFormat.PDF);long now = System.currentTimeMillis();System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒\n\n" + "文件保存在:" + file.getPath());} catch (Exception e) {e.printStackTrace();}}/*** * @param args*/public static void main(String[] args) {String file_path = args[0];String save_path = args[1];word2pdf(file_path,save_path);//       word2pdf("C:\\Users\\16616\\Desktop\\XXX.docx","C:/Users/16616/Desktop");}
}

将含有第三方jar包的Java项目打包,并且使用命令行进行jar包的传参调用:
1.首先,Eclipse将已经含有第三方jar包的项目打包的方法:
File/Export…然后Java/Runnable JAR file,然后选要运行的有main()的类,选extract required libraries into generated JAR

2.找到打包后的文件,将待转换的word文件放到jar包的同级目录下,如果想要将转换后的PDF文件放到word文件的同级:

命令行调用jar包方法:
java -jar word2pdf.jar [路径下的word文件名][PDF目标路径]
最后会在该文件夹下生成一个pdfed.pdf文件。

:如何命令行传参调用java项目(或在bat文件中调用)

  1、无参打开jar包所在目录,输入 java -jar xxx.jar2、有参打开jar包所在目录   输入  java -jar xxx.jar 参数1 参数2 ……(参数间用空格隔开)对应main函数中的:public static void main(String[] args) {      String sourcePath = args[0];// 参数1 String targetPath = args[1];// 参数2 }

项目的源代码jar包以及使用方法已经放在了公众号下,后台回复关键词【word2pdf】即可获取。

参考文献

[1] how-to-convert-word-doc-to-pdf-in-linux
[2] 将java项目导出为jar包+导出第三方jar包+使用命令行调用+传参
[3] aspose-words-15.8.0 完美解决word转pdf
[4] 怎样把引用的jar包和本项目一起导出成jar文件

Windows和Linux平台上实现Word转PDF相关推荐

  1. MySQL在Windows和Linux平台上多版本多实例安装配置方法(5.5、5.6、5.7、8.0)

    MySQL在Windows和Linux平台上多版本多实例安装配置方法(5.5.5.6.5.7.8.0) Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 参考: http:// ...

  2. 关于《在Windows与.NET平台上的持续交付实践》的问答录

    <在Windows与.NET平台上的持续交付实践>(Continuous Delivery with Windows and .Net)(免费下载)是由Matthew Skelton与Ch ...

  3. GNU/Linux平台上正则表达式的简单使用

    友情提醒:本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux,GNU/grep简称为grep,GNU/sed简称为sed,GNU/gawk简称为awk ...

  4. 用C读取INI配置文件 (可在linux平台上用)

    /*c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux ...

  5. Linux平台上的音视频互动开发平台

    由于使用习惯,Linux在中国受欢迎程度远不如windows,相应的软件也比较少,尤其是音视频类的软件,但是,这并不代表就完全没有.下面介绍一款强大的音视频即时通讯平台给大家,它就是--Anychat ...

  6. 【DG】在Linux平台上搭建单实例的dataguard--duplicate

    [DG]在Linux平台上搭建单实例的dataguard--duplicate 一 : 实验环境介绍 *** 鉴于生产环境均采用 64 位系统和数据库软件,本实验也将采用这个标准 *** 采用vmwa ...

  7. Linux平台上直接运行Android应用,手机移动开发技术

    选择安装/卸载 当然选择同意了 下一步 下一步 很快安装成功 安装体验和大多数Windows平台的应用一致. 不过最好安装之前更新一下系统,不然安装过程中也会执行的,偶尔还会出错. ####安装过程中 ...

  8. linux架构接口层教程,在LINUX平台上进行成功实现RIL层功能和框架层应用

    1.课题研究的背景和意义 1.1 Android RIL简介 Android RIL(Radio Interface Layer)提供了无线基带Modem与电话应用之间的抽象层.在Android RI ...

  9. (转)Thrift在Windows及Linux平台下的安装和使用示例

    转载自Thrift在Windows及Linux平台下的安装和使用示例 thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的RPC(远程服务调用)框架 ...

  10. 如何在linux上创建数据库,在LINUX平台上手动创建数据库(oracle 10g)

    在LINUX平台上手动创建数据库(oracle 10g) 安装完oracle软件后,不使用dbca创建数据库,而手动创建数据库,主要目的是了解数据库创建的过程中主要进行了那些操作. 1.首先设置要创建 ...

最新文章

  1. python sql in list
  2. LaTeX 笔记:NFSS 那点事儿
  3. 全球增长最快域名解析商Top10:DNSPod新网上榜
  4. dbus-glib-0.108 arm交叉编译
  5. 纯C写Windows程序系列---------VS2010设置纯C环境 .
  6. 管理(1)--- 管理者的基本要求是什么?
  7. 基础服务系列-Hyper-V 安装centos7
  8. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  9. 关于DTC诊断故障码的获取与清除(ISO14229系列之14、19服务)
  10. 火车头采集伪原创插件
  11. win8.1中文版开启远程桌面
  12. 同余方程组,中国剩余定理,孙子定理(学习)
  13. numpy_absolute函数
  14. 周浩正:写给编辑人的信 编务报告书 一个实例
  15. 互金协会:各相关机构即日起就高息现金贷等违规业务开展自查
  16. 电视为何降价至200元依然没人买?爱奇艺给出了答案
  17. 【高德LBS开源组件大赛】地震来了
  18. EXE Pack ——脱壳
  19. linux下安装网络电视sopcast
  20. PubMed(丁香)英汉词典爬取

热门文章

  1. 如何将Java源代码转换为HTML页面
  2. linux如何进入超级终端,使用telnet和超级终端登录控制Ubuntu
  3. java模拟器配置_JAVA模拟器全功略!
  4. RISC-V_GD32VF103-开发环境搭建和使用
  5. chrome浏览器解除pdf加密
  6. Jersey框架简单实践(一)
  7. 第六章 jQuery 选择器——课后作业:
  8. matlab波导色散,有效折射率法求矩形波导色散曲线(附Matlab程序)
  9. oracle数据库课后报告,ORACLE数据库课程设计报告
  10. java修炼手册下载_Java修炼手册