web-dev-qa-db-ja.com

itextsharpテキスト抽出

私はvb.netでitextsharpを使用して、PDFファイルからテキストコンテンツを取得しています。このソリューションは、一部のファイルでは正常に機能しますが、非常に単純なファイルでも機能しません。問題は、トークンstringvalueがnull(空の四角いボックスのセット)に設定されていることです。

token = New iTextSharp.text.pdf.PRTokeniser(pageBytes)
    While token.NextToken()
        tknType = token.TokenType()
        tknValue = token.StringValue

コンテンツの長さは測定できますが、実際の文字列コンテンツを取得できません。

これはPDFのフォントによって異なることに気づきました。 AcrobatまたはPdfCreatorとCourierを使用してPDFを作成すると(Visual Studioエディターのデフォルトのフォントです)、すべてのテキストコンテンツを取得できます。同じPDFが別のフォントを使用してビルドされている場合、空の四角いボックスが表示されます。

ここで問題は、フォント設定に関係なくテキストを抽出するにはどうすればよいですか?

ありがとう

18
Pakhu

マークの回答を補完する.iTextSharp実装の名前空間とクラスは、Java versionとは少し異なります

 public static string GetTextFromAllPages(String pdfPath)
    {
        PdfReader reader = new PdfReader(pdfPath); 

        StringWriter output = new StringWriter();  

        for (int i = 1; i <= reader.NumberOfPages; i++) 
            output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));

        return output.ToString();
    }
44
Iman Abidi

チェックアウト PdfTextExtractor

String pageText = 
  PdfTextExtractor.getTextFromPage(myReader, pageNum);

または

String pageText = 
  PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy());

どちらもかなり最近のバージョンのiText [Sharp]を必要とします。実際にコンテンツストリームを自分で解析することは、この時点でホイールを再発明することです。多少の手間を省いて、iTextに任せてください。

PdfTextExtractorは、さまざまなフォント/エンコーディングの問題すべてを処理します...とにかく処理できるすべての問題です。 Readerから正確にコピー/貼り付けできない場合、PDF)にはコンテンツストリームから文字情報を取得するのに十分な情報がありません。

14
Mark Storer

必要な場合は、iTextSharp.text.pdf.PdfName.ANNOTSおよびiTextSharp.text.pdf.PdfName.CONTENTのバリアントを次に示します。

        string strFile = @"C:\my\path\tothefile.pdf";
        iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile);
        iTextSharp.text.pdf.PRTokeniser prtTokeneiser;
        int pageFrom = 1;
        int pageTo = pdfRida.NumberOfPages;
        iTextSharp.text.pdf.PRTokeniser.TokType tkntype ;
        string tknValue;

        for (int i = pageFrom; i <= pageTo; i++) 
        {
            iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i);
            iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);

            if(cannots!=null)
                foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList) 
                {
                    iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number);

                    iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS);
                    if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString)) 
                    {
                        string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString();
                        if (cStringVal.ToUpper().Contains("LOS 8"))
                        { // DO SOMETHING FUN

                        }
                    }
                }
        }
        pdfRida.Close();
4
shiroxx