请问使用aspose.word解析文档,我们有两个环境:本地环境和测试环境。

请问使用aspose.word解析文档,我们有两个环境:本地环境和测试环境。
两个环境的 aspose jar包一致、license文件一致、解析目标文档一致,为什么两个环境下解析文档时,判断文档中的某个表格是否跨页的结果会不一样呢?在本地环境中的结果是正确的,测试环境中的结果是错误的。定位不出来问题在哪

@ouchli 如果可能的话,您能否附上您的输入文档和示例代码,以便我们重现该问题? 我们将检查该问题并为您提供更多信息。

使用文档:
文档.docx (61.7 KB)
文档中的表格3 实际是没跨页的,本地环境的结果也是没跨页的,但是测试环境的结果是跨页了的

示例代码:

public static int getNodeSpan(LayoutCollector layoutCollector, Node node) {
        // 跨行
        int span = 0;
        try {
            span = layoutCollector.getNumPagesSpanned(node);
        } catch (Exception e) {
            log.error("获取节点跨页数失败,原因" + e.getMessage());
            return span;
        }
        return span;
    }

if (getNodeSpan(layoutCollector, table) > 0) {
    说明节点跨页了
}

@ouchli 出现该问题很可能是因为文档中使用的字体在处理文档的环境中不可用。 如果 Aspose.Words 找不到文档中使用的字体,则字体被替换。 由于字体规格的差异,这可能会导致布局差异,并导致页面检测不正确。 您可以实现 IWarningCallback 以在执行字体替换时收到通知。
以下文章可能对您有用:
https://docs.aspose.com/words/java/specify-truetype-fonts-location/
https://docs.aspose.com/words/java/install-truetype-fonts-on-linux/

谢谢,那我怎么做才能避免字体被替换的情况呢?
实现 IWarningCallback 只是可以在执行字体替换时收到通知,还是不能避免这种情况发生的吧

@ouchli 您应该安装所需的字体或按照此处所述提供它们:
https://docs.aspose.com/words/java/specify-truetype-fonts-location/
https://docs.aspose.com/words/java/install-truetype-fonts-on-linux/

没有字体就不可能构建文档布局。

您好,我也正在做用aspose.words的分页计算功能,我们用的PageCount属性。
看您提供的源代码,我感觉您在用另外一个方法。

能否方便向您学习一下,了解一下您的解决方案。

我的邮箱是:vs6060@qq.com

谢谢

https://forum.aspose.com/t/aspose-word/279432/4

@vs6060_qq_com 我使用了这样的简化版本的代码:

Document doc = new Document("C:\\Temp\\in.docx");
LayoutCollector collector = new LayoutCollector(doc);
for (Table t : (Iterable<Table>)doc.getChildNodes(NodeType.TABLE, true))
{
    if (t.getAncestor(NodeType.HEADER_FOOTER) != null)
        continue;

    System.out.println(collector.getNumPagesSpanned(t));
}

您应该注意,MS Word 文档本质上是流动的,并且不包含有关文档布局的任何信息。 MS Word 等消费者应用程序可以将文档动态重排为页面。 为了构建准确的文档布局,需要如上所述的字体。

Document document = new Document(new ByteArrayInputStream(bytes));
FontSubstitutionWarning callback = new FontSubstitutionWarning();
document.setWarningCallback(callback);
WarningInfoCollection fontSubstitutionWarnings = callback.warningInfoCollection;
log.info("监视字体替换警告开始");
if (Objects.nonNull(fontSubstitutionWarnings))
{
    for (WarningInfo fontSubstitutionWarning : fontSubstitutionWarnings)
    {
        if (WarningType.FONT_SUBSTITUTION == fontSubstitutionWarning.getWarningType())
        {
            log.info(fontSubstitutionWarning.getDescription());
        }
    }
}
log.info("监视字体替换警告结束");

您好,请问我使用这样的代码,可以做到监视字体替换吗,我运行的时候就不行的,请问哪里有问题呢

@ouchli 对文档执行某些操作时会显示警告。 构建文档布局时会执行字体替换。 因此,您应该调用 Document.UpdatePageLayout 或将文档保存为固定页面格式,例如 PDF。

请问应该在哪一步调用 Document.UpdatePageLayout,我这样子调用还是不行

Document document = new Document(new ByteArrayInputStream(bytes));
document.updatePageLayout();
FontSubstitutionWarning callback = new FontSubstitutionWarning();
document.setWarningCallback(callback);
WarningInfoCollection fontSubstitutionWarnings = callback.warningInfoCollection;
log.info("监视字体替换警告开始");
if (Objects.nonNull(fontSubstitutionWarnings)) {
    for (WarningInfo fontSubstitutionWarning : fontSubstitutionWarnings) {
        if (WarningType.FONT_SUBSTITUTION == fontSubstitutionWarning.getWarningType()) {
            log.info(fontSubstitutionWarning.getDescription());
        }
    }
}
log.info("监视字体替换警告结束");

@ouchli 您应该在指定回调后调用 Document.UpdatePageLayout