赞
踩
目录
1、POI
POI是Apache下的一个Java类库,可以帮助我们实现Java与各种Office格式文件的互相转换。(不推荐,只能用于文字的文档,如果有图片和表格则会排版错误)
2、Aspose.Words
Aspose.Words for Java是一个原生库,为开发人员提供了丰富的功能来创建、编辑和转换 Word、PDF、Web 文档,而无需在系统上安装 Microsoft Word 环境。这个工具非常好用,maven上有对应的依赖和jar包,但是转换后会有水印,因为他是(收费的)
3、spire.doc.free
Spire.Doc for Java是一个专业的 Word API,它使 Java 应用程序能够创建、转换、操作和打印 Word文档,而无需依赖 Microsoft Word。通过使用这个多功能库,开发人员可以轻松处理大量任务,例如插入图像、超链接、 数字签名、书签和水印、设置页眉和页脚、创建表格、设置背景图像以及添加脚注和尾注。这个跟aspose功能感觉有点差不多,也很好用,但是收费比对还是aspose更好用,而且这个也是收费的
4、documents4j
官网:https://documents4j.com/#/GitHub:https://github.com/documents4j/documents4j
documents4j 是一个跨平台的文档转换库,并且可以在 Linux 上进行 Word 转 PDF 的操作。这个比较推荐,开源而且转换后也不会有格式错误(推荐)
注意Windows和linux系统的代码不一样
1.导入依赖,本地必须要有wps或者微软的office
- <!--word转换为PDF文档-->
- <dependency>
- <groupId>com.documents4j</groupId>
- <artifactId>documents4j-local</artifactId>
- <version>1.0.3</version>
- </dependency>
- <dependency>
- <groupId>com.documents4j</groupId>
- <artifactId>documents4j-transformer-msoffice-word</artifactId>
- <version>1.0.3</version>
- </dependency>
2.编写转换代码(这里我都是传入input输出output然后根据流自己操作)
- package com.daysuns.dmas.module.testReportwd.util;
- import com.documents4j.api.DocumentType;
- import com.documents4j.api.IConverter;
- import com.documents4j.job.LocalConverter;
- import lombok.extern.slf4j.Slf4j;
-
- import java.io.*;
- import java.nio.file.Files;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.nio.file.StandardCopyOption;
-
- @Slf4j
- public class Documents4jUtil {
-
- /**
- * word转pdf
- *
- */
- public static void convertWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
- String os = System.getProperty("os.name").toLowerCase();
- log.info("convertWordToPdf 当前操作系统:{}", os);
- if (os.contains("win")) {
- // Windows操作系统
- windowsWordToPdf(stream,sourceOutput);
- } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
- // Unix/Linux/Mac操作系统
- linuxWordToPdf(stream,sourceOutput);
- } else {
- // 未知操作系统
- throw new RuntimeException("不支持当前操作系统转换文档。");
- }
- }
-
- /**
- * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
- *
- */
- public static void windowsWordToPdf(InputStream stream, ByteArrayOutputStream sourceOutput) {
- try{
- IConverter converter = LocalConverter.builder().build();
- converter.convert(stream)
- .as(DocumentType.DOCX)
- .to(sourceOutput)
- .as(DocumentType.PDF).execute();
- } catch (Exception e) {
- log.error("winWordToPdf windows环境word转换为pdf时出现异常:", e);
- }
- }
-
- /**
- * 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务
- *
- */
- public static void linuxWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
- // 创建临时文件
- File tempFile = createTempFileFromInputStream(stream);
- // 构建LibreOffice的命令行工具命令
- String command = "libreoffice6.4 --headless --invisible --convert-to pdf " + tempFile.getAbsolutePath() + " --outdir " + tempFile.getParent();
- // 执行转换命令
- try {
- if (!executeLinuxCmd(command)) {
- throw new IOException("转换失败");
- }
- readPdfFileToByteArrayOutputStream(tempFile,sourceOutput);
- } catch (Exception e) {
- log.error("ConvertWordToPdf: Linux环境word转换为pdf时出现异常:"+e +tempFile.getPath());
- // 清理临时文件
- tempFile.delete();
- } finally {
- File pdfFile = new File(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
- //清理转换后的pdf文件
- pdfFile.delete();
- // 清理临时文件,无论是否成功转换
- tempFile.delete();
- }
- }
-
- /**
- * 执行命令行
- *
- * @param cmd 命令行
- * @return
- * @throws IOException
- */
- private static boolean executeLinuxCmd(String cmd) throws IOException {
- Process process = Runtime.getRuntime().exec(cmd);
- try {
- process.waitFor();
- } catch (InterruptedException e) {
- log.error("executeLinuxCmd 执行Linux命令异常:", e);
- Thread.currentThread().interrupt();
- return false;
- }
- return true;
- }
-
- /**
- *
- * 创建临时文件
- */
- private static File createTempFileFromInputStream(InputStream inputStream) {
- try {
- File tempFile = File.createTempFile("temp_word", ".docx");
- Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
- return tempFile;
- } catch (IOException e) {
- log.error("创建临时文件失败:", e);
- throw new RuntimeException("创建临时文件失败", e);
- }
- }
-
- /**
- * 读取pdf文件
- */
- private static void readPdfFileToByteArrayOutputStream(File tempFile,ByteArrayOutputStream sourceOutput){
- try {
- Path outputFile = Paths.get(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
- Files.copy(outputFile, sourceOutput);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
linux操作系统要安装libreoffice6,原因是documents4j调用的是office的API
1.在线安装
sudo yum install libreoffice (这里建议安装低版本,高版本要求服务器的很多对应API库版本要求也比较高)
2.离线安装(点击后选择版本下载rpm包,上传至linux系统)
3.解压文件
4.进入两个文件夹安装rpm包
使用安装命令
cd LibreOffice_6.4.2_Linux_x86-64_rpm/RPMS
yum localinstall *.rpm
安装完成查看版本
which libreoffice6.4 --》显示路径说明安装成功
ll /usr/bin/libreoffice6.4 --》得到 "/opt/libreoffice6.4/program/soffice",说明安装到了 "/opt/libreoffice6.4"
5.脚本测试是否可以成功转换
libreoffice --headless --convert-to pdf 1.doc --》去/temp 临时目录查看,也可以指定文件目录导出
6.同样适用上面代码成功转换文档
- package com.daysuns.dmas.module.testReportwd.util;
- import com.documents4j.api.DocumentType;
- import com.documents4j.api.IConverter;
- import com.documents4j.job.LocalConverter;
- import lombok.extern.slf4j.Slf4j;
-
- import java.io.*;
- import java.nio.file.Files;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.nio.file.StandardCopyOption;
-
-
-
- @Slf4j
- public class Documents4jUtil {
-
- /**
- * word转pdf
- *
- */
- public static void convertWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
- String os = System.getProperty("os.name").toLowerCase();
- log.info("convertWordToPdf 当前操作系统:{}", os);
- if (os.contains("win")) {
- // Windows操作系统
- windowsWordToPdf(stream,sourceOutput);
- } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
- // Unix/Linux/Mac操作系统
- linuxWordToPdf(stream,sourceOutput);
- } else {
- // 未知操作系统
- throw new RuntimeException("不支持当前操作系统转换文档。");
- }
- }
-
- /**
- * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
- *
- */
- public static void windowsWordToPdf(InputStream stream, ByteArrayOutputStream sourceOutput) {
- try{
- IConverter converter = LocalConverter.builder().build();
- converter.convert(stream)
- .as(DocumentType.DOCX)
- .to(sourceOutput)
- .as(DocumentType.PDF).execute();
- } catch (Exception e) {
- log.error("winWordToPdf windows环境word转换为pdf时出现异常:", e);
- }
- }
-
- /**
- * 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务
- *
- */
- public static void linuxWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
- // 创建临时文件
- File tempFile = createTempFileFromInputStream(stream);
- // 构建LibreOffice的命令行工具命令
- String command = "libreoffice6.4 --headless --invisible --convert-to pdf " + tempFile.getAbsolutePath() + " --outdir " + tempFile.getParent();
- // 执行转换命令
- try {
- if (!executeLinuxCmd(command)) {
- throw new IOException("转换失败");
- }
- readPdfFileToByteArrayOutputStream(tempFile,sourceOutput);
- } catch (Exception e) {
- log.error("ConvertWordToPdf: Linux环境word转换为pdf时出现异常:"+e +tempFile.getPath());
- // 清理临时文件
- tempFile.delete();
- } finally {
- File pdfFile = new File(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
- //清理转换后的pdf文件
- pdfFile.delete();
- // 清理临时文件,无论是否成功转换
- tempFile.delete();
- }
- }
-
- /**
- * 执行命令行
- *
- * @param cmd 命令行
- * @return
- * @throws IOException
- */
- private static boolean executeLinuxCmd(String cmd) throws IOException {
- Process process = Runtime.getRuntime().exec(cmd);
- try {
- process.waitFor();
- } catch (InterruptedException e) {
- log.error("executeLinuxCmd 执行Linux命令异常:", e);
- Thread.currentThread().interrupt();
- return false;
- }
- return true;
- }
-
- /**
- *
- * 创建临时文件
- */
- private static File createTempFileFromInputStream(InputStream inputStream) {
- try {
- File tempFile = File.createTempFile("temp_word", ".docx");
- Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
- return tempFile;
- } catch (IOException e) {
- log.error("创建临时文件失败:", e);
- throw new RuntimeException("创建临时文件失败", e);
- }
- }
-
- /**
- * 读取pdf文件
- */
- private static void readPdfFileToByteArrayOutputStream(File tempFile,ByteArrayOutputStream sourceOutput){
- try {
- Path outputFile = Paths.get(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
- Files.copy(outputFile, sourceOutput);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。