麻烦您用我给的测试文件测试一下,因为不是所有表格导出都有问题,我给的测试文件这两个表格导出PDF都会出现表格格式变形的情况。如果您导出的没问题,能截图给我看一下吗?
@tianz 这是我的 pdf 输出和截图。事实上,即使使用 23.9 java 版本也没有问题。请详细说明您使用的环境,如果可能的话,请创建一个简单的应用程序,在我们这边进行测试。
表格结果.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”(处理文档警告)中发现遗漏的字体,请尝试安装并再次检查结果。