【问题标题】:How to resolve "...is not available in this font's encoding"?如何解决“...在此字体的编码中不可用”?
【发布时间】:2016-10-14 14:37:03
【问题描述】:

所以我使用 PDFBox 来填写一些 pdf。到目前为止一切都很好 - 我用 Avenir Light 字体创建了一个 pdf 格式的表格,我可以填写它。但是,刚刚出现的问题是,当我尝试使用诸如 @987654321 之类的字母填充 pdf 时@、ąć ...我收到以下错误:

U+0142 is not available in this font's encoding: MacRomanEncoding with differences

用不同的数字。

现在,我的问题是 - 我该如何解决这个问题,以便我可以自动填写表格?当我在 Acrobat Reader 中打开 pdf 时,我可以插入这些字母,而且我没有收到任何错误。这是我设置字段的方式:

public void setField(PDDocument document, PDField field, String value ) throws IOException {
    if( field != null && value != null) {
        try{
            field.setValue(value);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    else {
        System.err.println( "No field found with name:" + field.getPartialName() );
    }
}

更新

我一直在尝试像这样上传自己的 Avenir-Light.tff:

PDFont font = PDType1Font.HELVETICA;
PDResources res = new PDResources();
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
String da = "/" + fontName.getName() + " 12 Tf 0 g";
acroForm.setDefaultAppearance(da);

但是,这似乎对打印的字段没有任何影响,并且抛出几乎相同的消息:

U+0104 ('Aogonek') is not available in this font Helvetica (generic: ArialMT) encoding: WinAnsiEncoding

【问题讨论】:

  • 如何在代码中加载 Avenir Light 字体?
  • @IssamELATIF,我没有在我的代码中加载它 - 字体嵌入到 pdf 中。
  • 分享一些关于如何填充 PDField 或单元格的代码,这将有所帮助
  • @IssamELATIF,我更新了我的问题
  • 我不确定这是否适用于某种形式(我已经写了一个答案并暂时将其删除) - 请尝试PDType0Font load(doc, new File("path/Avenir-Light.ttf"), false) 并在您的资源中使用它。

标签: java pdf pdfbox


【解决方案1】:

PDFBox 在 PDType1Font 中定义了 14 种标准字体:

PDType1Font.TIMES_ROMAN
PDType1Font.TIMES_BOLD
PDType1Font.TIMES_ITALI
PDType1Font.TIMES_BOLD_ITALIC
PDType1Font.HELVETICA
PDType1Font.HELVETICA_BOLD
PDType1Font.HELVETICA_OBLIQUE
PDType1Font.HELVETICA_BOLD_OBLIQUE
PDType1Font.COURIER
PDType1Font.COURIER_BOLD
PDType1Font.COURIER_OBLIQUE
PDType1Font.COURIER_BOLD_OBLIQUE
PDType1Font.SYMBOL
PDType1Font.ZAPF_DINGBATS

因此,如果您想使用 Avenir-Light,您必须从 .ttf 文件中加载它。您可以按照@TilmanHausherr 建议的PDType0Font.load(doc, new File("path/Avenir-Light.ttf"), false).

执行此操作
PDFont font = PDType0Font.load(doc, new File("path/Avenir-Light.ttf"), false);
PDResources res = new PDResources();
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
String da = "/" + fontName.getName() + " 12 Tf 0 g";
acroForm.setDefaultAppearance(da);

更新

你知道为什么它还会在以下形式中显示警告:OpenType Layout 字体 Avenir-Light 中使用的表格未在 PDFBox 中实现,并且 会被忽略吗?

Avenir-light 字体使用 PDFBox 尚不支持的 OpenType 布局表格(高级排版)。这种高级排版将被忽略

【讨论】:

  • 你知道为什么它还会显示警告,如果表单是: OpenType Layout tables used in font Avenir-Light 在 PDFBox 中没有实现,将被忽略?
  • 是的,禁用此类 org.apache.pdfbox.pdmodel.font 的日志记录。 log4j 中的 PDCIDFontType2。像这个 log4j.logger.org.apache.pdfbox.pdmodel.font。 PDCIDFontType2=关闭
猜你喜欢
  • 2016-12-11
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多