【问题标题】:Write cyrillic chars into PDF form fields with PDFBox使用 PDFBox 将西里尔字符写入 PDF 表单域
【发布时间】:2017-08-11 17:00:15
【问题描述】:

我正在使用 pdfbox 2.0.5 使用此代码填写 PDF 文档的表单字段:

        doc = PDDocument.load(inputStream);
        PDDocumentCatalog catalog = doc.getDocumentCatalog();
        PDAcroForm form = catalog.getAcroForm();
        for (PDField field : form.getFieldTree()){
            field.setValue("должен");
        }

我收到此错误:U+0434 ('afii10069') 在此字体中不可用 Times-Roman(通用:TimesNewRomanPSMT)编码:StandardEncoding with Difference

PDF 文档本身包含显示良好的西里尔文字。我尝试过使用不同的字体。对于“Arial Unicode MS”,它想下载一个 50MB 的“Adobe Acrobat Reader DC Font Pack”。这是对西里尔字符的要求吗?

我必须在文本字段中指定哪种字体来处理西里尔文(或亚洲)字符?

谢谢, 罗波

【问题讨论】:

  • 当我在 Acrobat Reader 上打开 PDF 时,我可以在输入字段中输入西里尔字符
  • PDFBox 仅使用为表单域指定的字体,而某些 PDF 查看器在指定字体缺少所需字符时使用额外的备用字体。因此,要指定的字体必须包含您可能插入的所有字形。不幸的是,您没有展示您如何创建表单,而只是展示了您如何填写。因此,很难说出如何更好地创建它...
  • 感谢您的回复。您是否有说明我应该如何创建 PDF 以使其正常工作。我正在使用 Acrobat Pro。还有其他/更好的编辑器吗?我可以为表单字段选择一种字体,但不知道哪种字体包含西里尔字形。我使用 Arial 作为文本字体,字符在文本中正确显示,但我仍然无法将西里尔字符插入表单字段。任何人都应该可以查看/打印带有填写表单字段的最终 PDF 文件,而无需先安装字体包。
  • 我只是在这里尝试使用我的旧 Adob​​e Acrobat 9.5 创建一个具有适当字体的表单域。不幸的是,该字体仅使用 WinAnsiEncoding 嵌入,其中不包含西里尔字符形。
  • 我发现了这个问题:issues.apache.org/jira/browse/PDFBOX-3138 说“该字段使用的嵌入字体确实包含希伯来字形,以及可用于查找这些字形的有效“cmap”表。提到的字体中确实存在U+05D7字符。嵌入的字体文件是OpenType格式,但是PDF字体字典是Type1并指定WinAnsiEncoding,不包括希伯来字符。所以严格来说,该字段不能使用任何非 ANSI 字符填充,因此 PDFBox 的行为是正确的。”

标签: java pdf fonts pdfbox acrobat


【解决方案1】:

Adobe 通过重用 {/Ubuntu} 字体中的嵌入字体文件来处理这个问题,并从中创建一个新的字体资源。这是一个快速技巧,可以作为如何实现类似目标的指南。该代码特定于我的示例。

PDDocument doc = PDDocument.load(new File(...));
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
PDResources formResources = acroForm.getDefaultResources();
PDTrueTypeFont font = (PDTrueTypeFont) formResources.getFont(COSName.getPDFName("Ubuntu"));

// here is the 'magic' to reuse the font as a new font resource
TrueTypeFont ttFont = font.getTrueTypeFont();

PDFont font2 = PDType0Font.load(doc, ttFont, true);
ttFont.close();

formResources.put(COSName.getPDFName("F0"), font2);

PDTextField formField = (PDTextField) acroForm.getField("Text2");
formField.setDefaultAppearance("/F0 0 Tf 0 g");
formField.setValue("öäüинформацию");

doc.save(...);
doc.close();

【讨论】:

  • 感谢这个伟大的解决方法。我知道你这几天很忙。我也希望你能尽快收到邮寄的礼物
  • 我有一个类似的问题,通过使用 PDType0Font.load 而不是 PDTrueTypeFont.loadTTF 得到了解决。
  • PDType0Font.load(doc, ttFont, true); 应更正为 PDType0Font.load(doc, ttFont, false); 以避免子集。
【解决方案2】:

解决方案很简单: form.setNeedAppearances(true);

然后我删除该字段的蓝色框: field.setReadOnly(true);

【讨论】:

  • 只要使用 Adob​​e Reader 查看表单就可以正常工作,但其他查看器(PDFBox,可能还有 PDF.js)不会显示更改。
  • 哦不!我能做什么?
  • 对不起,我不知道。正如我在邮件中所说,我不是 acroform 专家 :-( 我会在邮件列表中写一些想法。
猜你喜欢
  • 1970-01-01
  • 2015-04-18
  • 2017-04-19
  • 2021-12-31
  • 2011-10-15
  • 2012-10-27
  • 2011-12-06
  • 2016-06-15
  • 2018-12-31
相关资源
最近更新 更多