当前位置: 首页 > 知识库问答 >
问题:

使用Docx4j和PdfBox将Docx转换为image会导致OutOfMemoryError

傅长恨
2023-03-14

我使用dox4j和pdfbox分两步将docx文件的第一页转换为图像,但我目前每次都得到< code>OutOfMemoryError。

我已经能够确定,在调用convertToImage方法时,在这个过程的最后一步抛出了异常,然而,我已经使用这个方法的第二步转换pdf一段时间了,现在没有问题,所以我不知道可能是什么原因,除非dox4j编码pdf的方式是我尚未测试或已损坏的。

我尝试将ByteArrayOutputStream替换为FileOutputStriam,并且pdf的正确呈现似乎并不比我预期的大。

这是我正在使用的代码:

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(file);
org.docx4j.convert.out.pdf.PdfConversion c = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage);

((org.docx4j.convert.out.pdf.viaXSLFO.Conversion)c).setSaveFO(File.createTempFile("fonts", ".fo"));
ByteArrayOutputStream os = new ByteArrayOutputStream();
c.output(os, new PdfSettings());

byte[] bytes = os.toByteArray();
os.close();

ByteArrayInputStream is = new ByteArrayInputStream(bytes);

PDDocument document = PDDocument.load(is);

PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(0);
BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 96);

is.close();
document.close();

编辑为了提供更多关于这种情况的上下文,此代码正在grails Web应用程序中运行。我尝试了此代码的几种不同变体,包括取消不再需要的所有内容,使用FileInputStream和FileOutputStream尝试节省更多物理内存并检查docx4j和pdfbox的输出,每种方法似乎都正常工作。

我正在使用docx4j 2.8.1和pdfbox 0.7.3,我也尝试了pdf-renderer,但我仍然得到OutOfMemoryError。我怀疑docx4j使用了太多的内存,但是直到pdf到图像的转换才产生错误。

我很乐意将docx文件转换为pdf或直接转换为图像作为答案的替代方法,但是我目前正在尝试替换在服务器上运行有问题的jodconverter。

共有2个答案

程景胜
2023-03-14

终于取得了巨大的成功!我用XDocReport替换了docx4j,文档很快就转换为PDF。然而,一些文档似乎存在一些问题,但我希望这是由于创建它们的操作系统,可以通过使用以下方法解决:

PDFViaITextOptions options = PDFViaITextOptions.create().fontEncoding("windows-1250");

使用合适的操作系统,而不仅仅是:

PDFViaITextOptions options = PDFViaITextOptions.create();

默认为当前操作系统。

这是我现在用来从文档转换为 PDF 的代码:

FileInputStream in = new FileInputStream(file);
XWPFDocument document = new XWPFDocument(in);

PDFViaITextOptions options = PDFViaITextOptions.create();

ByteArrayOutputStream out = new ByteArrayOutputStream();
XWPF2PDFViaITextConverter.getInstance().convert(document, out, options);

byte[] bytes = out.toByteArray();
out.close();

ByteArrayInputStream is = new ByteArrayInputStream(bytes);
PDDocument document = PDDocument.load(is);

PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(0);
BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 96);

is.close();
document.close();

return image;
沈英勋
2023-03-14

我是 X 多克波特团队的一员。

我们最近开发了一个部署在云蜂(http://xdocreport-converter.opensagres.cloudbees.net/)上的小网络应用程序,它显示了行为转换器。

您可以轻松比较PDF和Html转换的docx4j和xdocreport的行为和性能。

源代码可在此处找到:

https://github.com/pascalleclercq/xdocreport-demo(REST-Service-Converter-web application子文件夹)。还有这里:https://github . com/pascalleclercq/xdocreport/blob/master/remoting/fr . opensagres . xdocreport . remoting . converter . server/src/main/Java/fr/opensagres/xdocreport/remoting/converter/server/converterresourceimpl . Java

我得到的第一个数字是,X多克波特生成PDF的速度比Docx4J快10倍左右。

欢迎反馈。

 类似资料:
  • 我一直在尝试使用他们的库将html内容转换为docx,我确实在运行我的应用程序后创建了一个docx文件,但它有空白内容,而html中确实有一些内容。请检查下面的代码,我已经包含了git上AndroidDocxtoHTML示例中所有必要的库。 代码: 我不明白我得到的空白文档的代码中缺少了什么。我为java找到了这段代码,我为android修改了这段代码。有些人建议使用夜间构建jar进行xhtml转

  • 我在将HTML转换为docx时遇到了新问题,它引发了异常: 组织。xml。萨克斯。SAXS异常;行号:4;栏目号:73;实体“nbsp”已被引用,但未被声明 正如我所理解的,这是因为docx4j认为我的文件是XML,并希望将其转换为docx但XML中只有5个预定义的实体,而nbsp等实体没有在XML中定义。如何让docx4j将超文本标记语言转换为doc,而无需在doctype中声明实体nbsp?

  • 我有一个应用程序试图拉一些数据从数据库,然后保存在一个docx文件。这些数据的一部分是html代码,因此使用docx4j,我能够将html代码转换为docx格式。这里有一个相关的帖子。 现在,我想使用docx4j将这部分文本(在docx文件的表单元格中)转换回html格式,并将html代码保存到数据库中。 或者也许有更好的解决方案来完成从docx到HTML的转换?希望我说清楚了。任何提示都很感激。

  • 我正试图用Docx4J将一个DOCX文件转换为PDF,并收到两个不同文档的两个不同的异常。 1)对于文档1,第一个文档的org.docx4j.utils.singletRaversAlutilVisitorCallback.apply(SingletRaversAlutilVisitorCallback.java:27)中出现一个NullPointerException。 下面包含的代码是否是在P

  • 我的目标是采取现有的措施。docx文件,并使用docx4j将其从Linux命令行转换为PDF(http://www.docx4java.orghttp://www.docx4java.org).入门指南(http://www.docx4java.org/svn/docx4j/trunk/docx4j/docs/Docx4j_GettingStarted.html)指的是最新(2.8.1)软件包中实

  • 我有1000. docx文件,我想转换成pdf,所以我写了一个程序来做到这一点,但我永远无法通过所有1000文件之前抛出一个错误。我使用。我正在使用LibreOffice4.2.0.4和JODConver2.2.2。这是我的转换代码(在此之前,我只是迭代目录中的所有. docx文件): 在抛出错误之前,我总是可以转换至少50个文件左右;这是我遇到的错误之一: 其他错误示例包括: 和 和 和 在每种