我有一个带有AcroForm的pdf,需要用包含不同语言字形(英文,中文,韩文,高棉文)的字符串填充它。 在iText5中,我使用过:
AcroFields form = stamper.getAcroFields();
form.addSubstitutionFont(arialFont);
form.addSubstitutionFont(khmerFont);
它对中国人和韩国人来说都很好,但是我遇到了一个没有渲染高棉连字的问题。发现我需要pdfCalligraph插件才能使连字工作,但它只附带iText7。我设法用适当的高棉连字渲染添加段落(需要排版作为依赖并加载许可证密钥)。但在AcroForm中,它不会自动执行。我正在努力寻找addSubstitutionFont
的iText7版本并使其与pdfCalligraph一起使用。
我用过iText7的代码:
PdfReader reader = new PdfReader(templatePath);
PdfDocument pdf = new PdfDocument(reader, new PdfWriter(outputPath));
Document document = new Document(pdf);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfFont khmerFont = PdfFontFactory.createFont(pathToKhmerFont, PdfEncodings.IDENTITY_H, true);
PdfFont font = PdfFontFactory.createFont(pathToArialUnicodeFont, PdfEncodings.IDENTITY_H, true);
pdf.addFont(khmerFont);
pdf.addFont(font);
FontSet set = new FontSet();
set.addFont(pathToKhmerFont);
set.addFont(pathToArialUnicodeFont);
document.setFontProvider(new FontProvider(set));
document.setProperty(Property.FONT, "Arial");
form.setNeedAppearances(true);
String content = "khmer ថ្ងៃឈប់សម្រាក and chinese 假日 and korean 휴일";
PdfFormField tf = form.getField("Text3");
tf.setValue(content);
// tf.setFont(khmerFont);
tf.regenerateField();
// add a paragraph just to check pdfCalligraph works
document.add(new Paragraph(content));
pdf.close();
用于测试正确渲染的字符串:“khmerថ្ងៃឈប់សម្រាក和中国假日和韩国휴일”
iText5在表单字段中没有pdfCalligraph,但有替换字体:
带有pdfCalligraph的表单字段中的iText7(设置arial字体field.setFont(arialFont)
):
带有pdfCalligraph的表单字段中的iText7(设置khmer字体field.setFont(khmerFont)
):
iText7相同的文档,但是在一个段落而不是带有pdfCalligraph的表单字段中加载(这是一个预期的resut,所以它确实使用pdfCalligraph用于段落,但不用于表单字段):
所以,你可以看到基本上有两个问题:
我如何在iText7中addSubstitutionFont
?
如何在PdfFormField外观中使用pdfCalligraph?
我还检查了pdfCalligraph是否以文本形式工作,看起来它没有。这是我用来检查它的代码:
LicenseKey.loadLicenseFile(path_to_license);
String outputPath = path_to_output_doc;
PdfDocument pdf = new PdfDocument(new PdfWriter(outputPath));
Document document = new Document(pdf);
// prepare fonts for pdfCalligraph to use
FontSet set = new FontSet();
set.addFont("/path_to/Khmer.ttf");
set.addFont("/path_to/ArialUnicodeMS.ttf");
FontProvider fontProvider = new FontProvider(set);
document.setFontProvider(fontProvider);
document.setProperty(Property.FONT, "Arial");
String content = "khmer ថ្ងៃឈប់សម្រាក and chinese 假日 and korean 휴일";
// Add a paragraph to check if pdfCalligraph works
document.add(new Paragraph(content));
// Add a form text field
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfTextFormField field = PdfFormField.createText(pdf, new Rectangle(36, 700, 400, 30), "test");
field.setValue(content);
form.addField(field);
document.close();
加载了pdfCalligraph依赖项的输出(正如您可以看到正确呈现的段落,但是在形式上所有非halvetica字符都被忽略:
没有加载pdfCalligraph依赖项的输出(如您所见,段落未正确呈现,预期,表单字段与加载的pdfCalligraph相同):
我错过了什么吗?