Java中的Docx到Pdf转换器

Posted

技术标签:

【中文标题】Java中的Docx到Pdf转换器【英文标题】:Docx to Pdf Converter in java 【发布时间】:2018-12-28 15:13:19 【问题描述】:

以下代码不适用于 Apache poi 3.16。 有人可以提供正确的解决方案吗,在我的项目中,仅使用一些依赖项

public void ConvertToPDF(String docPath, String pdfPath) 
    try 
        InputStream doc = new FileInputStream(new File(docPath));
        XWPFDocument document = new XWPFDocument(doc);
        PdfOptions options = PdfOptions.create();
        OutputStream out = new FileOutputStream(new File(pdfPath));
        PdfConverter.getInstance().convert(document, out, options);
        System.out.println("Done");
     catch (FileNotFoundException ex) 
        System.out.println(ex.getMessage());
     catch (IOException ex) 
        System.out.println(ex.getMessage());
    

例外:

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: org.apache.poi.POIXMLDocumentPart.getPackageRelationship()Lorg/apache/poi/openxml4j/opc/PackageRelationship;
at org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.getFontsDocument(XWPFStylesDocument.java:1479)
at org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.<init>(XWPFStylesDocument.java:190)
at org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.<init>(XWPFStylesDocument.java:184)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.createStylesDocument(XWPFDocumentVisitor.java:166)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.<init>(XWPFDocumentVisitor.java:159)
at org.apache.poi.xwpf.converter.pdf.internal.PdfMapper.<init>(PdfMapper.java:149)
at org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:55)
at org.apache.poi.xwpf.converter.pdf.PdfConverter.doConvert(PdfConverter.java:38)
at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:45)
at recall.wordEditor.converter(recall_word.java:395)
at recall.wordEditor.process(recall_word.java:379)
at recall.wordEditor$5.actionPerformed(recall_word.java:194)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

不工作:你是什么意思?它抛出异常?请把它添加到你的问题中好吗? 请参阅***.com/questions/51330192/… 以获取经过测试且正在运行的完整示例。 【参考方案1】:

主要问题是PdfOptionsPdfConverter 不是apache poi 项目的一部分。它们由opensagres 开发,第一个版本被错误地命名为org.apache.poi.xwpf.converter.pdf.PdfOptionsorg.apache.poi.xwpf.converter.pdf.PdfConverter。这些旧课程自 2014 年以来未更新,需要使用 3.9apache poi 版本。

请使用最新的fr.opensagres.poi.xwpf.converter.pdf,它使用最新的稳定版本apache poi 3.17

那就做吧

import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;

//needed jars: fr.opensagres.poi.xwpf.converter.core-2.0.1.jar, 
//             fr.opensagres.poi.xwpf.converter.pdf-2.0.1.jar,
//             fr.opensagres.xdocreport.itext.extension-2.0.1.jar,
//             itext-2.1.7.jar                                  
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;

//needed jars: apache poi and it's dependencies
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class DOCXToPDFConverterSampleMin 

 public static void main(String[] args) throws Exception 

  String docPath = "./WordDocument.docx";
  String pdfPath = "./WordDocument.pdf";

  InputStream in = new FileInputStream(new File(docPath));
  XWPFDocument document = new XWPFDocument(in);
  PdfOptions options = PdfOptions.create();
  OutputStream out = new FileOutputStream(new File(pdfPath));
  PdfConverter.getInstance().convert(document, out, options);

  document.close();
  out.close();

 


2018 年 10 月: 此代码使用apache poi 3.17 工作。由于 apache poi 中的更改直到现在尚未在 fr.opensagres.poi.xwpf.converter 中考虑,它无法使用 apache poi 4.0.0 工作。


2019 年 2 月: 我现在使用最新的apache poi 版本4.0.1 和fr.opensagres.poi.xwpf.converter.core 的最新版本2.0.2 和配偶。


2021 年 6 月: 使用apache poi 版本4.1.2 和fr.opensagres.poi.xwpf.converter.core 和配偶的最新版本2.0.2 工作。 无法使用apache poi 版本5.0.0 工作,因为XDocReport 需要ooxml-schemas,而apache poi 5 不再支持。

【讨论】:

@Alex Richter 嗨,如果没有库链接,您能否提供一个工作示例?或者找不到类,或者有时可以,但在运行时找不到类,不管我做什么,我都无法让它工作我使用 android studio:arctic fox @Ahsan raza:以上是使用默认 Java 运行时环境的工作示例。但是androidJava 相同,而只是java 的摘录。在android 上使用apache poi 存在多个已知问题,例如缺少AWT 类。所以不,我没有android 的解决方案。【参考方案2】:

fr.opensagres.poi.xwpf.converter.core 的新版本 2.0.2 与 apache poi 4.0.1 和 itext 2.17 一起运行。 您只需要在 Maven 中添加以下依赖项,然后 Maven 将自动下载所有依赖项。 (更新了您的 Maven 项目,因此它下载了所有这些库及其所有依赖项)

<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId>
    <version>2.0.2</version>
</dependency>

【讨论】:

【参考方案3】:

2021 年 6 月:使用 apache poi 版本 4.1.2 和最新版本工作 fr.opensagres.poi.xwpf.converter.core 和 consorts 的 2.0.2。无法使用 apache poi 5.0.0 版工作,因为 XDocReport 需要 apache poi 5 不再支持的ooxml-schemas。

ooxml-schemas 已替换为 poi-ooxml-full

https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-full/5.0.0

但它不适用于 fr.opensagres.poi.xwpf.converter.core 2.0.2,因为与 apache-poi 5.0 中包含的新版 CTStyle 不兼容。 0.

【讨论】:

【参考方案4】:

刚刚在 POX.xml 中添加

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId>
    <version>2.0.2</version>
</dependency>

【讨论】:

以上是关于Java中的Docx到Pdf转换器的主要内容,如果未能解决你的问题,请参考以下文章

java项目中的文档转换案例实战——Word转换为PDF

java项目中的文档转换案例实战——Word转换为PDF

转换.docx。在linux中的python中转换为pdf

用Java可以把pdf转doc吗?

Java将.docx文件转换为.pdf文件

PHP将docx文件转换为pdf