在AcroForm itext7中设置替换字体

时间:2018-03-21 11:11:38

标签: java unicode itext7

我有一个带有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,但有替换字体: iText5 without pdfCalligraph

带有pdfCalligraph的表单字段中的iText7(设置arial字体field.setFont(arialFont)): enter image description here

带有pdfCalligraph的表单字段中的iText7(设置khmer字体field.setFont(khmerFont)):

enter image description here

iText7相同的文档,但是在一个段落而不是带有pdfCalligraph的表单字段中加载(这是一个预期的resut,所以它确实使用pdfCalligraph用于段落,但不用于表单字段): enter image description here

所以,你可以看到基本上有两个问题:

  1. 我如何在iText7中addSubstitutionFont

  2. 如何在PdfFormField外观中使用pdfCalligraph?

  3. 我还检查了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字符都被忽略: enter image description here

    没有加载pdfCalligraph依赖项的输出(如您所见,段落未正确呈现,预期,表单字段与加载的pdfCalligraph相同):

    enter image description here

    我错过了什么吗?

0 个答案:

没有答案