2016-05-16 135 views
0

我有PDF模板文件与字段。 客户创建的模板。它有一些文本,字段标签和字段本身。文本和标签使用一些嵌入模板中的字体。用西里尔文价值填充pdf模板字段(itextsharp)

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

我看到很多类似的问题,这些问题通过使用AcroFields的替换字体解决。但是在这里,我不能使用一种特定的字体进行替换,因为我无法在模板中定义字段字体。

我试图为Acrobat编辑器中的字段设置不同的字体 - Times New Roman,Arial和其他众所周知的Windows字体,但在生成的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(); 
      } 
     } 

我甚至注册的所有可用的字体在FontFactory,但没有效果。

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

+0

所以字体嵌入在PDF中,但你不能使用它?我会从那里开始。你可以在Adobe Acrobat中手动输入字段,看看你的期望?如果不是,你要么没有嵌入字体,要么有某种形式的腐败。你可以发布PDF吗? –

+0

我无法使用嵌入式字体,因为我的机器上没有安装字体。 Fields使用Arial或Times New Roman,我可以在那里键入西里尔符号,但是当我使用iTextSharp时,不会显示西里尔符号。 – Nogard

回答

0

那么,我写了适合我的解决方案。

  1. 在FontFactory中注册所有现有的系统字体。
  2. 阅读文档元数据以提取文档中所有使用的字体。
  3. 阅读字段元数据并尝试创建适合字段字体的BaseFont。如果没有合适的字体 - 使用后备字体(带编码IDENTITY_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; 
    } 

如果你能找到任何错误,欢迎您发表评论。