在使用Aspose Word过程中,我们通过HTML代码生成PDF文件无法分配内存,遗似内存泄漏,报错如下:
无法分配内存
at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
at sun.nio.ch.FileDispatcherImpl.write(FileDispatcherImpl.java:60)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:211)
at java.nio.channels.Channels.writeFullyImpl(Channels.java:78)
at java.nio.channels.Channels.writeFully(Channels.java:101)
at java.nio.channels.Channels.access$000(Channels.java:61)
at java.nio.channels.Channels$1.write(Channels.java:174)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
at asposewobfuscated.zzW.zzZ(Unknown Source)
at com.aspose.words.Document.save(Unknown Source)
@Allen.Li 您能否附上有问题的输入和代码,以便我们重现该问题? 我们将检查该问题并为您提供更多信息。
这比较麻烦,因为太多了大概伪代码是这样的
Document docs = new Document();
DocumentBuilder documentBuilder = new DocumentBuilder(docs);
documentBuilder.insertHtml(html);
docs.getCompatibilityOptions().setGrowAutofit(false);
// 表格均分
Iterable<Table> tables = docs.getChildNodes(NodeType.TABLE, true);
for (Table table : tables)
{
// 表格居中
table.setAlignment(TableAlignment.CENTER);
for (Row row : table.getRows())
{
int count = row.getCount();
double cellWidth = CELL_WIDTH / count;
for (Cell cell : row.getCells())
{
cell.getCellFormat().setWidth(cellWidth);
}
}
}
//添加水印
Paragraph watermarkPara = new Paragraph(doc);
watermarkPara.appendChild(watermark1);
watermarkPara.appendChild(watermark2);
watermarkPara.appendChild(watermark3);
// 添加页码
HeaderFooter footer = new HeaderFooter(docs, HeaderFooterType.FOOTER_PRIMARY);
docs.getFirstSection().getHeadersFooters().add(footer);
// 页脚段落
Paragraph footerPara = new Paragraph(docs);
footerPara.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
Run footerParaRun = new Run(docs);
footerParaRun.getFont().setSize(9.0d);
footerPara.appendChild(footerParaRun);
//当前页码
footerPara.appendField(FieldType.FIELD_PAGE, true);
footerParaRun = new Run(docs, " / ");
footerParaRun.getFont().setSize(9.0d);
footerPara.appendChild(footerParaRun);
// 总页码
footerPara.appendField(FieldType.FIELD_NUM_PAGES, true);
footer.appendChild(footerPara);
docs.updatePageLayout();
// 保存pdf文件
String pdfFileName = System.currentTimeMillis() + ".pdf";
Path pdfFile = Paths.get(dirPath.toString(), pdfFileName);
try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(pdfFile))) {
SaveOptions saveOptions = SaveOptions.createSaveOptions(SaveFormat.PDF);
saveOptions.setMemoryOptimization(true);
docs.save(out, saveOptions);
return pdfFile.toFile();
} finally
{
docs.cleanup();
}
@Allen.Li 您能否附上导致问题的输入 HTML?
这个不太行,涉及到一些隐私,就是通过word导入生成的html,大概有七八页文本
@Allen.Li 不幸的是,如果没有您的输入数据,我们无法测试场景并重现问题。 您可以从 HTML、zip 中删除机密信息并将其附加到此处进行测试。 另外,请注意,在论坛中附加文档是安全的,只有您作为主题发起者和 Aspose 工作人员才能访问附件。
但是感觉应该不是一个HTML导致的,我们是把应用部署在容器中,运行一段时间之后就会报这个错,当重启容器后,就恢复了!我怀疑是生成PDF后内存未得到释放,这个有什么办法解决吗?
@Allen.Li 不幸的是,我无法使用提供的代码在我这边重现该问题。 如果可能,请创建一个简单的应用程序,使我们能够在我们这边重现问题。 我们将检查问题并为您提供信息。 不幸的是,如果我们没有能力重现问题,就很难说出问题是什么。