在pdfbox中打印汉字 [英] Printing Chinese characters in pdfbox

查看:119
本文介绍了在pdfbox中打印汉字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下设置:

  • Java 11.0.1

  • Java 11.0.1

pdfbox 2.0.15

pdfbox 2.0.15

目标:渲染包含汉字的pdf

Objective: Rendering a pdf that contains Chinese characters

问题:java.lang.IllegalArgumentException:U+674E 在此字体的编码中不可用:WinAnsiEncoding

Problem: java.lang.IllegalArgumentException: U+674E is not available in this font's encoding: WinAnsiEncoding

我已经试过了:

  • 使用不同的字体来支持汉字.最新的是 NotoSansCJKtc-Regular.ttf

  • Using different fonts for Chinese character support. The latest one is NotoSansCJKtc-Regular.ttf

按照此处所述将字体设置为 unicode:Java:使用 PDFBox 将国家字符写入 PDF,但不推荐使用 loadTTF 方法.

Set font to unicode as described here: Java: Write national characters to PDF using PDFBox, however the used loadTTF method is deprecated.

使用 Arial-Unicode-MS_4302.ttf

Using Arial-Unicode-MS_4302.ttf

我的代码看起来像这样(缩短了一点):

My code looks like this (shortened a bit):

try (InputStream pdfIn = inputStream; PDDocument pdfDocument =
             PDDocument.load(pdfIn)) {

      PDFont formFont;
      //Check if Chinese characters are present
      if (!Util.containsHanScript(queryString)) {
        formFont = PDType0Font.load(pdfDocument,
            PdfReportGenerator.class.getResourceAsStream("LiberationSans-Regular.ttf"),
            false);
      } else {
        formFont = PDType0Font.load(pdfDocument,
            PdfReportGenerator.class.getResourceAsStream("NotoSansCJKtc-Regular.ttf"),
            false);
      }

        List<PDField> fields = acroForm.getFields();

        //Load fields into Map
        Map<String, PDField> pdfFields = new HashMap<>();
        for (PDField field : fields) {
          String key = field.getPartialName();
          pdfFields.put(key, field);
        }

        PDField currentField = pdfFields.get("someFieldID");
        PDVariableText pdfield = (PDVariableText) currentField;

        PDResources res = acroForm.getDefaultResources();
        String fontName = res.add(formFont).getName();
        String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";

        pdfield.setDefaultAppearance(defaultAppearanceString);
        pdfield.setValue("李柱");

      acroForm.flatten(fields, true);

      ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
      pdfDocument.save(pdfOut);
}

预期结果:pdf 上的汉字.

Expected result: Chinese characters on pdf.

实际结果:java.lang.IllegalArgumentException:U+674E 在此字体的编码中不可用:WinAnsiEncoding

Actual result: java.lang.IllegalArgumentException: U+674E is not available in this font's encoding: WinAnsiEncoding

所以我的问题是关于如何最好地支持使用 pdfbox 渲染汉字.任何帮助表示赞赏.

So my question is about how to best support rendering of Chinese characters with pdfbox. Any help is appreciated.

推荐答案

以下代码对我有用,它使用了 PDFBOX-4629:

The following code works for me, it uses the file of PDFBOX-4629:

PDDocument doc = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12977270/Report_Template_DE.pdf").openStream());
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
PDVariableText field = (PDVariableText) acroForm.getField("search_query");
List<PDField> fields = acroForm.getFields();
PDFont font = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/arialuni.ttf"), false);

PDResources res = acroForm.getDefaultResources();
String fontName = res.add(font).getName();
String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";

field.setDefaultAppearance(defaultAppearanceString);
field.setValue("李柱");

acroForm.flatten(fields, true);
doc.save("saved.pdf");
doc.close();

这篇关于在pdfbox中打印汉字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆