Aspose Words for java的问题

Aspose Words for java遇到2个问题

问题1:

问题描述:页码问题-能确定是由于字体导致word的页码对不上,pdf可以对上,我们使用的字体是微软雅黑,改为宋体或黑体后整体页码可以对上,但有些具体到模版文档里页码也对不上

这里指目录中的页码与实际的页码 数字不一致

1、使用的组件名称:Aspose Words for java

2、使用的开发语言:java jdk8

3、使用的组件版本号:V25.6

Word模板文件

credit-template_yh.docx (220.6 KB)

生成后的Word文档

小米科技有限责任公司基础信用报告2024-02-0667.docx (1.1 MB)

示例代码:

问题2

问题描述:经过多次测试问题1代码发现依然存在堆外内存一直升高

部署环境信息如下


多次调用问题1代码导致堆外内存持续升高

实际启动分配2G内存

堆内内存实际使用1G左右

java程序实际占用4.5g

@Gavin_Zhang

关于您提到的两个问题,我会逐一进行解答。

问题1:页码不一致

页码不一致的问题通常与字体的使用有关。您提到在使用“微软雅黑”字体时,目录中的页码与实际页码不一致,而更换为“宋体”或“黑体”后问题得到解决。这可能是因为不同字体在排版时的表现不同,导致页码计算不准确。

解决方案:

  1. 确保在生成文档之前,所有的样式和字体都已正确设置。

  2. 尝试在生成文档后,手动更新目录。可以使用以下代码来更新文档中的字段:

    Document doc = new Document("path/to/your/document.docx");
    doc.updateFields();
    doc.save("path/to/your/updated_document.docx");
    
  3. 如果问题依然存在,检查模板文档中的段落格式和样式设置,确保它们与您希望的输出一致。

问题2:堆外内存持续升高

堆外内存的持续升高可能是由于未释放的资源或内存泄漏导致的。您可以尝试以下步骤来诊断和解决此问题:

  1. 检查代码:确保在处理文档时,所有的对象都被正确释放。使用 Document 对象后,确保调用 dispose() 方法。

  2. 内存优化:在创建 Document 对象时,可以启用内存优化选项:

    Document doc = new Document();
    doc.getCompatibilityOptions().setOptimizeMemory(true);
    
  3. 监控内存使用:使用 Java 的内存监控工具(如 VisualVM)来观察内存使用情况,找出可能的内存泄漏。

  4. 增加内存分配:如果您的应用程序需要处理较大的文档,考虑增加 JVM 的堆内存分配。

下一步

请根据上述建议进行操作,并观察问题是否得到解决。如果您仍然遇到困难或有其他问题,请随时与我联系,我将乐意提供进一步的帮助。感谢您的耐心!

手动更新目录 的代码测试了 没有用,目录页码和实际页码依然不一样

内存修复代码
doc.getCompatibilityOptions().setOptimizeMemory(true);这个在25.6版本都没这个方法了

@Gavin_Zhang 我已经用数据和以下代码检查了提供的文件:

Document doc = new Document("input.docx");
doc.updateFields();
doc.save("ouput.pdf");

所有TOC页面均已正确更新。在你的代码中,请尽量避免使用doc.updatePageLayout(),因为它可能会导致问题,或者如果你在第一次使用后对文档进行了任何更改,你需要在渲染前使用它。请在所有更改完成后尝试仅使用“doc.updateFields()”。此外,请确保您使用的字体在您的服务器上可用。

至于内存使用情况,我们会仔细检查,但“Aspose.Words for Java”是纯托管代码,当“Aspose.Words”对象超出范围时,垃圾回收器会收集它。您需要在每个操作中使用一个文档,然后创建一个新实例。

以下选项可以减少渲染PDF文档时的内存使用:

@vyacheslav.deryushev
我这边测试了,页码还是显示错误,你这边可以提供你的代码和你生成的正确页码的Word文档吗?

内存的问题,服务器增加内存并不能解决堆外内存升高这个问题,因为堆外内存在持续升高,jvm回收不掉这部分内存。有没有别的更好的解决方案?

@Gavin_Zhang 下面是我这边使用 25.6 版本和以下代码的输出文件:

Document doc = new Document("小米科技有限责任公司基础信用报告2024-02-0667.docx");
doc.updateFields();
doc.save("ouput.docx");

output.docx (907.4 KB)

如果问题仍然存在,请附上 MS Word 和 Aspose.Words 的 PDF 文件。这将有助于我们分析问题。

我会就内存问题咨询我们的 Java 开发人员。不便之处,敬请原谅。

@vyacheslav.deryushev

你生成的ouput.docx文档里,目录中的页码数字 与 实际页码数字 也不是一致的

目录中的页码

实际的页码

@Gavin_Zhang 这是我的 MS Word 2019 文档:

可能是字体问题,但我这边看不到任何遗漏的字体。请提供以下文件和您使用的 MS Word 版本:

  1. 从 MS Word 保存的 PDF 文件;
  2. 从 Aspose.Words 保存的 PDF 文件。

我们将调查问题并为您提供更多信息。

@vyacheslav.deryushev 请问内存问题咨询您们的 Java 开发人员后,您们的开发人员有给到您回复吗?

@Gavin_Zhang 不幸的是,我们的开发人员正在度假,但他很快就会去查看。对于给您带来的不便,我们深表歉意。

@Gavin_Zhang 感谢您报告此问题。 我们已经在我们的内部问题跟踪系统中打开了以下新工单,并将根据 免费支持政策 中提到的条款提供它们的修复:

Issue ID(s): WORDSJAVA-3167

如果您需要优先支持以及直接联系我们的付费支持管理团队,您可以获得 付费支持服务

看起来文档模型正在某处使用,但没有被 GC 清除。我们需要对文档进行分析。

@vyacheslav.deryushev 请问关于内存问题,您们的 Java 开发人员休假回来后,查看了问题情况后,您们的开发人员有给到您新的回复吗?

@Gavin_Zhang 目前正在对该问题进行分析,在问题解决之前,我们无法提供任何结果。对于由此造成的不便,我们深表歉意。

@vyacheslav.deryushev 我在论坛中搜寻关键词为“内存”“内存溢出”有很多帖子,问题帖子的时间跨度也很长,但是都没有看到一个好的解决方案,是不是针对内存溢出的问题,你们这边目前一直没有一个好的解决方案呢?

@Gavin_Zhang 遗憾的是,在某些情况下没有通用的解决方案。这取决于使用环境和文件。我会向我们的团队询问进展情况。如有任何不便,敬请原谅。

@Gavin_Zhang 下面是我们团队的答案:

由于 Aspose.Words for Java 的特殊性,加载文档还会初始化大量静态对象,这些对象会消耗内存,只有在程序终止或类加载器被销毁后才会释放内存。此外,我们注意到用户文档相当庞大和复杂,包含大量图形元素和表格,这些元素和表格的处理也会影响内存消耗。保存为固定页面格式(本例中为 PDF)会进一步增加内存使用量,因为渲染需要在内存中建立两个模型:一个用于源文档,另一个用于输出文档。因此,当运行多个迭代时,由于资源在循环之间未被释放,内存使用量可能会累积。

一旦改进完成,我们将立即通知您。如有任何不便,敬请原谅。