中文填充pdf字段出现乱码

Filling pdf fields with Chinese characters garbled

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

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

他们都可以把字符放到字段里,就是不显示。当我单击该字段进行编辑时,字符按预期显示,但当我再次单击该字段外时,它们消失了。如果我输入英文,它们会显示错误,例如 "hello" 变成 "IFMMP".

这一切让我怀疑这是 fonts/character 地图的问题,我尝试将完整字体嵌入到 pdf 中,但没有任何区别。我在机器上安装了字体都没有用

如果我编辑 pdf 并在 Acrobat 中填写字段,它可以毫无问题地接受中文字符,我可以在 reader 中查看 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

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

如果您尝试使用 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取代。

作为另一种解决方案,您还可以指示 Adob​​e 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 在那个时间点无法处理。