如何将 Word 文档转换为 PDF? [关闭]

Posted

技术标签:

【中文标题】如何将 Word 文档转换为 PDF? [关闭]【英文标题】:How can I convert a Word document to PDF? [closed] 【发布时间】:2011-03-02 15:08:45 【问题描述】:

如何将 Word 文档转换为 PDF,其中文档包含各种内容,例如表格。尝试使用 iText 时,原始文档与转换后的 PDF 看起来不同。是否有我可以使用的开源 API/库,而不是调用可执行文件?

【问题讨论】:

【参考方案1】:

这是一项相当艰巨的任务,如果您想要完美的结果(不使用 Word 就不可能),那就更难了>更新:我错了,见下文)。

您的基本选项如下:

    使用 JNI/a C# web service/etc 脚本 MS Office(100% 完美结果的唯一选项) 使用可用的 API 脚本打开 Office(90+% 完美) 使用 Apache POI 和 iText(非常庞大的工作,永远不会完美)。

更新 - 2016-02-11 这是我关于此主题的博客文章的精简副本,其中概述了支持 Java 中的 Word-to-PDF 的现有产品。

Converting Microsoft Office (Word, Excel) documents to PDFs in Java

我知道的三个可以渲染 Office 文档的产品:

yeokm1/docs-to-pdf-converter 不定期维护,纯 Java,开源 将多个库绑定在一起来执行转换。

xdocreport 积极开发,纯 Java,开源 它是一种 Java API,可将使用 MS Office (docx) 或 OpenOffice (odt)、LibreOffice (odt) 创建的 XML 文档与 Java 模型合并以生成报告并将其转换为其他格式(PDF、Xhtml ...)。

Snowbound Imaging SDK 闭源,纯 Java Snowbound 似乎是 100% 的 Java 解决方案,成本超过 2,500 美元。它包含描述如何在评估下载中转换文档的示例。

OpenOffice API 开源,不是纯 Java - 需要安装 Open Office OpenOffice 是一个支持 Java API 的原生 Office 套件。这支持阅读 Office 文档和编写 PDF 文档。 SDK 包含一个文档转换示例(examples/java/DocumentHandling/DocumentConverter.java)。要编写 PDF,您需要通过“writer_pdf_Export”编写器而不是“MS Word 97”编写器。 或者您可以使用包装 API JODConverter。

JDocToPdf - 于 2016 年 2 月 11 日去世 使用 Apache POI 读取 Word 文档,使用 iText 编写 PDF。完全免费,100% Java,但有一些 limitations。

【讨论】:

mlk,您能否详细说明选项#1?我更愿意根据我的情况调用 MS 制作的 API,即使它涉及使用 JNI,以获得可能的最佳 PDF 渲染。 我已经对此进行了一些研究(suodenjoki.dk/us/productions/articles/word2pdf.htm)。我不建议这样做,微软也同意这一点。 Word 不是为自动化而设计的。 support.microsoft.com/kb/257757/en-us 如果我必须这样做,我会使用 Open Office。 Docx4j 可以使用 FO + FOP 进行 docx。不过,从 v3.3 开始,它默认为我们更高质量的商业转换器,它同时支持 doc 和 docx,您可以在 converter-eval.plutext.com 尝试 任何纯 Java 解决方案都应该。【参考方案2】:

我同意将 OpenOffice 列为具有 Java API 的 word/pdf 文档的高保真导入/导出工具的海报,它也可以跨平台工作。 OpenOffice 导入/导出过滤器非常强大,可以在转换为包括 PDF 在内的各种格式期间保留大多数格式。 Docmosis 和 JODReports 的增值让生活比直接学习 OpenOffice API 更轻松,因为 UNO api 的风格和与崩溃相关的错误,这可能具有挑战性。

【讨论】:

【参考方案3】:

您可以为此目的使用 JODConverter。它可用于在不同的办公格式之间转换文档。如:

    Microsoft Office 到 OpenDocument,反之亦然 任何格式的 PDF 并且还支持更多的转换 它还可以将 MS office 2007 文档转换为几乎所有格式的 PDF

关于它的更多细节可以在这里找到: http://www.artofsolving.com/opensource/jodconverter

【讨论】:

【参考方案4】:

unoconv,这是一个在 UNIX 中工作的 python 工具。 虽然我使用 Java 在 UNIX 中调用 shell,但它对我来说非常适合。我的源代码:UnoconvTool.java。据说 JODConverter 和 unoconv 都使用 open office/libre office。

docx4j/docxreport、POI、PDFBox 都不错,但在转换中缺少一些格式。

【讨论】:

【参考方案5】:

查看docs-to-pdf-converter on github。它是专为将文档转换为 pdf 而设计的轻量级解决方案。

为什么?

我想要一个可以转换 Microsoft Office 文档的简单程序 到 PDF 但没有像 LibreOffice 这样的依赖项或昂贵的 专有解决方案。查看如何转换代码和库 每个单独的格式都分散在网络上,我决定 将所有这些解决方案组合到一个程序中。一路上,我 由于我也遇到了代码,所以决定也添加 ODT 支持。

【讨论】:

这不再被维护并且没有测试,这使得它有问题。【参考方案6】:

您可以使用 Cloudmersive 本机 Java 库。它每月最多可免费进行 50,000 次转换,并且根据我的经验,它比 iText 或基于 Apache POI 的方法等其他方法具有更高的保真度。这些文档实际上看起来与 Microsoft Word 中的一样,这对我来说是关键。顺便说一句,它还可以做 XLSX、PPTX 以及遗留的 DOC、XLS 和 PPT 到 PDF 的转换。

这是代码的样子,首先添加你的导入:

import com.cloudmersive.client.invoker.ApiClient;
import com.cloudmersive.client.invoker.ApiException;
import com.cloudmersive.client.invoker.Configuration;
import com.cloudmersive.client.invoker.auth.*;
import com.cloudmersive.client.ConvertDocumentApi;

然后转换一个文件:

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");

ConvertDocumentApi apiInstance = new ConvertDocumentApi();
File inputFile = new File("/path/to/input.docx"); // File to perform the operation on.
try 
  byte[] result = apiInstance.convertDocumentDocxToPdf(inputFile);
  System.out.println(result);
 catch (ApiException e) 
  System.err.println("Exception when calling ConvertDocumentApi#convertDocumentDocxToPdf");
e.printStackTrace();

您可以从门户免费获得document conversion API key。

【讨论】:

内部使用itext吗?【参考方案7】:

使用JACOB调用Office Word是一个100%完美的解决方案。但它只支持Windows平台,因为需要安装Office Word

    下载 JACOB 存档(最新版本为 1.19); 将 jacob.jar 添加到您的项目类路径中; 将 jacob-1.19-x32.dll 或 jacob-1.19-x64.dll(取决于您的 jdk 版本)添加到 ...\Java\jdk1.x.x_xxx\jre\bin

    使用 JACOB API 调用 Office Word 将 doc/docx 转换为 pdf。

    public void convertDocx2pdf(String docxFilePath) 
    File docxFile = new File(docxFilePath);
    String pdfFile = docxFilePath.substring(0, docxFilePath.lastIndexOf(".docx")) + ".pdf";
    
    if (docxFile.exists()) 
        if (!docxFile.isDirectory())  
            ActiveXComponent app = null;
    
            long start = System.currentTimeMillis();
            try 
                ComThread.InitMTA(true); 
                app = new ActiveXComponent("Word.Application");
                Dispatch documents = app.getProperty("Documents").toDispatch();
                Dispatch document = Dispatch.call(documents, "Open", docxFilePath, false, true).toDispatch();
                File target = new File(pdfFile);
                if (target.exists()) 
                    target.delete();
                
                Dispatch.call(document, "SaveAs", pdfFile, 17);
                Dispatch.call(document, "Close", false);
                long end = System.currentTimeMillis();
                logger.info("============Convert Finished:" + (end - start) + "ms");
             catch (Exception e) 
                logger.error(e.getLocalizedMessage(), e);
                throw new RuntimeException("pdf convert failed.");
             finally 
                if (app != null) 
                    app.invoke("Quit", new Variant[] );
                
                ComThread.Release();
            
        
    
    

【讨论】:

JACOB 移至 github github.com/freemansoft/jacob-project/releases【参考方案8】:

已经 2019 年了,我不敢相信仍然没有最简单和最方便的方法可以将 Java 世界中最流行的 Micro$oft Word 文档转换为 Adob​​e PDF 格式。

我几乎尝试了上述答案中提到的所有方法,我发现最好的也是唯一能满足我要求的方法是使用 OpenOffice 或 LibreOffice。其实我不太清楚它们之间的区别,似乎它们都提供了soffice命令行。

我的要求是:

    它必须在 Linux 上运行,更具体地说是 CentOS,而不是在 Windows 上,因此我们无法在其上安装 Microsoft Office; 必须支持汉字,所以不能选择ISO-8859-1字符编码,必须支持Unicode。

首先想到的是doc-to-pdf-converter,但它缺乏维护,最近一次更新发生在4年前,我不会使用nobody-maintain-solution。 Xdocreport 似乎是一个有前途的选择,但它只能转换docx,而不是doc 二进制文件,这对我来说是强制性的。使用 Java 调用 OpenOffice API 看起来不错,但是对于这么简单的需求来说太复杂了。

最后我找到了最好的解决方案:使用 OpenOffice 命令行完成工作:

Runtime.getRuntime().exec("soffice --convert-to pdf -outdir . /path/some.doc");

我一直相信最短的代码就是最好的代码(当然应该是可以理解的),就是这样。

【讨论】:

开源办公套件不是 100% 兼容 Word 是否可行? 好吧,如果您的 Word 文档包含一些 VBA 脚本,这些脚本会在文档打开后更改一些内容,我猜 OpenOffice 可能无法正确处理。但在大多数情况下,如果你的 Word 文档只是一些文字和图片,那应该没问题。 -1,该问题要求一种不涉及调用可执行文件的方法。虽然此答案可能会解决您的问题,但它是对另一个问题的答案 - 该问题是您答案的“我的要求是”部分 我希望这是2020年最简单的转换方式***.com/questions/3022376/…【参考方案9】:

Docx4j 是开源,是用于将 Docx 转换为 pdf 且没有任何对齐或字体问题的最佳 API。

Maven 依赖项

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-Internal</artifactId>
    <version>8.0.0</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
    <version>8.0.0</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-MOXy</artifactId>
    <version>8.0.0</version>
</dependency>
<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-export-fo</artifactId>
    <version>8.0.0</version>
</dependency>

代码

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

import org.docx4j.Docx4J;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

public class DocToPDF 

    public static void main(String[] args) 
        
        try 
            InputStream templateInputStream = new FileInputStream("D:\\\\Workspace\\\\New\\\\Sample.docx");
            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(templateInputStream);
            MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

            String outputfilepath = "D:\\\\Workspace\\\\New\\\\Sample.pdf";
            FileOutputStream os = new FileOutputStream(outputfilepath);
            Docx4J.toPDF(wordMLPackage,os);
            os.flush();
            os.close();
         catch (Throwable e) 

            e.printStackTrace();
         
    


【讨论】:

【参考方案10】:

Spire.Doc for Java,它是一个专业的Java API,使Java应用程序无需使用Microsoft Office即可创建、转换、操作和打印Word文档。您可以轻松地将Word转换为PDF,只需几行代码如下。

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.ToPdfParameterList;

public class WordToPDF 
public static void main(String[] args)  

    //Create Document object
    Document doc = new Document();

    //Load the file from disk.
    doc.loadFromFile("Sample.docx");

    //create an instance of ToPdfParameterList.
    ToPdfParameterList ppl=new ToPdfParameterList();

    //embeds full fonts by default when IsEmbeddedAllFonts is set to true.
    ppl.isEmbeddedAllFonts(true);

    //set setDisableLink to true to remove the hyperlink effect for the result PDF page.
    //set setDisableLink to false to preserve the hyperlink effect for the result PDF page.
    ppl.setDisableLink(true);

    //Set the output image quality as 40% of the original image. 80% is the default setting.
    doc.setJPEGQuality(40);

    //Save to file.
    doc.saveToFile("output/ToPDF.pdf",FileFormat.PDF);


运行上面的sn-ps代码后,原Word文档的所有格式都可以完美复制成PDF。

【讨论】:

以上是关于如何将 Word 文档转换为 PDF? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中将 MS Word 文档转换为 PDF [关闭]

如何将excel表格转成在线文档

如何将PDF文档转换为CHM格式文档?

如何将PDF文件转换为能编辑的Word文档

如何解决利用aspose把word文档转换为pdf文档时出现乱码 C#

问:如何将PDF文档(表格式的)转换为Excel格式?