有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将Word文档转换为PDF?

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


共 (6) 个答案

  1. # 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");
    

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

  2. # 2 楼答案

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

    Why?

    I wanted a simple program that can convert Microsoft Office documents to PDF but without dependencies like LibreOffice or expensive proprietary solutions. Seeing as how code and libraries to convert each individual format is scattered around the web, I decided to combine all those solutions into one single program. Along the way, I decided to add ODT support as well since I encountered the code too.

  3. # 3 楼答案

    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();
            } 
        }
    
    }
    
  4. # 4 楼答案

    您可以使用Cloudmersive本机Java库。它每月最多可免费转换50000次,并且根据我的经验,它的保真度比其他基于iText或ApachePOI的方法高得多。这些文档实际上看起来与Microsoft Word中的文档一样,而Microsoft Word对我来说是关键。顺便说一句,它还可以将XLSX、PPTX和遗留文档、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

  5. # 5 楼答案

    这是一项相当艰巨的任务,如果您想要获得完美的结果(不使用Word是不可能的),那么这项任务就更加艰巨了。因此,在纯Java中为您完成这一切的API数量为零,并且是开源的,我相信(更新:我错了,请参见下文

    您的基本选择如下:

    1. 使用JNI/a C#web服务/etc脚本MS Office(100%完美结果的唯一选项)
    2. 使用可用的API脚本Open Office(90%以上完美)
    3. 使用ApachePOI&;iText(非常大的工作,永远不会完美)

    更新-2016-02-11 这里是我关于这个主题的博客文章的一个缩略副本,它概述了在Java中支持Word到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解决方案,成本超过2500美元。它包含描述如何在评估下载中转换文档的示例

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

    截至2016年2月11日死亡 使用ApachePOI读取Word文档,使用iText编写PDF。完全免费,100%Java,但有一些limitations

  6. # 6 楼答案

    为此,可以使用JODConverter。它可用于在不同office格式之间转换文档。例如:

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

    更多详细信息可在此处找到: http://www.artofsolving.com/opensource/jodconverter