针对java转pdf有很多中方法,而且实现方式也各种各样。有的实现起来很麻烦,也不知道是不是因为其实现过程中的方法是通用方法,然后看起来有点费劲。而且有些也有各自的局限(比如添加字体到系统或者只针对docx格式并不适用doc格式又或者要系统中要装office)。下面我主要介绍几种我尝试过的方法,都是简单的小白级操作。本文只针对word转pdf,即单纯预览功能,并不适用word转html再转pdf,个人感觉功能点已经具有针对性,就没有必要再弄那么复杂,如果有其他的需求则可以考虑这种两次转换的方式。
第一种 aspose.word进行转换(doc和docx都可以)
首先下好aspose.word(下载地址:提取码: i51v :不保证长期有效)aspose-words-15.8.0-jdk16.jar,网上搜下应该能找到,而且看了下,貌似相似的版本也是可以用的,直接搜一个maven仓库也能找到jar包下载(参考文章)。
1.如果是普通的工程直接添加到项目中目录下,右键Build Path->Add to Build Path。添加到项目中。
2.如果是maven工程,如果自己找到的maven版本能用就最好,不能用的话就用我下载地址提供的也可以,直接再CMD下运行下面的命令添加jar包到maven的本地仓库。(记得替换为自己的版本)
mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar
添加到本地仓库后pom里面添加
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
</dependency>
至此,jar包已经准备好,剩下的就是运行代码。
简化版本:
try {
String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
License license = new License();
license.setLicense(is);
com.aspose.words.Document document = new com.aspose.words.Document("替换为你的输入word文档绝对位置.doc");
document.save(new FileOutputStream(new File("替换为你的输出pdf文档绝对位置.pdf");
} catch (Exception e) {
e.printStackTrace();
}
以上代码直接添加到main函数就可以运行的,也可以添加到具体的函数或者单独抽取成一个方法。缺少的包都引入aspose.words的。以上代码相当于是加载了license,字符串s中的可以单独复制出来转化成一个license.xml,然后用代码加载,此处就不作详细描述(有简单的为毛要用复杂的)。
至此第一种方法已经算是说完了,最后评价一下优缺点。优点:doc和docx文档都能转化为pdf,并且使用方法简单且有效。缺点:不知道license是否是有有效期,所以最好还是用稍微低版本的,至少我测试的这个版本是没有问题的。
第二种 POI操作进行word转pdf(仅适用docx格式)
第一步操作还是引入包,至于具体的包就不给下载链接了,我给了maven依赖,直接去maven仓库里下载就可以了
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
<version>1.0.6</version>
</dependency>
执行转化过程的代码(有环境的话直接放函数中运行就可以,或者单独抽成一个函数也可以)
XWPFDocument doc = new XWPFDocument(new FileInputStream("替换为你的输出docx路径.docx");// docx
PdfOptions options = PdfOptions.create();
// 中文字体处理
options.fontProvider(new IFontProvider() {
@Override
public Font getFont(String familyName, String encoding, float size, int style, java.awt.Color color) {
try {
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 12, style, color);
if (familyName != null)
fontChinese.setFamily(familyName);
return fontChinese;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
});
PdfConverter.getInstance().convert(doc, new FileOutputStream("替换为你的输出pdf路径.pdf"), options);// pdf
此时写完运行代码还不行,可能会报空指针错误什么的。原因是我们还没有加字体,我的解决办法是去maven仓库下载itext-asian,解压jar包中字体资源文件添加到resources下面(即将整个com包里面的字体都添加到resources下)。可能还有其他的方法,但是我用的这个可行,并且我再maven的pom文件中添加了itext-asian去运行,却没有用,但是把资源文件解压出来放到对应文件夹下倒是可以用。
此时运行代码应该就可以成功了,最后评价一下这种方式的优缺点。优点:不依赖付费第三方,安全又保障。缺点:只能转换docx,不能转换doc。
第三种 使用spire.doc(有水印,doc和docx都可以)
打开上面的网址,安装和使用都说的挺明白的,但是我却没有从远程仓库下到自己本地来,原因我也搜了好久,但是没有解决。最后还是从他们的仓库直接下载的。他们官网给出的远程仓库地址可以直接用浏览器打开。
http://repo.e-iceblue.com/nexus/content/groups/public/
打开后可以直接查看相关jar包。官网提供的免费版本spire.doc.free我用了下,只能转换三页,好像网上说免费版的操作只能三页,而且第四页就是他们自己的宣传。我们如果通过maven下载不了对应的jar可以浏览器下载。而且更加直观的看到对应的版本。
下完之后可以通过上面第一种方法说到的CMD命令把jar包导到我们本地的仓库就可以使用了。不要使用免费版本,虽然都有水印,不是免费版的能操作全部pdf页面。然后按照他们API操作就可以了(链接)
Document doc = new Document();
doc.loadFromFile("你的输入doc、docx文档地址.doc");
doc.saveToFile("你的输出pdf地址.pdf", FileFormat.PDF);
doc.close();
这种方法的优缺点也很明显了。优点:操作简单,代码简单,简直不能再简单了。缺点,有水印,但是感觉个人用起来还能接受。而且好像样式什么的保持的也还不错。