文件保存之后,从某一页开始目录中的页码和实际页码不一致,经过我的验证,可能是因为页面末尾正好包含PAGE_BREAK符号导致
image.jpg (64.8 KB)
PAGE_BREAK符号刚好在页面末尾,导致doc中没有产生新的页面,doc的目录页码错了,但是这个doc文件保存成pdf后这个地方的PAGE_BREAK符号能产生新的页面,且pdf的目录页码也是对的,看上去doc的目录页码显示的是pdf的实际页码,也就是这个PAGE_BREAK符号导致的程序bug
我验证了一下,应该还是字体的问题导致,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 如果可以,请在此提供您的文件以供测试。
如果遇到字体问题,可以尝试配置 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>();
}
或者,您也可以创建一份简单的文件,其中不包含任何限制性信息,以便我们进行检查。