2016-05-16 1 views
0

フィールドを含むPDFテンプレートファイルがあります。 お客様が作成したテンプレート。テキスト、フィールドラベル、フィールド自体があります。テキストとラベルは、テンプレート内に埋め込まれたフォントを使用します。キリル文字の値(itextsharp)を持つPDFテンプレートのフィールドを入力してください

キリル文字の値をフィールドに入力しようとすると問題が発生します。結果ドキュメントにキリル記号はありません。

AcroFieldsの代替フォントを使用することで解決された同様の問題が多数発生しました。しかし、私はテンプレートにフィールドフォントを定義することができないので、私は置換のための特定のフォントを使用することはできません。

Acrobat Editorで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

自分のマシンにそのフォントがインストールされていないため、埋め込みフォントを使用できません。フィールドはArialやTimes New Romanを使用していますが、そこにキリル文字のシンボルを入力できますが、iTextSharpを使用すると、キリル文字は表示されません。 – Nogard

答えて

0

まあ、私は私に適した解決策を書いた。

  1. FontFactoryの既存のシステムフォントをすべて登録します。
  2. ドキュメントのすべての使用フォントを抽出するために、ドキュメントのメタデータを読み取ります。
  3. フィールドのメタデータを読み取り、フィールドフォントに適したBaseFontを作成しようとします。適切なフォント使用フォールバックフォント(IDENTITY_Hをエンコードしたarial)がない場合

だから、完全なコードは次のようになります。あなたはすべてのエラーを見つけることができれば

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

、あなたはコメントを歓迎します。

関連する問題