我在调用PDField的setValue方法并尝试设置包含特殊字符的值时遇到问题.
field.setValue("TEST-BY (TEST)")
详细地说,如果我的值包含字符为U 00A0,则会出现以下异常:
Caused by: java.lang.IllegalArgumentException: U+00A0 is not
available in this font’s encoding: WinAnsiEncoding
完整的stracktrace可以在这里找到:Stacktrace
我目前已将PDType1Font.TIMES_ROMAN设置为字体.为了解决这个问题,我尝试了其他可用的字体.同样的问题仍然存在.
我在这个答案https://stackoverflow.com/a/22274334/7434590中找到了以下建议,但由于我们使用setValue而不是任何可以操作字节的方法showText / drawText,我无法使用这种方法,因为setValue只接受字符串作为参数.
注意:我不能用其他人替换字符来解决这个问题,我必须能够设置setValue方法中字体字符所支持的任何类型.
最佳答案 您必须嵌入字体而不使用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示例.