24.2最新版本仍然存在目录页码和实际页码不一致的问题

文件保存之后,从某一页开始目录中的页码和实际页码不一致,经过我的验证,可能是因为页面末尾正好包含PAGE_BREAK符号导致

image.jpg (64.8 KB)

PAGE_BREAK符号刚好在页面末尾,导致doc中没有产生新的页面,doc的目录页码错了,但是这个doc文件保存成pdf后这个地方的PAGE_BREAK符号能产生新的页面,且pdf的目录页码也是对的,看上去doc的目录页码显示的是pdf的实际页码,也就是这个PAGE_BREAK符号导致的程序bug

@lang.zhou
We are looking into it and will be sharing our feedback with you shortly.

@lang.zhou

您能否分享更多详细信息,例如示例源文件和输出文件以及您正在使用的示例代码片段。我们将在我们的环境中测试该场景并相应地解决它。

我验证了一下,应该还是字体的问题导致,doc文件里面设置的字体是"仿宋_GB2312",

public static void readFont(){
        try{
            String fontPath = "/home/aspose/fonts";
            FontSettings.getDefaultInstance().setFontsFolders(new String[]{fontPath,"/usr/share/fonts"},false);
        }catch (Exception e){
            LOGGER.error("读取字体文件失败,生成PDF时可能出现中文乱码!",e);
        }

    }

在上述"/usr/share/fonts"路径中没有"仿宋_GB2312字体",但是存在"仿宋"字体,IWarningCallback却没有回调提示缺失"仿宋_GB2312字体",当这两个字体都不存在时才会提示

@lang.zhou

看起来您正在处理 Aspose.Words。我们会尽快回复您。

@lang.zhou 如果可以,请在此提供您的文件以供测试。
如果遇到字体问题,可以尝试配置 SubstitutionSettings。您还可以查看以下示例:https://github.com/aspose-words/Aspose.Words-for-Java/blob/master/Examples/ApiExamples/Java/src/main/java/Examples/ExFontSettings.java

抱歉无法提供原始文件,因为存在一些保密的信息。
我使用的"仿宋_GB2312"字体在服务器和本地电脑都是存在的,而且本地打开word字体正常显示为"仿宋_GB2312",为何生成的pdf中字体不是"仿宋_GB2312",在IWarningCallback没有提示缺失,意味着没有字体被替换,但是word和pdf的最终字体不一样,pdf的目录页码是正常的而word的目录页码不正确,看上去word计算布局时使用的字体并不是"仿宋_GB2312",而是pdf中展示的字体。
这个是否是bug呢?
生成的word如下:
image.png (110.5 KB)
生成的pdf如下:
image.png (187.6 KB)

@lang.zhou 字体通常不会嵌入到 DOCX 文档中,只会指定字体名称,用户应用程序(如 MS Word 或 OpenOffice)会使用系统中可用的字体来渲染文档。

如果您认为文档在加载后没有使用字体,请在加载选项中设置字体文件夹并添加 WarningCallback:

FontSettings fontSettings = new FontSettings();
fontSettings.setFontsFolder(FontsFolder, true);

LoadOptions loadOptions = new LoadOptions();
loadOptions.setWarningCallback(new DocumentLoadingWarningCallback());
loadOptions.setFontSettings(fontSettings);

Document doc = new Document("Document.docx", loadOptions);

...

/// <summary>
/// IWarningCallback that prints warnings and their details as they arise during document loading.
/// </summary>
private static class DocumentLoadingWarningCallback implements IWarningCallback {
    public void warning(WarningInfo info) {
        System.out.println(MessageFormat.format("Warning: {0}", info.getWarningType()));
        System.out.println(MessageFormat.format("\tSource: {0}", info.getSource()));
        System.out.println(MessageFormat.format("\tDescription: {0}", info.getDescription()));
        mWarnings.add(info);
    }

    public ArrayList<WarningInfo> getWarnings() {
        return mWarnings;
    }

    private final ArrayList<WarningInfo> mWarnings = new ArrayList<WarningInfo>();
}

或者,您也可以创建一份简单的文件,其中不包含任何限制性信息,以便我们进行检查。