需求是实现将word转换成pdf在线预览, 试了几种方法发现样式效果最好的是aspose-words
,但是需要破解, 附带了激活方式
两款都是运行在服务器上面的office处理软件, 通过命令行的方式去执行转换命令
下载安装好之后需要在代码中引入jodconverter相关jar包依赖(jodconverter.zip解压后lib下的都需要引入)
相关软件及jar下载链接:https://pan.baidu.com/s/1u0U5jYYAjWRYO7mL5ilD8Q 提取码:8888
// openOffice 和 libreOffice 差不多除了命令不一样
// 1.执行系统命令启动openoffice线程
// 2.连接openoffice服务连接
// 3.执行转换
// window 使用 调用openoffice服务线程
String command = "C:/Program Files (x86)/OpenOffice 4/program/soffice-headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
// Linux使用
// String command = "/opt/openoffice4/program/soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard\"";
Process p = Runtime.getRuntime().exec(command);
// 连接openoffice服务
OpenOfficeConnection connection = new SocketOpenOfficeConnection(
"127.0.0.1", 8100);
connection.connect();
// 转换word到pdf
DocumentConverter converter = new OpenOfficeDocumentConverter(
connection);
converter.convert(new File("/temp/1.doc"), new File("/temp/1.pdf"));
connection.disconnect();
p.destroy();
ps: 试了大部分的word都能转换pdf, 有一些样式复杂的会渲染不出来, 直接把word源码生成pdf
免费版的有页数限制, 我的场景不会有多页的就直接用的免费版本
效果可以参照https://smallpdf.com/cn/word-to-pdf
, https://www.freepdfconvert.com/zh-cn/word-to-pdf
这些在线转换网站,我试了生成的效果和这些网站的一样.
<!-- spire.doc.free 相关依赖 -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
代码相当简单…
import com.spire.doc.*;
public class WordtoPDF {
public static void main(String[] args) {
// 加载word示例文档
Document document = new Document();
document.loadFromFile("D:\\2.doc");
// 保存结果文件
document.saveToFile("D:\\3.pdf");
}
}
ps: 我生成的最后换行不一致, 所以没选用这个
效果可以参照迅捷pdf在线转换器https://app.xunjiepdf.com/pdf2word/
需要引入aspose-words-15.8.0-jdk16.jar
到项目中
链接:https://pan.baidu.com/s/1q06E0wK13dC2ejDbDtdpZQ
提取码:8888
<!-- 下载后放项目lib下通过system引用 -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/aspose-words-15.8.0-jdk16.jar</systemPath>
</dependency>
核心代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
public class WordPdfUtil {
private static boolean license = false;
static {
try {
// license.xml放在src/main/resources文件夹下
InputStream is = WordPdfUtil.class.getClassLoader().getResourceAsStream("license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
license = true;
} catch (Exception e) {
license = false;
e.printStackTrace();
}
}
public static void doc2pdf(String wordPath, String pdfPath) {
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!license) {
System.out.println("License验证不通过...");
return;
}
try {
File file = new File(pdfPath);
FileOutputStream os = new FileOutputStream(file);
Document doc = new Document(wordPath);
// 支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
doc.save(os, SaveFormat.PDF);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
doc2pdf("D:\\3.doc","D:\\5.pdf");
}
}
在src/main/resources文件夹下创建license.xml填充下面内容激活
<?xml version="1.0" encoding="UTF-8" ?>
<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>
github上面找到的一个开源项目, 活跃度比较高也记录一下. 目前试了效果没有aspose-words
好用, 底层是集成的LibreOffice
.
项目地址: https://github.com/kekingcn/kkFileView
支持的类型比较多,后续如果有需求,方便二次开发