【发布时间】:2022-12-17 08:37:26
【问题描述】:
我有一个要转换为 PDF 的 docx 文件。我在 Linux 上使用 docx4j-export-fo 通过 XSL-FO 转换它。每次我转换带有图像的文档时,一些图像都会保存在 /tmp 文件夹中。我发现这是因为 AbstractConversionImageHandler.java,它在使用 XSL-FO 时将始终存储图像。
我尝试设置“ImageDirPath”FoSetting,但它是忽略页眉/页脚图像在计算页眉/页脚区域大小时。它仅适用于文档正文中的图像。
此设置在“FopAreeTreeHelper”中被忽略,它使用 FOP 和一些默认设置计算页眉/页脚区域。所以如果有图像,它将是保存到默认的“/tmp”目录。
这是我将 doc 转换为 pdf 的代码:
private static final String TEMP_IMAGE_DIR_PATH = "/tmp/images";
public static void convert(WordprocessingMLPackage wordMLPackage, OutputStream output) throws Exception {
Mapper fontMapper = new BestMatchingMapper();
wordMLPackage.setFontMapper(fontMapper);
FOSettings foSettings = new FOSettings(wordMLPackage);
foSettings.setApacheFopMime("application/pdf");
foSettings.setImageDirPath(TEMP_IMAGE_DIR_PATH);
foSettings.setFoDumpFile(null);
FopFactoryBuilder fopFactoryBuilder = FORendererApacheFOP.getFopFactoryBuilder(foSettings) ;
FopFactory fopFactory = fopFactoryBuilder.build();
FOUserAgent foUserAgent = FORendererApacheFOP.getFOUserAgent(foSettings, fopFactory);
Docx4J.toFO(foSettings, output, Docx4J.FLAG_EXPORT_PREFER_XSL);
// Clean up, so any ObfuscatedFontPart temp files can be deleted
if (wordMLPackage.getMainDocumentPart().getFontTablePart()!=null) {
wordMLPackage.getMainDocumentPart().getFontTablePart().deleteEmbeddedFontTempFiles();
}
foSettings = null;
wordMLPackage = null;
FileUtils.deleteDirectory(new File(TEMP_IMAGE_DIR_PATH));
}
只有文档正文中的图像会保存到“TEMP_IMAGE_DIR_PATH”中,然后我将其删除。但标题图像保存在“/tmp”文件夹中。但我不想从“/tmp”中删除所有图像。
有没有办法让 Docx4j 或 FOP 在转换后删除这些图像? 或者设置默认目录?
【问题讨论】:
-
你很好地分析了这个问题。 FopAreeTreeHelper 需要修补才能将临时图像写入其他目录。
标签: java apache-fop docx4j