当iTextSharp填充时,PDF模板显示错误的字体

时间:2015-04-10 14:01:08

标签: pdf fonts itextsharp

我们有一个应用程序,我们的客户使用Adobe Acrobat为完成证书创建pdf模板。当用户完成要求时,我们的应用程序将填入已定义的字段并允许他们打印证书。其中一个证书是在Arial(Helvetica)中打印而不是在某些(但不是全部)字段中请求的字体。

我已经检查了Stack Overflow和其他网站中的所有相关链接,但它们都没有解决模板显示字段中定义的字体的失败问题。

代码段:

        var pdfStream = new MemoryStream();

        var pdfReader = new PdfReader(pdfTemplate);
        var pdfStamper = new PdfStamper(pdfReader, pdfStream);

        var pdfFormFields = pdfStamper.AcroFields;
        var baseFont = BaseFont.CreateFont(new HostConfig().GetConfigRoot().GetParent().FullName + "\\fonts\\ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        pdfFormFields.AddSubstitutionFont(baseFont);

        foreach (DictionaryEntry de in pdfData) {
            if (de.Key != null && de.Value != null) {
                var foundField = pdfFormFields.SetField(de.Key.ToString(), de.Value.ToString());
                if (foundField) {
                    pdfFormFields.SetFieldProperty(de.Key.ToString(), "setfflags", PdfFormField.FF_READ_ONLY, null);
                    pdfFormFields.SetFieldProperty(de.Key.ToString(), "flags", PdfAnnotation.FLAGS_PRINT, null);
                    pdfFormFields.RegenerateField(de.Key.ToString());
                }
            }
        }
        pdfStamper.FormFlattening = true;
        pdfStamper.Close();
        pdfStream.Close();
        return pdfStream;

使用resharper调试器检查Acro字段显示它们在字段小部件的hashMap中都具有以下内容:

  

[{/ DA}] {/ MonotypeCorsiva 40 Tf 0 g}   (字体大小因字段而异)

恢复为Arial的字段在hashMap中还包含以下内容:

  

[{/ DR}] {字典}

扩展时包含:

  

[{/ Helv}] {67 0 R}

即使删除pdfFormFields.AddSubstitutionFont,问题仍然存在。除了普通的拉丁字符集外,这些字段都不包含任何字形或字符。

另一个有趣的效果是,如果FormFlattening未设置为true,您可以单击Acrobat Reader中的字段,它们将显示为MonotypeCorsiva,直到您将焦点移动到其他位置。


其他信息:

我们正在考虑修复该文件。我未经许可自由发布模板,因为它属于我们的客户。

0 个答案:

没有答案