我正在使用pdfbox 1.8,我正在尝试填写带有中文字符的pdf表单,但我得到的只是奇怪的字符。我有一个ttc文件(uming.ttc)并使用font forge我导出了ttf文件(现在我尝试只使用其中一种导出的字体)。
使用
加载字体 InputStream is = ..
PDTrueTypeFont font = PDTrueTypeFont.loadTTF(doc, is);
我正在使用以下代码编写pdf字段(我在stackoverflow中找到了这个代码,但目前我无法找到它)
protected void setPDFFieldAndFont(String fieldName, String keyFontName, Object... values) {
try {
PDField pdField = pdfForm.getField(fieldName);
if (pdField == null) {
return;
}
// append fields to create a new textfield
Filler filler = new Filler();
filler.append(values);
String textFieldString = filler.toString();
String fontName = key2FontName.get(keyFontName);
COSDictionary dict = pdField.getDictionary();
COSString defaultAppearance = (COSString) dict
.getDictionaryObject(COSName.DA);
if (defaultAppearance != null)
{
dict.setString(COSName.DA, "/" + fontName + " 11 Tf");
}
if (pdField instanceof PDTextbox)
{
PDTextbox textbox = new PDTextbox(pdfForm, dict);
//PDTextbox textbox = (PDTextbox) pdField;
textbox.setValue(textFieldString);
}
} catch (IOException e) {
throw new IllegalStateException("Invalid field name: " + fieldName, e);
}
}
我已经读过pdfbox2.0支持unicode我需要使用这个新版本吗?
使用font-forge我看到我的ttf字体编码为ISO-10646-1。
感谢您的帮助
EDITED
正如Tilman Hausherr所说,我尝试了EmbeddedFonts.java并且它工作正常,但我以不同的方式填写表单。我创建了一个主要样本:
public static void main(String[] args) throws IOException {
String pdfform = "D:\\form.pdf";
PDDocument doc = PDDocument.load(new File(pdfform));
PDType0Font font = PDType0Font.load(doc, new File("D:\\fonts\\UMingCN.ttf"));
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
PDResources res = acroForm.getDefaultResources();
if (res == null){
res = new PDResources();
}
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
PDField pdField = acroForm.getField("personalInformation_fullName");
if (pdField == null) {
return;
}
COSDictionary dict = pdField.getCOSObject();
COSString defaultAppearance = (COSString) dict.getDictionaryObject(COSName.DA);
if (defaultAppearance != null)
{
dict.setString(COSName.DA, "/" + fontName.getName() + " 11 Tf");
}
if (pdField instanceof PDTextField)
{
PDTextField textbox = new PDTextField(acroForm);
textbox.getCOSObject().addAll(dict);
textbox.setValue("保保保");
}
doc.save("example2.pdf");
doc.close();
}
但它没有填充任何东西。在调试中,代码转到textbox.setValue,但保存的pdfform没有在pdf中设置的值。 可能我错过了什么......
再次感谢