当前位置: 首页 > 知识库问答 >
问题:

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

阙沛
2023-03-14

我使用docx4j创建pdf文件,使用docx格式可以正确呈现语言环境,但使用pdf#替换为语言环境字符串。

在我看到的文件中

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

-

-

请注意,Word会自动执行字体替换。当您在Word中打开现有文档并选择特定字体的文本时,如果您的计算机上没有安装该字体或该字体没有嵌入到文档中,则您在屏幕上看到的实际字体将不是功能区中报告的字体。要查看Word 2007是否正在替换字体,请进入Word选项

docx4j无法使用Word的字体替换信息。作为开发人员,您有三种选择:

-

-

-

要在文档中嵌入字体,请在安装了该字体的计算机上的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);

上面代码字体是阿尔及利亚语

任何帮助都将不胜感激。

共有2个答案

韩志专
2023-03-14

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

    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);
鲍驰
2023-03-14

发布这个答案是因为我多次看到这个问题是用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。

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

 类似资料:
  • 我正在使用"pdfbox-app-2.0.0-RC2.jar" 我创建了一个类,它缩小了pdf内容,并在指定的坐标处创建了带有此内容的新pdf。 我的问题是,如果一个pdf文件被修改并添加了新内容,那么缩小后的文件中就会缺少这些内容。 以下是我的方法:

  • 我正在尝试一个用户界面3.5,所有组件都工作正常,除了selectonemenu,它不能正确渲染。 它的文本字段在选择任何下拉字段时不显示。 我不能发布图片,因为我没有那么多的声誉 代码 屏幕拍摄 我怎样才能解决这个问题?

  • Localhost很好,但上传到服务器时不工作 %pdf-1.3 1 0 obj<>Endobj2 0 obj<>Endobj3 0 obj<>>/Mediabox[0.000 0.000 595.280 841.890]>>Endobj4 0 obj<>stream x 2 300 p@&b m-l l,br b 5 jr k drr f b k endstream endobj 8 0 obj

  • 问题内容: 我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码 该 navigationManagerSystem bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/sy

  • 问题内容: 当我跑步时,我得到警告: 全局初始化失败:BadValue无效或未设置用户区域设置。请确保正确设置LANG和/或LC_ *环境变量。 问题答案: 生成语言环境 缺少的语言环境是使用locale-gen生成的: 或者,可以使用localedef:[1]手动创建区域设置文件。 设置区域设置 可以如下设置区域设置(在示例中为): 该命令将在Debian下打开一个对话框,用于选择所需的语言环境

  • 我在拉拉维尔4号修建路线时遇到了麻烦 我的路线。php是: http://paste.laravel.com/v92 当我打主页没有在我的网址它的工作和Pagecontroller@showHomepage。当我试图在我的网址像en或nl的语言环境达到它也工作和加载Pagecontroller@showHomepage。 所以:/- 在管理组中,任何相同的事情都不起作用。如果我尝试在没有区域设置的