首页 > 解决方案 > Nbspace 不可用

问题描述

我正在使用 pdfbox 2.0.9

我有一个只有 acrofrom 的 pdf,我想将 nbspace 字符设置为一个字段:

field.setValue("\u00A0");

但我得到错误:

java.lang.IllegalArgumentException: U+00A0 ('nbspace') is not available in this font Courier encoding: WinAnsiEncoding

我了解当前字段上的字体不支持这些字符。

如何使用 pdfbox2.0.14 获取我的 pdf 中可用的 pdf 字体列表?

该主题可能与如何使用 apache pdf 框将“不间断空格”打印到 pdf 相关?

标签: pdfbox

解决方案


PDF 中的文本字段使用Helv字体。

AcroForm资源字体Helv使用以下编码定义:

5 0 obj
<<
  /Type/Encoding
  /Differences[
    24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring/tilde
    39/quotesingle
    96/grave
   128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin/fraction
      /guilsinglleft/guilsinglright/minus/perthousand/quotedblbase/quotedblleft
      /quotedblright/quoteleft/quoteright/quotesinglbase/trademark/fi/fl/Lslash
      /OE/Scaron/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron
   160/Euro
   164/currency
   166/brokenbar
   168/dieresis/copyright/ordfeminine
   172/logicalnot/.notdef/registered/macron/degree/plusminus/twosuperior
      /threesuperior/acute/mu
   183/periodcentered/cedilla/onesuperior/ordmasculine
   188/onequarter/onehalf/threequarters
   192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
      /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
      /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
      /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
      /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae
      /ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute
      /icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde
      /odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute
      /thorn/ydieresis
  ]
>>
endobj 

由于没有为此字体嵌入字体程序,因此此编码基于StandardEncoding。此基本编码不包含不间断空格。此外,您的差异数组也不添加nbspace

因此,您不能使用该编码绘制不间断的空间,因此也不能使用该Helv字体。

据我所知,PDFBox 在这种情况下不提供替换字体,即如果在设置包含表单字段默认外观字体编码中不支持的字符的值时被要求创建新的文本字段外观。


一种解决方法可能是不要求 PDFBox 生成开始时的外观,而是使用NeedAppearancestrue标记AcroForm,并希望以后的 PDF 处理器/查看器在这种情况下使用替换字体。不能保证这行得通,可能下一个需要外观的处理器也不提供替换字体。尽管如此,至少有这样的机会......

但是,根据 PDFBox 的确切版本,

field.setValue(value);

可能总是触发外观生成。如果是这种情况,您必须像这样设置字段值

field.getCOSObject().setString(COSName.V, value);

推荐阅读