当前位置: 首页 > 知识库问答 >
问题:

用乱码汉字填充pdf字段

壤驷阳冰
2023-03-14

我试图用fdf或xfdf中的汉字填充pdf字段。

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

它们都可以将字符输入字段,但不会显示。当我点击要编辑的字段时,字符按预期显示,但当我再次点击字段外时,字符消失。如果我输入的是英语,它们就会显示错误,例如“hello”变成“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

共有1个答案

孟沛
2023-03-14

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

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

因为明流在系统上不可用,所以它已被TimesNewRomanPSMT取代,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");

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

 类似资料:
  • 下面是我恢复出来的建表的数据结构,但里面的备注的汉字都成乱码了?这种情况可以用什么办法把乱码恢复成正确的汉字吗?

  • 字体Adobe希伯来文 文本方向RTL 我试过平场和不平场。 当字段没有平坦化时,在使用Acrobat Reader打开生成的PDF后,我看到了我的字段,但它是空的。只有在我点击该字段后,该字段的内容才会正确出现。当我在Chrome上查看PDF时,字段不会出现(或者它可能在那里,但里面没有文本)。 编辑:测试PDF可从这里下载

  • 我有PDF模板文件与字段。客户创建的模板。它有一些文本、字段标签和字段本身。文本和标签使用嵌入在模板中的某种字体。 当我尝试用西里尔文值填充字段时会出现问题-结果文档中没有西里尔文符号。 所以问题是:1。如果我可以嵌入字体在Adobe Acrobat只用于字段,那么如何做?2.如果我可以用iTextSharp为现有字段定义字体族,那么该怎么做?

  • 我正在尝试使用PDFTK填充pdf文档。脚本工作良好,它填充输入的形式,但我没有得到特殊字符[波兰字符集:UTF-8或ISO-8859-2]。 脚本:https://github.com/mikehaertl/php-pdftk 奇怪的是,当我点击字段时,生成的pdf实际上有波兰字符。 我所做的: 向pdf文件添加字体(选中且文件有字体) 在pdf文件中使用默认字体(Arial)创建字段 将脚本(

  • 我如何用整数或字符串填充我的GridPane?我目前正在数独GUI上工作,无法使其工作。我已经知道不可能用Java FX标签来显示它,因为它是Java.FX.scene.Control类。我需要以某种方式将数独值转移到GridPane中相应的坐标。

  • 在我的Android应用程序中,我从pdffile中填充表单字段,使用itextg如下: 我可以看到,在调试和检查压模时,模板字段的值实际上是设置的。但是一旦我打开目标文件,我所有的字段都是空的。 如果我不平整我的窗体,这些值会保留在字段中,这让我相信这些值也会存在于fladedpdf中,但不会显示。 顺便说一句,在itext演示中使用FormFiller表单(http://itextpdf.co