当前位置:   article > 正文

Java如何将Word转换成PDF_java word转pdf

java word转pdf

目录

java中word转换PDF的常用用法

documents4j用法


java中word转换PDF的常用用法

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 的操作。这个比较推荐,开源而且转换后也不会有格式错误(推荐)


documents4j用法

注意Windows和linux系统的代码不一样

1.Windows系统用法

1.导入依赖,本地必须要有wps或者微软的office

  1. <!--word转换为PDF文档-->
  2. <dependency>
  3. <groupId>com.documents4j</groupId>
  4. <artifactId>documents4j-local</artifactId>
  5. <version>1.0.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.documents4j</groupId>
  9. <artifactId>documents4j-transformer-msoffice-word</artifactId>
  10. <version>1.0.3</version>
  11. </dependency>

2.编写转换代码(这里我都是传入input输出output然后根据流自己操作)

  1. package com.daysuns.dmas.module.testReportwd.util;
  2. import com.documents4j.api.DocumentType;
  3. import com.documents4j.api.IConverter;
  4. import com.documents4j.job.LocalConverter;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.io.*;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. import java.nio.file.StandardCopyOption;
  11. @Slf4j
  12. public class Documents4jUtil {
  13. /**
  14. * word转pdf
  15. *
  16. */
  17. public static void convertWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
  18. String os = System.getProperty("os.name").toLowerCase();
  19. log.info("convertWordToPdf 当前操作系统:{}", os);
  20. if (os.contains("win")) {
  21. // Windows操作系统
  22. windowsWordToPdf(stream,sourceOutput);
  23. } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
  24. // Unix/Linux/Mac操作系统
  25. linuxWordToPdf(stream,sourceOutput);
  26. } else {
  27. // 未知操作系统
  28. throw new RuntimeException("不支持当前操作系统转换文档。");
  29. }
  30. }
  31. /**
  32. * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
  33. *
  34. */
  35. public static void windowsWordToPdf(InputStream stream, ByteArrayOutputStream sourceOutput) {
  36. try{
  37. IConverter converter = LocalConverter.builder().build();
  38. converter.convert(stream)
  39. .as(DocumentType.DOCX)
  40. .to(sourceOutput)
  41. .as(DocumentType.PDF).execute();
  42. } catch (Exception e) {
  43. log.error("winWordToPdf windows环境word转换为pdf时出现异常:", e);
  44. }
  45. }
  46. /**
  47. * 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务
  48. *
  49. */
  50. public static void linuxWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
  51. // 创建临时文件
  52. File tempFile = createTempFileFromInputStream(stream);
  53. // 构建LibreOffice的命令行工具命令
  54. String command = "libreoffice6.4 --headless --invisible --convert-to pdf " + tempFile.getAbsolutePath() + " --outdir " + tempFile.getParent();
  55. // 执行转换命令
  56. try {
  57. if (!executeLinuxCmd(command)) {
  58. throw new IOException("转换失败");
  59. }
  60. readPdfFileToByteArrayOutputStream(tempFile,sourceOutput);
  61. } catch (Exception e) {
  62. log.error("ConvertWordToPdf: Linux环境word转换为pdf时出现异常:"+e +tempFile.getPath());
  63. // 清理临时文件
  64. tempFile.delete();
  65. } finally {
  66. File pdfFile = new File(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
  67. //清理转换后的pdf文件
  68. pdfFile.delete();
  69. // 清理临时文件,无论是否成功转换
  70. tempFile.delete();
  71. }
  72. }
  73. /**
  74. * 执行命令行
  75. *
  76. * @param cmd 命令行
  77. * @return
  78. * @throws IOException
  79. */
  80. private static boolean executeLinuxCmd(String cmd) throws IOException {
  81. Process process = Runtime.getRuntime().exec(cmd);
  82. try {
  83. process.waitFor();
  84. } catch (InterruptedException e) {
  85. log.error("executeLinuxCmd 执行Linux命令异常:", e);
  86. Thread.currentThread().interrupt();
  87. return false;
  88. }
  89. return true;
  90. }
  91. /**
  92. *
  93. * 创建临时文件
  94. */
  95. private static File createTempFileFromInputStream(InputStream inputStream) {
  96. try {
  97. File tempFile = File.createTempFile("temp_word", ".docx");
  98. Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  99. return tempFile;
  100. } catch (IOException e) {
  101. log.error("创建临时文件失败:", e);
  102. throw new RuntimeException("创建临时文件失败", e);
  103. }
  104. }
  105. /**
  106. * 读取pdf文件
  107. */
  108. private static void readPdfFileToByteArrayOutputStream(File tempFile,ByteArrayOutputStream sourceOutput){
  109. try {
  110. Path outputFile = Paths.get(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
  111. Files.copy(outputFile, sourceOutput);
  112. } catch (Exception e) {
  113. throw new RuntimeException(e);
  114. }
  115. }
  116. }

2.linux系统用法

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.同样适用上面代码成功转换文档

  1. package com.daysuns.dmas.module.testReportwd.util;
  2. import com.documents4j.api.DocumentType;
  3. import com.documents4j.api.IConverter;
  4. import com.documents4j.job.LocalConverter;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.io.*;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. import java.nio.file.StandardCopyOption;
  11. @Slf4j
  12. public class Documents4jUtil {
  13. /**
  14. * word转pdf
  15. *
  16. */
  17. public static void convertWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
  18. String os = System.getProperty("os.name").toLowerCase();
  19. log.info("convertWordToPdf 当前操作系统:{}", os);
  20. if (os.contains("win")) {
  21. // Windows操作系统
  22. windowsWordToPdf(stream,sourceOutput);
  23. } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
  24. // Unix/Linux/Mac操作系统
  25. linuxWordToPdf(stream,sourceOutput);
  26. } else {
  27. // 未知操作系统
  28. throw new RuntimeException("不支持当前操作系统转换文档。");
  29. }
  30. }
  31. /**
  32. * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
  33. *
  34. */
  35. public static void windowsWordToPdf(InputStream stream, ByteArrayOutputStream sourceOutput) {
  36. try{
  37. IConverter converter = LocalConverter.builder().build();
  38. converter.convert(stream)
  39. .as(DocumentType.DOCX)
  40. .to(sourceOutput)
  41. .as(DocumentType.PDF).execute();
  42. } catch (Exception e) {
  43. log.error("winWordToPdf windows环境word转换为pdf时出现异常:", e);
  44. }
  45. }
  46. /**
  47. * 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务
  48. *
  49. */
  50. public static void linuxWordToPdf(InputStream stream,ByteArrayOutputStream sourceOutput) {
  51. // 创建临时文件
  52. File tempFile = createTempFileFromInputStream(stream);
  53. // 构建LibreOffice的命令行工具命令
  54. String command = "libreoffice6.4 --headless --invisible --convert-to pdf " + tempFile.getAbsolutePath() + " --outdir " + tempFile.getParent();
  55. // 执行转换命令
  56. try {
  57. if (!executeLinuxCmd(command)) {
  58. throw new IOException("转换失败");
  59. }
  60. readPdfFileToByteArrayOutputStream(tempFile,sourceOutput);
  61. } catch (Exception e) {
  62. log.error("ConvertWordToPdf: Linux环境word转换为pdf时出现异常:"+e +tempFile.getPath());
  63. // 清理临时文件
  64. tempFile.delete();
  65. } finally {
  66. File pdfFile = new File(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
  67. //清理转换后的pdf文件
  68. pdfFile.delete();
  69. // 清理临时文件,无论是否成功转换
  70. tempFile.delete();
  71. }
  72. }
  73. /**
  74. * 执行命令行
  75. *
  76. * @param cmd 命令行
  77. * @return
  78. * @throws IOException
  79. */
  80. private static boolean executeLinuxCmd(String cmd) throws IOException {
  81. Process process = Runtime.getRuntime().exec(cmd);
  82. try {
  83. process.waitFor();
  84. } catch (InterruptedException e) {
  85. log.error("executeLinuxCmd 执行Linux命令异常:", e);
  86. Thread.currentThread().interrupt();
  87. return false;
  88. }
  89. return true;
  90. }
  91. /**
  92. *
  93. * 创建临时文件
  94. */
  95. private static File createTempFileFromInputStream(InputStream inputStream) {
  96. try {
  97. File tempFile = File.createTempFile("temp_word", ".docx");
  98. Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  99. return tempFile;
  100. } catch (IOException e) {
  101. log.error("创建临时文件失败:", e);
  102. throw new RuntimeException("创建临时文件失败", e);
  103. }
  104. }
  105. /**
  106. * 读取pdf文件
  107. */
  108. private static void readPdfFileToByteArrayOutputStream(File tempFile,ByteArrayOutputStream sourceOutput){
  109. try {
  110. Path outputFile = Paths.get(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));
  111. Files.copy(outputFile, sourceOutput);
  112. } catch (Exception e) {
  113. throw new RuntimeException(e);
  114. }
  115. }
  116. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/912999
推荐阅读
相关标签
  

闽ICP备14008679号