Mik*_*k86 14 pdf unicode itext pdf-form
我目前正在努力处理从LibreOffice文档创建的PDF表单.
我按照"iText in Action"一书中的建议创建了它,现在我试图用一些可以包含Unicode字符的值预先填充嵌入的表单.
这包括一个由base char组成的字符,另外还有一个char(eG M)组合.
我在stackoverflow 和本书中尝试了几个不同的提示 ,但是我从来没有得到一个可以在所有平台上运行的表单的PDF文档:Linux(Okular,Evince,Acrobat DC,macOS Previewer等)
我知道我需要一个字体,覆盖字符并完全嵌入字体.下面是我用来存档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();
Run Code Online (Sandbox Code Playgroud)
提前谢谢,Mik86
我对PDF的内部结构不是很熟悉,所以有什么建议吗?我的 PDF 文件的内容正常吗?
我将不得不深入研究 PDF 规范,看看是否存在明显不正确的内容,但对我来说,这似乎确实存在混乱。
首先,当我尝试在 Acrobat 中打开输入模板时,它给我一个错误,并且 LiveCycle 抱怨必须将“UnicodeDoc”换成其他字体。“UnicodeDoc”在原始输入文件中使用:
请注意,字体“UnicodeDoc”未嵌入您的输入文件中。填写时,您创建并嵌入了一种字体,但看起来您没有覆盖原始字体(同样,并不是说这是正确或不正确的):
无需过多了解 PDF 的内部工作原理,填写的表单仍链接到未嵌入的原始字体。
这不一定能直接解决问题,但如果我通过从原始模板中删除字体来“修复”您的文档:
并通过您的代码运行它,它会生成output.pdf,它在 Acrobat 和 Reader 中具有正确的输出。
再说一遍,这并不是说您的 PDF 错误或 iText 在这种情况下是错误的,因为我还没有查看整个规范来了解这里期望什么(如果有)交互,但因为它代表了您的字体嵌入不是最终在表单字段中使用的字体。