关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
2年前关闭。
Improve this question
我目前正在努力使用从 LibreOffice 文档创建的 PDF 表单。
我按照“iText in Action”一书中的建议创建了它,现在我试图用一些可以包含 Unicode 字符的值来预填充嵌入的表单。
这包括由基本字符和附加组合字符(例如 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();
提前致谢, Mik86
最佳答案
I'm not very familiar with internals of PDF, so any suggestions? Are the contents of my PDF files ok?
我将不得不深入研究 PDF 规范,以查看是否存在绝对不正确的内容,但对我来说似乎确实存在混淆。
首先,当我尝试在 Acrobat 中打开它时,您的输入模板给了我一个错误,LiveCycle 提示必须将“UnicodeDoc”换成不同的字体。原始输入文件中使用了“UnicodeDoc”:
注意字体“UnicodeDoc”是不是 嵌入在您的输入文件中。填写时,您创建并嵌入字体,但看起来您没有覆盖原始字体(再次,不是说这是正确的还是不正确的):
无需过多了解 PDF 的内部工作原理,正在填写的表单仍会链接到未嵌入的原始字体。
这不一定直接解决问题,但是如果我通过从原始模板中删除字体来“修复”您的文档:
input.pdf
并通过你的代码运行它产生 output.pdf 在 Acrobat 和 Reader 中有正确的输出。
同样,这并不是说在这种情况下您的 PDF 是错误的或 iText 是错误的,因为我还没有查看整个规范以了解此处预期的交互(如果有),但就其而言,您所使用的字体嵌入是不是 最终在表单字段中使用的字体。
关于带有 Unicode 字符的 PDF 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476970/