目前,我正在处理Microsoft文档:Word(doc,docx),Powerpoint(ppt,pptx)和Excel(xls,xlsx)
我想从它的第一页创建预览图像。
只有PowerPoint文档可以由Apache-poi库完成。
但是我找不到其他类型的解决方案。
我有想法将文档转换为pdf(1)并转换为图像(2)。
对于步骤2(将pdf转换为图像),有许多免费的Java库,例如PDFBox的。它与我的虚拟pdf文件一起正常工作
但是,我在第1步中遇到了问题
在我的文档中,它可能包含具有多种样式,表格,图像或对象的文本。来自word文档第一页的示例图片:
哪个开源java库可以完成这项任务?
我尝试使用以下库实现:
JODConverter - 输出看起来不错,但它需要OpenOffice。
docx4j - 我不确定它是否可以使用非ooxml格式(doc,xls,ppt)并且它真的免费? 以下是示例代码:
String inputWordPath = "C:\\Users\\test\\Desktop\\TestPDF\\Docx.docx";
String outputPDFPath = "C:\\Users\\test\\Desktop\\TestPDF\\OutDocx4j.pdf";
try {
InputStream is = new FileInputStream(new File(inputWordPath));
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(is);
Mapper fontMapper = new IdentityPlusMapper();
wordMLPackage.setFontMapper(fontMapper);
Docx4J.toPDF(wordMLPackage, new FileOutputStream(new File(outputPDFPath)));
} catch (Exception e) {
e.printStackTrace();
}
输出看起来不错,但它在生成的pdf中包含“ ##仅限评估使用 ##”。
xdocreport - 生成的pdf不包含图片。
String inputWordPath = "C:\\Users\\test\\Desktop\\TestPDF\\Docx.docx";
String outputPDFPath = "C:\\Users\\test\\Desktop\\TestPDF\\OutXDOCReport.pdf";
InputStream is = new FileInputStream(new File(inputWordPath));
XWPFDocument document = new XWPFDocument(is);
PdfOptions options = PdfOptions.create();
OutputStream out = new FileOutputStream(new File(outputPDFPath));
PdfConverter.getInstance().convert(document, out, options);
我找不到合适的任务库。
您有什么建议吗?
我可以直接将文档(docx,doc,xlsx,xls)转换为图像吗?
docx4j在转换功能上真的免费吗?
如何从生成的pdf(docx4j)中删除“ ##仅限评估使用 ##”?
docx4j可以使用非ooxml文档吗?
我可以只将第一页转换为pdf吗?
我可以设置pdf的大小以适应转换后的文档内容吗?
是否有任何库和示例代码可以将文档转换为pdf或将文档转换为图像?
答案 0 :(得分:3)
您可以尝试GroupDocs.Conversion Cloud SDK for Java,它的免费套餐计划每月提供50个免费积分。它支持所有常见file formats的转换。
示例DOCX到图像流的转换代码:
// Get App Key and App SID from https://dashboard.groupdocs.cloud/
ConvertApi apiInstance = new ConvertApi(AppSID,AppKey);
try {
ConvertSettings settings = new ConvertSettings();
settings.setStorageName(Utils.MYStorage);
settings.setFilePath("conversions\\password-protected.docx");
settings.setFormat("jpeg");
DocxLoadOptions loadOptions = new DocxLoadOptions();
loadOptions.setPassword("password");
loadOptions.setHideWordTrackedChanges(true);
loadOptions.setDefaultFont("Arial");
settings.setLoadOptions(loadOptions);
JpegConvertOptions convertOptions = new JpegConvertOptions();
convertOptions.setFromPage(1);
convertOptions.setPagesCount(1);
convertOptions.setGrayscale(false);
convertOptions.setHeight(1024);
convertOptions.setQuality(100);
convertOptions.setRotateAngle(90);
convertOptions.setUsePdf(false);
settings.setConvertOptions(convertOptions);
// set OutputPath as empty will result the output as document IOStream
settings.setOutputPath("");
// convert to specified format
File response = apiInstance.convertDocumentDownload(new ConvertDocumentRequest(settings));
System.out.println("Document converted successfully: " + response.length());
} catch (ApiException e) {
System.err.println("Exception while calling ConvertApi:");
e.printStackTrace();
}
我是Aspose的开发人员布道者。
答案 1 :(得分:2)
如果您能负担得起安装LibreOffice(或Apache OpenOffice),JODConverter应该可以正常使用(并且免费)。
请注意,Maven Central Repository中提供的the latest version of JODConverter提供了一项名为Filters的功能,可让您轻松转换第一页,并支持即时转换为PNG。以下是如何操作的简单示例:
// Create an office manager using the default configuration.
// The default port is 2002. Note that when an office manager
// is installed, it will be the one used by default when
// a converter is created.
final LocalOfficeManager officeManager = LocalOfficeManager.install();
try {
// Start an office process and connect to the started instance (on port 2002).
officeManager.start();
final File inputFile = new File("document.docx");
final File outputFile = new File("document.png");
// Create a page selector filter in order to
// convert only the first page.
final PageSelectorFilter selectorFilter = new PageSelectorFilter(1);
LocalConverter
.builder()
.filterChain(selectorFilter)
.build()
.convert(inputFile)
.to(outputFile)
.execute();
} finally {
// Stop the office process
LocalOfficeUtils.stopQuietly(officeManager);
}
关于你的问题
我可以设置pdf的大小以适应转换后的文档内容
如果您可以使用LibreOffice或Apache OpenOffice而不使用JODConverter,那么您可以使用JODConverter来完成。您只需要了解如何以编程方式完成它,然后创建一个与JODConverter一起使用的过滤器。
我不会在这里详细介绍,因为您可以选择其他方式,但如果您需要进一步的帮助,只需询问项目的Gitter Community。