在Java中将docx转换为pdf

34

我正在尝试将一个包含表格和图片的docx文件转换为pdf格式的文件。

我已经到处搜索但没有得到正确的解决方案,请提供正确的解决方案:

这是我尝试过的:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class TestCon {

    public static void main(String[] args) {
        TestCon cwoWord = new TestCon();
        System.out.println("Start");
        cwoWord.ConvertToPDF("D:\\Test.docx", "D:\\Test1.pdf");
    }

    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 "main" java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:313)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:162)
at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:130)
at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:559)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:112)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:83)
at org.apache.poi.openxml4j.opc.PackagePart.<init>(PackagePart.java:128)
at org.apache.poi.openxml4j.opc.ZipPackagePart.<init>(ZipPackagePart.java:78)
at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:239)
at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:665)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274)
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:121)
at test.TestCon.ConvertToPDF(TestCon.java:31)
at test.TestCon.main(TestCon.java:25)

我的要求是创建一个Java代码,将现有的docx文档转换为带有正确格式和对齐方式的pdf。

请提供建议。

使用的Jars:

已更新的Jars


1
如果你坚持使用ApachePOI,这里还有另一个答案:https://dev59.com/PG025IYBdhLWcg3wIyKf - Krzysztof Cichocki
1
Bruno只能帮助你关于iText的问题。但是你的问题不是关于iText,而是关于Apache POI。无论如何,如果你标记了一个没有评论的人,他们将不会收到通知。Stack Overflow这样做是为了防止标签垃圾邮件,这也是你所做的描述。 - Amedee Van Gasse
7
如果你不断改变目标,没有人能够帮助你。在过去的15分钟内,你已经多次编辑帖子并更换了同样多的库。 - VivekRatanSinha
@VivekRatanSinha,我正在尝试不同的可能性,你能帮忙编写将docx转换为带有表格的pdf的代码吗? - user1999397
1
在你的许多编辑中,我可以看到com.lowagie在你的异常中。这意味着你使用的是一个古老的 iText 版本,2.1.7 或更早版本,已经至少有8年历史了。既然你似乎信任 Bruno Lowagie 的专业知识,那么你应该熟悉他对仍在使用如此旧的 iText 版本的人的看法。 - Amedee Van Gasse
显示剩余9条评论
11个回答

-1
让我用 Kotlin 给你举个例子 使用适合我的依赖项(问题中的方法没有改变)
//gradle.kts
implementation("fr.opensagres.xdocreport:fr.opensagres.poi.xwpf.converter.pdf:2.0.4")
implementation("org.apache.pdfbox:pdfbox:3.0.0")

Kotlin
import org.apache.poi.xwpf.usermodel.XWPFDocument
import java.io.*
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions

fun ConvertToPDF(docPath: String?, pdfPath: String?) {
    try {
        val doc: InputStream = FileInputStream(File(docPath))
        val document = XWPFDocument(doc)
        val options = PdfOptions.create()
        val out: OutputStream = FileOutputStream(File(pdfPath))
        PdfConverter.getInstance().convert(document, out, options)
        println("Done")
    } catch (ex: FileNotFoundException) {
        println(ex.message)
    } catch (ex: IOException) {
        println(ex.message)
    }
}

OP正在寻找Java。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接