我正在使用docx4j创建pdf文件,使用docx格式正确呈现语言环境语言,但将pdf#替换为语言环境字符串。
在文件中我看到了
当docx4j用于创建PDF时,它只能使用可用的字体。 这些字体来自两个来源:
- >计算机上安装的那些
- >文件中嵌入的那些
请注意,Word会静默执行字体替换。当您在Word中打开现有文档并选择特定字体的文本时,如果计算机上未安装或嵌入在文档中,则您在屏幕上看到的实际字体将不是功能区中报告的字体。若要查看Word 2007是否替换字体,请转到Word选项>高级>显示文档内容并按“字体替换”按钮。
docx4j无法使用Word的字体替换信息。作为开发人员,您有3个选项:
- >确保已安装或嵌入字体
- >告诉docx4j使用哪种字体,或
- >允许docx4j回退到默认字体
要在文档中嵌入字体,请在安装了字体的计算机上的Word中打开它(检查 没有替换发生),并转到Word选项>保存>在文件中嵌入字体
但这似乎不起作用。
以下是我的代码:
Mapper fontMapper = new IdentityPlusMapper();
PhysicalFont font = PhysicalFonts.getPhysicalFonts().get(
"Comic Sans MS");
fontMapper.getFontMappings().put("Algerian", font);
template.setFontMapper(fontMapper);
PdfSettings pdfSettings = new PdfSettings();
org.docx4j.convert.out.pdf.PdfConversion conversion = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(
template);
OutputStream out = new FileOutputStream(f1);
conversion.output(out, pdfSettings);
上面的代码字体是Algerain
非常感谢任何帮助。
答案 0 :(得分:1)
发布此答案是因为我看到这个问题多次使用UTF编码,希望这篇文章有所帮助。 这段代码解决了上述问题。
File f = new File("/path/to/sample.docx");
template.save(f);
File f1 = new File("/path/to/sample.pdf");
Runtime.getRuntime().exec("doc2pdf " + f);
如果sample.docx是我们的输入docx文件,包含任何国际语言,如中文等,它将被转换为具有相同文件名和相同路径的pdf。
这是因为Runtime.getRuntime().exec("doc2pdf " + f);
这段代码在java程序中使用unbuntu作为操作系统运行终端命令doc2pdf,在此之前我们需要从终端安装sudo apt-get install unoconv
这是 doc2pdf 命令工作。
答案 1 :(得分:0)
可以提取嵌入字体并手动使用,如下所示:
Mapper fontMapper = new IdentityPlusMapper();
wordMLPackage.setFontMapper(fontMapper);
FontTablePart fontTablePart= wordMLPackage.getMainDocumentPart().getFontTablePart();
fontTablePart.processEmbeddings();
Set<String> fontsInUse = wordMLPackage.getMainDocumentPart().fontsInUse();
// Make each embedded font available to the font mapper.
for(String s : fontsInUse) {
PhysicalFont physicalFont = PhysicalFonts.get(s);
fontMapper.put(s, physicalFont);
}
// Now you can access your fonts, such as 'Comic Sans' or 'Arial Unicode MS'.
PhysicalFont font = PhysicalFonts.getPhysicalFonts().get(
"Comic Sans MS");
fontMapper.put(Mapper.FONT_FALLBACK, font);