PDFBox U + 00A0 недоступен в кодировке этого шрифта


Я столкнулся с проблемой при вызове метода setValue PDField и попытке установить значение, которое содержит специальные символы.

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

Подробно, если мое значение содержит символы как U+00A0, я получаю следующее исключение:

Вызвано: java.яз..IllegalArgumentException: U+00A0 не является доступно в кодировке этого шрифта: WinAnsiEncoding

Полный stracktrace можно найти здесь: Stacktrace

В настоящее время я установил PDType1Font.TIMES_ROMAN как шрифт. Чтобы решить эту проблему, я попытался использовать и другие доступные шрифты. Та же проблема не исчезла.

Я нашел следующее предложение в этом ответе https://stackoverflow.com/a/22274334/7434590 но поскольку мы используем setValue, а не любой из методов showText/drawText, которые могут манипулировать байтами, я не мог использовать этот подход, так как setValue принимает только строку в качестве параметра.

Примечание : я не могу заменить символы с другими, чтобы решить эту проблему, я должен быть в состоянии установить любой поддерживаемый символ шрифта в методе setValue.

1 4

1 ответ:

Вам придется встроить шрифт и не использовать 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);
Обратите внимание, что этот код должен быть выполнен перед вызовом setValue(). Подробнее об этом в Разделе CreateSimpleFormWithEmbeddedFont.java пример из загрузки исходного кода.