Word 转换为 PDF 的格式问题

麻烦您用我给的测试文件测试一下,因为不是所有表格导出都有问题,我给的测试文件这两个表格导出PDF都会出现表格格式变形的情况。如果您导出的没问题,能截图给我看一下吗?

@tianz 这是我的 pdf 输出和截图。事实上,即使使用 23.9 java 版本也没有问题。请详细说明您使用的环境,如果可能的话,请创建一个简单的应用程序,在我们这边进行测试。
表格结果.zip (408.2 KB)

image.png (14.1 KB)

您好,我下载不了您发的文件,是我没权限吗?

@tianz 我创建了新职位,请尝试重新下载该文件。
表格结果.zip (408.2 KB)

您好,非常感谢您的帮助!经过我昨天多方面测试终于发现问题所在,如果是.doc格式的word转换成pdf是有之前我说的问题的,但是如果用的.docx格式的word就正常了。但是我本地情况有比较复杂,我这边是用的.docx的模板,模板有域,我是先替换域后再用Document.save(String fileName, SaveOptions saveOptions)这个方法将文件存到本地,再用本地的这个文件转成PDF,表格格式还是会出现错乱。所以结论是,1,doc文件转换PDF是会出现表格错乱的清理。2,Document.save()不能将文件存为.docx类型

@tianz 感谢您分享更多详细信息。不幸的是,我无法用最后一个可用的Aspose来重现这个问题。Word for Java版本(24.2)以及您提供的“.docx”文档。我试图通过多种方式将其转换为.doc格式。此外,我试图将“.docx”转换为“.docx“,然后再转换为“.pdf”,但我总是有一个正确的表。如果你以“.doc”格式提供有问题的文档,并提供一个代码或一个简单的应用程序,其中包含你用来处理的代码,这将是非常有用的。转换为pdf时,您使用哪种SaveOptions?

看起来你试图在一页纸上得到两张表。在保存为pdf并检查结果之前,您可以使用以下代码吗

NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (Table table : (Iterable<Table>) tables)
    table.autoFit(AutoFitBehavior.AUTO_FIT_TO_WINDOW);

20240314.zip (8.8 KB)

@vyacheslav.deryushev 您好,我写了一个简单的测试代码,确实如您所说和.doc/.docx没有关系。终于找到了问题的关键所在,其实是html做域内容替换的时候导致的。附件是我测试的文件及代码,希望得到您的帮助,非常感谢!

@tianz 感谢您分享测试项目。我发现文档中最后一个表格有问题。我还尝试用 MS Word 功能插入此 html,结果也一样。默认情况下,在文档中插入 html 时,“AutoFitSettings”(自动匹配设置)不适用于表格,这是正确的行为。请使用以下代码,以避免出现表格拟合问题:

Document document = new Document("输入文档.doc");
DocumentBuilder builder = new DocumentBuilder(document);
try {
    builder.moveToMergeField("html2");
    builder.insertHtml(html, HtmlInsertOptions.USE_BUILDER_FORMATTING);
} catch (Exception e) {
    e.printStackTrace();
}

NodeCollection tables = document.getChildNodes(NodeType.TABLE, true);
for (Table table : (Iterable<Table>) tables) {
    table.autoFit(AutoFitBehavior.AUTO_FIT_TO_CONTENTS);
}

document.save("输出文档.doc");

请注意,我是在最新发布的版本上进行测试的。

image.jpg (377.3 KB)
image.png (34.0 KB)
@vyacheslav.deryushev 您好,使用了您的代码后情况确实有所改善。但是PDF格式第一张表后面几列有被压缩,有的字没显示完全。生成的doc文件第二张表的第一行也是有点变形了的,不知道您那边是否和我的情况一样?

@tianz 以下是我的结果。
结果.zip (498.3 KB)

但我认为我们需要弄清楚您使用的环境。转换是在哪个操作系统中进行的?您使用的 Word 版本是什么?也许还有其他一些东西可以帮助我们得到相同的结果?

另外,也可能是字体问题。请使用以下代码获取字体信息:

try (InputStream ins = new FileInputStream(file)) {
    Files.createFile(convertedPdfFile);
    Document doc = new Document(ins);

    FontInfoCollection allFonts = doc.getFontInfos();
    for (FontInfo font : allFonts)
        System.out.println("Font: " + font.getName());

    HandleDocumentWarnings callback = new HandleDocumentWarnings();
    doc.setWarningCallback(callback);

    try (BufferedOutputStream bos = new BufferedOutputStream(
            new FileOutputStream(convertedPdfFile.toFile()))) {
        doc.save(bos, SaveFormat.PDF);
    }
}

public static class HandleDocumentWarnings implements IWarningCallback {
    public void warning(WarningInfo info) {
        if (info.getWarningType() == WarningType.FONT_SUBSTITUTION) {
            System.out.println("Font substitution: " + info.getDescription());
            FontWarnings.warning(info);
        }
    }

    public WarningInfoCollection FontWarnings = new WarningInfoCollection();
}

这是插入 HTML 后在".doc "文件中使用的字体:

Font: Calibri
Font: 宋体
Font: Times New Roman
Font: Arial
Font: 仿宋
Font: 等线
Font: FangSong
Font: SimSun

如果在 “HandleDocumentWarnings”(处理文档警告)中发现遗漏的字体,请尝试安装并再次检查结果。