当前位置: 首页 > 知识库问答 >
问题:

用西里尔文值填充pdf模板字段(itextsharp)

杭柏
2023-03-14

我有PDF模板文件与字段。客户创建的模板。它有一些文本、字段标签和字段本身。文本和标签使用嵌入在模板中的某种字体。

当我尝试用西里尔文值填充字段时会出现问题-结果文档中没有西里尔文符号。

        FontFactory.RegisterDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Fonts));
        using (var dest = File.Create(@"result.pdf"))
        {
            using (var stamper = new PdfStamper(reader, dest))
            {
                var fields = stamper.AcroFields;
                fields.SetField("ClientName", "Имя клиента");
                stamper.FormFlattening = true;
                stamper.Close();
            }
        }

所以问题是:1。如果我可以嵌入字体在Adobe Acrobat只用于字段,那么如何做?2.如果我可以用iTextSharp为现有字段定义字体族,那么该怎么做?

共有1个答案

颛孙飞
2023-03-14

我写了适合我的解决方案。

  1. 在FontFactory中注册所有现有系统字体。
  2. 读取文档元数据以提取文档中所有使用的字体。
  3. 读取字段元数据并尝试创建适合字段字体的BaseFont。如果没有合适字体-使用备用字体(arial具有编码标识_H)。

因此完整的代码如下所示:

    static IEnumerable<PdfFontInfo> ReadDocumentFonts(PdfReader reader)
    {
        if (reader.AcroForm == null)
            yield break;
        var dr = reader.AcroForm.GetAsDict(PdfName.DR);

        // Read font information from resources
        var fontDict = dr.GetAsDict(PdfName.FONT);
        foreach (var fontKey in fontDict.Keys)
        {
            var data = fontDict.GetAsDict(fontKey);
            // Read font descriptor if it possible
            var descriptor = data.GetAsDict(PdfName.FONTDESCRIPTOR);
            if (descriptor != null)
            {
                // Read font name and family
                var family = descriptor.GetAsString(PdfName.FONTFAMILY);
                yield return new PdfFontInfo(fontKey, family.ToUnicodeString());
            }
        }
    }

    static IReadOnlyList<BaseFont> CreateSubstitutionFontsForFields(PdfReader reader)
    {
        if (reader.AcroForm.Fields == null)
            return new List<BaseFont>(0);
        var documentFontMap = ReadDocumentFonts(reader).ToDictionary(f => f.Name, StringComparer.InvariantCultureIgnoreCase);
        var substFonts = new Dictionary<string, BaseFont>();
        var fallbackRequired = false;

        // Read font information of each field
        foreach (var field in reader.AcroForm.Fields)
        {
            var fieldFontDa = field.Info.GetAsString(PdfName.DA);
            if (fieldFontDa == null)
                continue;
            var parts = AcroFields.SplitDAelements(fieldFontDa.ToUnicodeString());
            if (parts.Length == 0)
                continue;
            var fontName = (string) parts[0];
            PdfFontInfo inf;
            if (documentFontMap.TryGetValue(fontName, out inf))
            {
                if (!substFonts.ContainsKey(fontName))
                {
                    var font = FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, true).BaseFont;
                    substFonts.Add(fontName, font);
                }
            }
            else
                fallbackRequired = true;
        }
        var allFonts = new List<BaseFont>(substFonts.Values);
        if (fallbackRequired)
            allFonts.Add(FALLBACK_FONT);
        return allFonts;
    }

如果您能发现任何错误,欢迎您评论。

 类似资料:
  • 我正在使用pdfbox 2.0.5使用以下代码填写PDF文档的表单字段: 我得到这个错误:U+0434('AFII10069')在此字体Times-Roman(泛型:TimesNewRomanPSMT)编码:StandardEncoding with Difference中不可用 我必须在文本字段中指定哪种字体来处理西里尔(或亚洲)字符? 谢谢,罗波

  • 我试图用fdf或xfdf中的汉字填充pdf字段。 到目前为止,我已经尝试了pdftk、mcpdf、pdfbox和fpdm。 它们都可以将字符输入字段,但不会显示。当我点击要编辑的字段时,字符按预期显示,但当我再次点击字段外时,字符消失。如果我输入的是英语,它们就会显示错误,例如“hello”变成“IFMMP”。 这一切都让我怀疑这是字体/字符映射的问题,我尝试过将完整的字体嵌入到pdf中,但没有任

  • 字体Adobe希伯来文 文本方向RTL 我试过平场和不平场。 当字段没有平坦化时,在使用Acrobat Reader打开生成的PDF后,我看到了我的字段,但它是空的。只有在我点击该字段后,该字段的内容才会正确出现。当我在Chrome上查看PDF时,字段不会出现(或者它可能在那里,但里面没有文本)。 编辑:测试PDF可从这里下载

  • 我在SQL Server 2012中有两个表 表1 表2 每个用户可以拥有1到8个权限。 我需要创建一个视图,该视图将为我提供具有8个权限条目的UserID,其中任何未使用的条目都包含null值,即条目的顺序无关紧要。 这让我很困惑,我甚至不知道从哪里开始?

  • 问题内容: 是否可以用不是_id …的参考模型字段填充猫鼬模型,例如用户名。 所以像 问题答案: 您可以使用API。API是更加灵活,你不必指定,并在纲要。 http://mongoosejs.com/docs/api.html#document_Document-populate http://mongoosejs.com/docs/api.html#model_Model.populate 您