1

dox4jとpdfboxを使用して2つのステップでdocxファイルの最初のページを画像に変換していますが、現在はOutOfMemoryError毎回取得しています。

convertToImageメソッドが呼び出されている間、このプロセスの最後のステップで例外がスローされることを確認できましたが、このメソッドの2番目のステップを使用して、しばらくの間問題なくpdfを変換してきました。おそらくdox4jがpdfをエンコードしていない限り、何が原因であるかについて私は途方に暮れています。これは、私がまだテストしていないか、破損している方法です。

ByteArrayOutputStreamをaに置き換えてみましたがFileOutputStream、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();

編集 この状況についてより多くのコンテキストを提供するために、このコードはgrailsWebアプリケーションで実行されています。FileInputStreamとFileOutputStreamを使用して、より多くの物理メモリを節約し、docx4jとpdfboxの出力を検査するなど、このコードのいくつかの異なるバリアントを試しました。それぞれが正しく機能しているようです。

docx4j2.8.1とpdfbox0.7.3を使用しています。pdf-rendererも試しましたが、それでもOutOfMemoryErrorが発生します。私の疑いは、docx4jがメモリを使いすぎているが、PDFから画像への変換までエラーを生成しないということです。

答えとして、docxファイルをpdfまたは直接画像に変換する別の方法を除いて喜んでいますが、現在、サーバーでの実行に問題があったjodconverterを置き換えようとしています。

4

2 に答える 2

3

ついに栄光の成功!docx4jをXDocReportに置き換えたところ、ドキュメントはすぐにPDFに変換されました。ただし、一部のドキュメントには問題があるようですが、これはドキュメントが作成されたOSが原因であり、次を使用して解決できる可能性があります。

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

次の代わりに適切なOSを使用する:

PDFViaITextOptions options = PDFViaITextOptions.create();

デフォルトは現在のOSです。

これは、DOCXから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;
于 2012-10-15T22:05:45.717 に答える
3

私はXDocreportチームの一員です。

最近、動作コンバーターを示す、cloudbees(http://xdocreport-converter.opensagres.cloudbees.net/)にデプロイされた小さなWebアプリを開発しました。

PDFおよびHtml変換のdocx4jおよびxdocreportの動作とパフォーマンスを簡単に比較できます。

ソースコードはここにあります:

https://github.com/pascalleclercq/xdocreport-demo(REST-Service-Converter-WebApplicationサブフォルダー)。およびここ: 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

私が最初に得た数字は、XdocreportはDocx4JよりもPDFの生成が約10倍速いということです。

フィードバックは大歓迎です。

于 2012-10-21T21:16:27.127 に答える