Пространство недоступно - PullRequest
1 голос
/ 05 марта 2019

Я использую pdfbox 2.0.9

У меня есть 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?

Эта тема может быть связана Как напечатать `Неразрывный пробел` в pdf, используя apache pdf box?

1 Ответ

1 голос
/ 06 марта 2019

В текстовых полях вашего PDF используется шрифт Helv .

Шрифт AcroForm resources 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 . Эта базовая кодировка не содержит неразрывного пробела. Более того, ваш массив Differences также не добавляет nbspace .

Таким образом, вы не можете нарисовать неразрывный пробел, используя эту кодировку и, следовательно, также не используя этот Helv шрифт.

Насколько мне известно, PDFBox не предоставляет заменяющие шрифты в таком случае, то есть, если его попросили создать новый внешний вид текстового поля при настройке значения, содержащего символ, который не поддерживается в кодировке шрифта внешнего вида по умолчанию для поля формы.


Один из обходных путей может заключаться в том, чтобы не просить PDFBox создать внешний вид для начала, вместо этого пометьте AcroForm значением NeedAppearances true и надеюсь, что в таком случае более поздний процессор / программа просмотра PDF будет использовать заменяющий шрифт. Нет гарантии, что это сработает, возможно, следующий процессор, который нуждается в внешнем виде, также не предоставляет сменные шрифты. Тем не менее, по крайней мере, есть шанс, что это так ...

В зависимости от точной версии PDFBox, однако,

field.setValue(value);

может всегда вызывать генерацию внешнего вида. Если это так, вы должны установить значение поля следующим образом:

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