如何将Word文档转换为PDF?

时间:2010-06-11 11:40:49

标签: java pdf ms-word

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

13 个答案:

答案 0 :(得分:45)

这是一项非常艰巨的任务,如果你想要完美的结果(不可能不使用Word)就更难了,因为在纯Java中为你完成这一切的API的数量是开源的,我相信(更新:我错了,见下文)。

您的基本选项如下:

  1. 使用JNI / C#Web服务/ etc脚本MS Office(只有100%完美结果的选项)
  2. 使用可用的API脚本打开Office(90 +%完美)
  3. 使用Apache POI& iText(非常大的工作,永远不会是完美的)。
  4. 更新 - 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,开源 它是用于将使用MS Office(docx)或OpenOffice(odt)创建的XML文档,LibreOffice(odt)与Java模型合并以生成报告并将其转换为需要其他格式(PDF,XHTML ...)的Java API。 / p>

    Snowbound Imaging SDK Closed Source,Pure 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-02-11 使用Apache POI读取Word文档,使用iText编写PDF。完全免费,100%Java但有一些limitations

答案 1 :(得分:8)

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

  1. Microsoft Office to OpenDocument,反之亦然
  2. 任何PDF格式
  3. 并支持更多转换
  4. 它还可以将MS Office 2007文档转换为PDF以及几乎所有格式
  5. 有关它的更多详细信息,请访问:  http://www.artofsolving.com/opensource/jodconverter

答案 2 :(得分:5)

结帐docs-to-pdf-converter on github。它是一个轻量级解决方案,专门用于将文档转换为pdf。

  

为什么?

     

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

答案 3 :(得分:2)

您可以使用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

答案 4 :(得分:2)

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();
        } 
    }

}

答案 5 :(得分:1)

我同意海报将OpenOffice列为使用Java API的word / pdf docs的高保真导入/导出工具,它也适用于跨平台。 OpenOffice导入/导出过滤器功能非常强大,可在转换为各种格式(包括PDF)时保留大多数格式。 DocmosisJODReports value-add比直接学习OpenOffice API更容易,因为UNO api的风格和崩溃相关的错误,这可能很有挑战性。

答案 6 :(得分:1)

我认为JOD Converter是最简单的实现方式,请参阅以下链接获取更多信息。

http://mytechbites.blogspot.in/2014/10/convert-documents-to-pdf-in-java.html

答案 7 :(得分:1)

Keycloak authentication,它是一个专业的 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);
}
}

运行上述代码片段后,可以完美地将原始Word文档的所有格式复制为PDF。

答案 8 :(得分:0)

我没有尝试过将它用于MS Word,但我在使用Apache POI阅读MS Excel文档方面取得了很大的成功 - http://poi.apache.org/

答案 9 :(得分:0)

查看脚本OpenOffice.org为您完成这项工作。

答案 10 :(得分:0)

unoconv,这是一个在UNIX中运行的python工具。 虽然我使用Java在UNIX中调用shell,但它对我来说非常适合。我的源代码:UnoconvTool.java。据说JODConverter和unoconv都使用开放式办公室/自由办公室。

docx4j / docxreport,POI,PDFBox很不错,但它们在转换中缺少某些格式。

答案 11 :(得分:0)

使用JACOB呼叫 Office Word 是100%完美的解决方案。但是它仅在 Windows 平台上受支持,因为需要安装 Office Word

  1. 下载JACOB存档(最新版本为1.19);
  2. 将jacob.jar添加到您的项目类路径中;
  3. 将jacob-1.19-x32.dll或jacob-1.19-x64.dll(取决于您的jdk版本)添加到... \ Java \ jdk1.x.x_xxx \ jre \ bin
  4. 使用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();
            }
        }
    }
    

    }

答案 12 :(得分:-1)

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

我几乎尝试了上面提到的所有方法,并且发现可以满足我的要求的最好,唯一的方法是使用OpenOffice或LibreOffice。其实我并不完全知道它们之间的区别,似乎它们都提供了soffice命令行。

我的要求是:

  1. 它必须在Linux(尤其是CentOS)上运行,而不是在Windows上运行,因此我们无法在其上安装Microsoft Office;
  2. 它必须支持汉字,因此不能选择ISO-8859-1字符编码,它必须支持Unicode。

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

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

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

我一直认为最短的代码就是最好的代码(当然这应该是可以理解的)。