2016-05-16 12 views
0

Ich habe PDF-Vorlage Datei mit Feldern. Vorlage erstellt vom Kunden. Es hat einige Texte, Feldbezeichnungen und Felder selbst. Text und Beschriftungen verwendet eine Schriftart, die in die Vorlage eingebettet ist.Füllen Sie PDF-Vorlage Felder mit kyrillischen Werten (itextsharp)

Probleme treten auf, wenn ich versuche, Felder mit kyrillischen Werten zu füllen - im Ergebnisdokument gibt es keine kyrillischen Symbole.

Ich sah viele ähnliche Probleme, die mit der Ersatzschrift für AcroFields gelöst wurden. Aber hier kann ich nicht eine bestimmte Schriftart für die Ersetzung verwenden, weil ich Feldschriftart in Vorlage nicht definieren kann.

Ich habe versucht, verschiedene Schriftarten für Felder im Acrobat Editor - Times New Roman, Arial und andere bekannte Windows-Schriftarten, aber es gibt keinen Effekt in resultierenden PDF.

Codebeispiel:

 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(); 
      } 
     } 

ich registriert auch alle verfügbaren Schriftarten in FontFactory, aber es gab keine Wirkung.

So sind die Fragen: 1. Wenn ich Schriftart in Adobe Acrobat nur für Felder einbetten kann, wie geht das? 2. Wenn ich mit iTextSharp eine Schriftfamilie für ein bestehendes Feld definieren kann, wie geht das?

+0

So ist die Schriftart in das PDF eingebettet, aber Sie können es nicht verwenden? Ich würde dort anfangen. Können Sie das Feld manuell in Adobe Acrobat eingeben und sehen, was Sie erwarten? Wenn nicht, haben Sie entweder keine eingebetteten Schriftarten oder sie haben irgendeine Art von Korruption. Können Sie das PDF veröffentlichen? –

+0

Ich kann eingebettete Schriftarten nicht verwenden, da ich diese Schriftarten nicht auf meinem Computer installiert habe. Felder verwendet Arial oder Times New Roman, und ich kann dort kyrillische Symbole eingeben, aber wenn ich das mit iTextSharp mache, werden keine kyrillischen Symbole angezeigt. – Nogard

Antwort

0

Nun, ich schrieb Lösung für mich geeignet.

  1. Registrieren Sie alle vorhandenen Systemschriftarten in FontFactory.
  2. Lesen Sie die Metadaten des Dokuments, um alle verwendeten Schriftarten in Dokumenten zu extrahieren.
  3. Lesen Sie Felder Metadaten und versuchen, BaseFont zu Feldschriftart zu erstellen. Wenn es keine geeignete Schriftart gibt, verwenden Sie die Ausweichschriftart (arial mit Kodierung IDENTITY_H).

So voll Code wie folgt aussieht:

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; 
    } 

Wenn Sie Fehler finden können, Sie willkommen zu kommentieren sind.