填写带有中文字符的pdf字段乱码

时间:2015-03-18 10:01:11

标签: pdf utf-8 autofill pdftk

我正在尝试用fdf或xfdf填充带有中文字符的pdf字段。

到目前为止,我已经尝试过,pdftk,mcpdf,pdfbox和fpdm。

他们都可以将角色带入​​场地,但他们不会显示。当我点击要编辑的字段时,字符会按预期显示,但当我再次单击该字段时,它们会消失。如果我输入英文,他们显示不正确,例如"你好"成为" IFMMP"。

这一直让我怀疑它是字体/字符映射的问题,我尝试将完整的字体嵌入到pdf中并没有任何区别。我在机器上安装了字体无济于事。

如果我编辑pdf并填写Acrobat中的字段,它会毫无问题地接受中文字符,我可以在阅读器中查看pdf。我尝试在同一台Windows机器上使用命令行中的pdftk,我遇到了同样的问题。

我需要这个在Linux环境中工作,最好是在python中或通过命令行脚本工作,但是在这一点上我真的很想看到它的工作原理!我附上了样本pdf,fdf,xfdf以及它正在创建的输出,任何帮助都会非常感激,因为我已经没有想法了。我一直在使用命令:

"pdftk test_form.pdf fill_form test.xfdf output output.pdf verbose"

https://drive.google.com/folderview?id=0B6ExNaWGFzvnfnJHSC1ZdXhSU2RQVENjYW56UkZyYWJMdWhZTkpQYkZBcUs0Tjhjb0NITVE&usp=sharing

1 个答案:

答案 0 :(得分:4)

填写表单字段时,将填充字段值,并且(可选)生成表单字段的可视外观,以反映新设置的值。因此,当您单击表单字段时看到该值的原因是将显示字段值,但只要该字段未激活,就会使用字段外观。

如果您尝试使用PDFBox 1.8设置值,则可以尝试使用PDFBox 2.0,因为现在支持unicode并重新生成外观。

您还需要确保您填写表单的系统上可以使用表单中使用的字体。否则使用PDFBox 2.0可能会收到类似于

的错误消息
Warning: Using fallback font 'TimesNewRomanPSMT' for 'MingLiU'
Exception in thread "main" java.lang.IllegalArgumentException: No glyph for U+5185 in font MingLiU

由于MingLiU在系统上不可用,它已被TimesNewRomanPSMT所取代,而且没有所需的角色。

作为另一种解决方案,您还可以指示Adobe Reader在使用

打开表单时为您计算外观
PDAcroForm form = doc.getDocumentCatalog().getAcroForm();
form.setNeedAppearances(true);

再次使用PDFBox 2.0

我使用PDFBox 2创建了一个小样本但是从头开始创建一个表单以测试它是否可以处理中文文本

// create a new PDF document
PDDocument doc = new PDDocument();
PDPage page = new PDPage();

// add a new AcroForm and add that to the document
PDAcroForm form = new PDAcroForm(doc);
doc.getDocumentCatalog().setAcroForm(form);

// Add and set the resources and default appearance at the form level
PDFont font = PDType0Font.load(doc, new File("/Library/Fonts/Arial Unicode.ttf"));
PDResources res = new PDResources();
COSName fontName = res.add(font);
form.setDefaultResources(res);
String da = "/" + fontName.getName() + " 12 Tf 0 g";
form.setDefaultAppearance(da);

// add a page to the document 
doc.addPage(page);

// add a form field to the form
PDTextField textBox = new PDTextField(form);
textBox.setPartialName("Chinese");
form.getFields().add(textBox);

// specify the annotation associated with the field
// and add it to the page
PDAnnotationWidget widget = textBox.getWidget();
PDRectangle rect = new PDRectangle(100f,300f,120f,350f);
widget.setRectangle(rect);
page.getAnnotations().add(widget);

// set the field value
textBox.setValue("木兰辞");
doc.save("ChineseOut.pdf");

工作正常。我还测试了你正在使用的字体,不幸的是,这有一个错误,因为MingLiU是一个TrueType集合,PDFBox在那个时间点无法处理。