有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用docx4j创建pdf文件,使用docx格式,区域设置语言正确呈现,但使用pdf替换为区域设置字符串

在我看到的文件中

当使用docx4j创建PDF时,它只能使用可用的字体。 这些字体来自两个来源:

->;那些安装在计算机上的

->;文件中嵌入的那些

请注意,Word以静默方式执行字体替换。在Word中打开现有文档并选择特定字体的文本时,如果未安装在计算机上或未嵌入文档中,屏幕上显示的实际字体将不会是功能区中报告的字体。要查看Word 2007是否正在替换字体,请进入Word选项>;高级>;显示文档内容并按“字体替换”按钮

Word的字体替换信息对docx4j不可用。作为一名开发人员,您可以选择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) 个答案

  1. # 1 楼答案

    嵌入式字体可以手动提取和使用,如下所示:

        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);
    
  2. # 2 楼答案

    发布这个答案是因为我看到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);
    

    如果是样品。docx是我们的输入docx文件,包含任何国际语言,如中文等。它将被转换为具有相同文件名和相同路径的pdf

    这是因为Runtime.getRuntime().exec("doc2pdf " + f);这段代码在java程序中运行终端命令doc2pdf,并将unbuntu作为操作系统,在此之前,我们需要从终端安装sudo apt-get install unoconv这是为了让doc2pdf命令工作