使用doc4j创建的Pdf无法正确呈现区域设置文本

时间:2014-10-29 05:06:14

标签: java locale docx4j

我正在使用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

非常感谢任何帮助。

2 个答案:

答案 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);