首页 文章

带有Unicode字符的PDF表单

提问于
浏览
13

我目前正在努力处理从LibreOffice文档创建的PDF表单 .

我按照“iText in Action”一书中的建议创建了它,现在我试图用一些可以包含Unicode字符的值预先填充嵌入的表单 .

这包括一个由基本字符组成的字符,其中包含一个组合字符(e.G.M) .

我在stackoverflow和书中找到了几个不同的提示,但是我从来没有得到一个PDF文档,其表格适用于所有平台:Linux(Okular,Evince,Acrobat DC,macOS Previewer等)

我知道我需要一个字体,覆盖字符并完全嵌入字体 . 下面是我用来存档PDF文档和PDF文件的代码 .

我的问题是:

  • PDF规范的不同行为是PDF规范中的弱点,我不得不忍受它吗?

  • 特别是Linux PDF阅读器和Acrobat表现不佳 . 有没有已知的错误?

  • 我对PDF的内部不是很熟悉,所以有什么建议吗?我的PDF文件的内容是否正常?

  • 有关如何改进代码以获得更好结果的任何建议?

填写表格的代码:

BaseFont uniFont = BaseFont.createFont("./src/main/resources/UnicodeDoc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, false, null, null, false);
uniFont.setSubset(false);

// Debugging code...
for (String codepage : uniFont.getCodePagesSupported()) {
    System.out.println("Codepage = " + codepage);
}

FileInputStream fis = new FileInputStream(src);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(fis);
PdfStamper stamper = new PdfStamper(reader, baos);

// Fill all fields in PDF form
String text = "aM\u0302a"; // Same as "aM̂a"
com.itextpdf.text.pdf.AcroFields form = stamper.getAcroFields();
for (String fname : form.getFields().keySet()) {
    System.out.println("form." + fname);
    form.setField(fname, text);
    form.setFieldProperty(fname, "textfont", uniFont, null);
}
form.setGenerateAppearances(true);
form.addSubstitutionFont(uniFont);
stamper.setFormFlattening(false);
stamper.close();
reader.close();

提前谢谢,Mik86

2 回答

  • 4

    我对PDF的内部不是很熟悉,所以有什么建议吗?我的PDF文件的内容是否正常?

    我将不得不深入研究PDF规范,看看是否有一些明确不正确的事情发生,但对我来说似乎确实存在混淆 .

    首先,当我尝试在Acrobat中打开它时,您的输入模板会给我一个错误,而LiveCycle抱怨必须换掉“UnicodeDoc”换另一种字体 . “UnicodeDoc”在原始输入文件中使用:

    enter image description here

    请注意,输入文件中嵌入了字体"UnicodeDoc" not . 填写时,您创建并嵌入字体,但看起来您不会覆盖原始字体(再次,不是说这是正确的或不正确的):

    enter image description here

    如果不对PDF的内部工作进行过多考虑,填写的表单仍会链接到未嵌入的原始字体 .

    这不一定直接解决问题,但如果我通过从原始模板中删除字体来“修复”您的文档:

    input.pdf

    并运行它生成的代码output.pdf,它在Acrobat和Reader中具有正确的输出 .

    同样,这并没有查看整个规范,看看这里有什么(如果有的话)交互,但是你所嵌入的字体是 not 最终在表单字段中使用的字体 .

  • 0

    好吧,感谢所有人都为这个话题做出了贡献!

    我明白,PDF文档的创建方式也是一个问题 . 我和人们交谈过,他们非常了解LibreOffice的内部结构,但有几个原因几乎没有机会在合理的时间范围内更改他们创建的PDF . 所以我找到了一个适合我的解决方案,但我不得不使用iText 7.这对我来说是解决问题的最现实的方法 .

    • Mik68

    BTW:LibreOffice可以创建开箱即用的PDF表格,MS-Office不能 .

相关问题