我们有一个应用程序,我们的客户使用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,直到您将焦点移动到其他位置 .


附加信息:

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