Search code examples
javapdfunicodepdfboxutf

PDFBox U+00A0 is not available in this font's encoding


I am facing a problem when invoking the setValue method of a PDField and trying to set a value which contains special characters.

field.setValue("TEST-BY  (TEST)")

In detail, if my value contains characters as U+00A0 i am getting the following exception:

Caused by: java.lang.IllegalArgumentException: U+00A0 is not available in this font's encoding: WinAnsiEncoding

A complete stracktrace can be found here: Stacktrace

I currently have set PDType1Font.TIMES_ROMAN as font. In order to solve this problem i tried with other available fonts as well. The same problem persisted.

I found the following suggestion in this answer https://stackoverflow.com/a/22274334/7434590 but since we use the setValue and not any of the methods showText/drawText that can manipulate bytes, i could not use this approach since setValue accepts only string as a parameter.

Note: I cannot replace the characters with others to solve this issue, i must be able to set any kind of supported by the font character in the setValue method.


Solution

  • You'll have to embed a font and not use WinAnsiEncoding:

    PDFont formFont = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/somefont.ttf"), false); // check that the font has what you need; ARIALUNI.TTF is good but huge
    PDResources res = acroForm.getDefaultResources(); // could be null, if so, then create it with the setter
    String fontName = res.add(formFont).getName();
    String defaultAppearanceString = "/" + fontName + " 0 Tf 0 g"; // adjust to replace existing font name
    textField.setDefaultAppearance(defaultAppearanceString);
    

    Note that this code must be ran before calling setValue().

    More about this in the CreateSimpleFormWithEmbeddedFont.java example from the source code download.