我正在使用dox4j和pdfbox將兩個步驟中的docx文件的第一頁轉換爲圖像,但我目前每次都得到OutOfMemoryError
。使用Docx4j和PdfBox將Docx轉換爲圖像會導致OutOfMemoryError
我已經能夠確定在這個過程的最後一步拋出異常,而convertToImage
方法被調用,但是我一直在使用這種方法的第二步來轉換PDF現在沒有問題了,所以我不知道什麼可能是原因,除非dox4j編碼PDF是一種我尚未測試或者已經損壞的方法。
我試過用FileOutputStream
替換ByteArrayOutputStream
,並且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。
聽起來就像是docx4j部分是OK,那你需要配置文件convertToImage。字節數組有多大? PDF中有多少頁面?你給java多少內存?一旦你有你的PDPage,是否有助於清空其他對象? – JasonPlutext
@JasonPlutext:我不得不得出結論,這不只是'convertToImage',因爲我可以從docx4j失敗後採取的渲染PDF文件,並只用PDF重試,它工作正常。 – Godwin
我用作我的主要測試的Doc文件是52KB,它生成的PDF是38.5KB。我已經將我的java內存設置爲3GB,但仍然失敗。 – Godwin