web-dev-qa-db-fra.com

Extraction de texte Itextsharp

J'utilise itextsharp sur vb.net pour obtenir le contenu texte d'un fichier pdf. La solution fonctionne bien pour certains fichiers mais pas pour d'autres, même assez simples. Le problème est que la valeur de chaîne du jeton est définie sur null (un ensemble de cases carrées vides)

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

Je peux mesurer la longueur du contenu mais je ne peux pas obtenir le contenu réel de la chaîne.

J'ai réalisé que cela se produit en fonction de la police du pdf. Si je crée un pdf en utilisant Acrobat ou PdfCreator avec Courier (qui est d'ailleurs la police par défaut dans mon éditeur de studio visuel), je peux obtenir tout le contenu du texte. Si le même pdf est construit en utilisant une police différente, j'ai les cases carrées vides.

Maintenant, la question est: comment extraire du texte quel que soit le paramètre de police?

Merci

18
Pakhu

complémentaire pour la réponse de Mark qui m'aide beaucoup. Les espaces de noms et les classes d'implémentation .iTextSharp sont un peu différents de 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

Vérifiez PdfTextExtractor .

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

ou

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

Les deux nécessitent des versions assez récentes d'iText [Sharp]. En fait, analyser vous-même le flux de contenu ne fait que réinventer la roue à ce stade. Épargnez-vous de la douleur et laissez iText le faire pour vous.

PdfTextExtractor gérera tous les différents problèmes de police/encodage pour vous ... tous ceux qui peuvent être traités de toute façon. Si vous ne pouvez pas copier/coller à partir de Reader avec précision, cela signifie qu'il n'y a pas suffisamment d'informations dans le PDF) pour obtenir des informations sur les caractères à partir du flux de contenu.

14
Mark Storer

Voici une variante avec iTextSharp.text.pdf.PdfName.ANNOTS et iTextSharp.text.pdf.PdfName.CONTENT si quelqu'un en a besoin.

        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