2016-06-14 18 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(); 

     } 
    } 
} 

내가 얻고 출력은 입력으로 모든 PDF 파일에 대한 "Glyphless 글꼴"더 폰트 기술자 "입니다 다음과 같이 입력 파일에 대한 링크는 다음과 같습니다.

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을 찾습니다.

이제 이름을 찾을 위치를 알았으므로 코드를 적용 할 수 있습니다.

+0

설명을 주셔서 감사합니다 .... 코드를 도와주세요. 난 그냥 신선한 Bie 코딩 및 C# –

+0

@ raahul,이 조기에 포기하지 마라! 일단 힌트가 도움이되면, 그것을 적용 해보십시오 - 아주 좋은 습관입니다. – 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

내가

%s subset (%s) 

는 사실 %s 자바 형식 문자열이 아닌 닷넷 형식 문자열과 같은 출력으로 얻을 최소한의 변경으로 코드를 실행합니다. 내가 할 {0} subset ({1}) 더 .Net'ish 형식 문자열을 사용하여

LiberationMono subset (BAAAAA+) 

난 당신이, 예를 들어, 파일 경로에 슬래시 대신 백 슬래시와 @"..." 문자열 형식을 사용하여 제안 할 것 이

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

와 같은 이중 당신이 제공하는 모든 파일이 Hello_World.pdf라는 한 후 --- 파일 이름과 경로를 확인하십시오.

+0

제안과 도움을 주신 모든 분들께 감사드립니다. 코드 변경으로 문제를 해결할 수있었습니다. 필요한 것은 iTextSharp 5.5를 사용하는 것뿐이었습니다.9 DLL과 나머지는 괜찮 았어. 이것은 닫힌 것으로 표시 될 수 있습니다 –

+0

@RahulAgnihotri * 필요한 것은 iTextSharp 5.5.9 dll *을 사용하는 것뿐입니다. 사용했던 버전에 대해서는 언급하지 않았으므로, 현재 사용중인 버전을 사용했습니다. ... * 닫힌 것으로 표시 할 수 있습니다 * - 스스로 할 수 있습니다 : "이전의 iTextSharp 버전의 행에 따른 것 (현재 5.5.9로 잘 작동합니다)"이라는 이유를 포함하는 대답을 작성하고 그 대답을 다음과 같이 표시하십시오. 허용 (왼쪽 상단의 진드기를 클릭하십시오). 수락 된대로 자신의 답변을 표시하는 것은 즉시 가능하지 않을 수 있지만 몇 시간 후에는 분명히 있습니다. – mkl