如何将Word文档转换为PDF,其中文档包含各种内容,例如表格。尝试使用iText时,原始文档看起来与转换后的PDF不同。是否有开源API /库,而不是调用可执行文件,我可以使用?
答案 0 :(得分:45)
这是一项非常艰巨的任务,如果你想要完美的结果(不可能不使用Word)就更难了,因为在纯Java中为你完成这一切的API的数量是开源的,我相信(更新:我错了,见下文)。
您的基本选项如下:
更新 - 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来实现此目的。它可用于在不同的办公室格式之间转换文档。如:
有关它的更多详细信息,请访问: 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)时保留大多数格式。 Docmosis和JODReports 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 。
使用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
命令行。
我的要求是:
首先想到的是doc-to-pdf-converter
,但是它缺乏维护,最近一次更新发生在4年前,我将不使用无人维护的解决方案。 Xdocreport
似乎是一个有前途的选择,但它只能转换docx
,而不能转换对我来说是强制性的doc
二进制文件。使用Java调用OpenOffice API看起来不错,但是对于这样简单的要求来说太复杂了。
最后,我找到了最佳解决方案:使用OpenOffice命令行完成工作:
Runtime.getRuntime().exec("soffice --convert-to pdf -outdir . /path/some.doc");
我一直认为最短的代码就是最好的代码(当然这应该是可以理解的)。