2016-06-14 41 views
1

私はPDFファイルのテキストのすべての異なるフォント名を抽出するために探しています。私はiTextSharp DLLを使用しており、以下に私のコードです。PDFからテキストのフォント名を取得する方法は?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using iTextSharp.text.pdf.parser; 
using iTextSharp.text.pdf; 

namespace GetFontName 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PdfReader reader = new PdfReader("C:/Users/agnihotri/Downloads/Test.pdf"); 
      HashSet<String> names = new HashSet<string>(); 
      PdfDictionary resources; 
      for (int p = 1; p <= reader.NumberOfPages; p++) 
      { 
       PdfDictionary dic = reader.GetPageN(p); 
       resources = dic.GetAsDict(PdfName.RESOURCES); 
       if (resources != null) 
       { 
        //gets fonts dictionary 
        PdfDictionary fonts = resources.GetAsDict(PdfName.FONT); 
        if (fonts != null) 
        { 

         PdfDictionary font; 

         foreach (PdfName key in fonts.Keys) 
         { 
         font = fonts.GetAsDict(key); 
         string name = font.GetAsName(iTextSharp.text.pdf.PdfName.BASEFONT).ToString(); 

          //check for prefix subsetted font 

         if (name.Length > 8 && name.ToCharArray()[7] == '+') 
         { 
         name = String.Format("%s subset (%s)", name.Substring(8), name.Substring(1, 7)); 

         } 
         else 
         { 
           //get type of fully embedded fonts 
         name = name.Substring(1); 
         PdfDictionary desc = font.GetAsDict(PdfName.FONTDESCRIPTOR); 
         if (desc == null) 
         name += "no font descriptor"; 
         else if (desc.Get(PdfName.FONTFILE) != null) 
         name += "(Type1) embedded"; 
         else if (desc.Get(PdfName.FONTFILE2) != null) 
         name += "(TrueType) embedded "; 
         else if (desc.Get(PdfName.FONTFILE3) != null) 
         name += name;//("+font.GetASName(PdfName.SUBTYPE).ToString().SubSTring(1)+")embedded'; 
         } 

         names.Add(name); 
         } 
        } 
       } 
      } 
      var collections = from name in names 
      select name; 
      foreach (string fname in collections) 
      { 
      Console.WriteLine(fname); 
      } 
      Console.Read(); 

     } 
    } 
} 

私は取得しています出力は「Glyphlessフォント」の入力など、すべてのPDFファイルのための無フォント記述子」で次のように入力ファイルへのリンクは次のとおりです。

https://drive.google.com/open?id=0B6tD8gqVZtLiM3NYMmVVVllNcWc

+0

PdfReaderリーダー=新しいPdfReader( "C:/Users/agnihotri/Downloads/Test.pdf"); - ファイルのパスをダブルチェックしてください。コードが問題なく表示されている可能性があります。また、実際に動作することを確認するためにスクリプトコピーをインターネットから貼り付けると、デバッグを追加することを強くお勧めします。 –

答えて

2

私が開きました。あなたはAdobe AcrobatでPDFおよびIフォントパネルを見ては、これは私が見たものである:

enter image description here

あなたが埋め込まれたサブを持っていますLiberationMonoのセット。フォントがサブセッタであるため、フォントの名前はABCDEF + LiberationMono(ABCDEFは一連の6つのランダムで一意の文字です)としてファイルに格納されます。 What are the extra characters in the font name of my PDF?

は、今度は、iTextのRUPSで開かれた同じファイルを見てみましょう参照してください:私たちは/Fontオブジェクトを見つけて、それが/FontDescriptorを持って

enter image description here

/FontDescriptorでは、BAAAAA+LiberationMonoの形式で/FontNameが見つかりました。

名前の場所を知ったので、コードを修正することができます。私は、出力

%s subset (%s) 

実際%sとして取得し、最小限の変更で、あなたのコードを実行する

+0

清算してくれてありがとう....コードを手伝ってください。私はちょうど新鮮なビーコーディングとC# –

+0

@ラフル、この初期の合流点であきらめないでください!このヒントを参考にしたら、それを適用してみてください - それは非常に良い習慣です。 – halfer

+0

私が正しいトラックであるかどうかわからない......ヒントを得た:\t font.GetAsDict(PdfName.FontDescriptor.FontName); if(desc == null)name + = "フォント記述子がありません"; else if(desc.Get(PdfName.FontName)!= null)name + = "(Type1)embedded"; else if(desc.Get(PdfName.FontName)!= null)name + = "(TrueType)embedded"; else if(desc.Get(PdfName.FontName)!= null) –

2

は、Javaフォーマット文字列ではなく、ネットのフォーマット文字列のように見えます。例えば、私は私はあなたがファイルパスにバックスラッシュと@"..."文字列形式の代わりにスラッシュを使用して提案する

LiberationMono subset (BAAAAA+) 

を得るより多くの.Net'ishフォーマット文字列{0} subset ({1})を使用しますあなたが提供するすべてのファイルがHello_World.pdf命名された後、この

PdfReader reader = new PdfReader(@"C:\Users\agnihotri\Downloads\Test.pdf"); 

と、二重のような---ファイル名とパスを確認してください。

+0

おかげさまで、皆様の助けと助けをありがとうございました。私は、コードの変更によって問題を解決することができました。必要なのは、iTextSharp 5.5の使用でした。9 dllと残りのすべては問題ありませんでした。これは閉じたものとしてマークすることができます –

+0

@RahulAgnihotri *必要なのは、iTextSharp 5.5.9 dll *の使用でした。あなたが使用したバージョンについて言及していないので、あなたは今現在のバージョン... *これは閉じられたとマークすることができます* - あなたは自分でそれを行うことができます:理由を含む回答を作成します( "古いiTextSharpバージョンを使用し、現在の5.5.9で正常に動作します"受け入れられました(左上のチェックマークをクリックしてください)。受け入れられたように自分の答えをマークすることはすぐにはできないかもしれませんが、数時間後には確かにそうです。 – mkl

関連する問題