2 votes

C# iTextSharp PDFReader lit toujours à partir du début du PDF

J'utilise iTextSharp PDFReader pour lire un fichier pdf de 18 pages mais à chaque fois que j'incrémente le numéro de page, il reprend au début du pdf au lieu de ne lire que cette page. Si je fixe "x" à la valeur de pdfReader.NumberOfPages, il ne lit que la dernière page. J'aimerais lire chaque page individuellement et ajouter les données à ma liste de chaînes de caractères. Je passe également par un dossier, en lisant chaque fichier pdf, mais je teste avec un seul fichier pour commencer.

List<string> s = new List<string>();
while (z < filePaths.Count())
{
    PdfReader pdfReader = new PdfReader(filePaths[z]); 
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    for (int x = 1; x <= pdfReader.NumberOfPages; x++)
    {
        string currentText = "";                                
        currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy);                        
        s.Add(currentText);
    }
    z++;
    pdfReader.Close();
}

4voto

blagae Points 1723

Toutes les réponses précédentes sont assez proches, c'est-à-dire que vous avez correctement mis cela sur le compte d'une sorte de problème d'État.

La seule chose qui manquait, c'est qu'il s'agit de la strategy qui se souvient de son état. Après avoir appelé GetTextFromPage votre objet stratégique n'efface pas son contenu existant.

L'astuce consiste donc à instancier votre strategy à l'intérieur de la boucle :

for (int x = 1; x <= pdfReader.NumberOfPages; x++)
{
    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
    string currentText = "";                                
    currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy);                        
    s.Add(currentText);
}

1voto

blaze_125 Points 1889

J'ai réussi à le faire fonctionner en supprimant la stratégie de cette ligne PdfTextExtractor.GetTextFromPage(pdfReader, x, strategy)

static void Main(string[] args)
        {
            List<string> filePaths = new List<string>();
            filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-EN-ONT (1364).pdf");
            filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-UN-NOR (1364).pdf");
            filePaths.Add("C:\\temp\\pe\\ACN-ONFBG-010-R-UN-SOU (1364).pdf");
            List<string> results = doit(filePaths);
            string stall = "stall";
        }

        private static List<string> doit(List<string> filePaths)
        {
            List<string> s = new List<string>();
            int z = 0;
            while (z < filePaths.Count())
            {
                PdfReader pdfReader = new PdfReader(filePaths[z]);
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                for (int x = 1; x <= pdfReader.NumberOfPages; x++)
                {
                    string currentText = "";
                    currentText = PdfTextExtractor.GetTextFromPage(pdfReader, x);
                    s.Add(currentText);
                }
                z++;
                pdfReader.Close();
            }
            return s;
        }

0voto

dlatikay Points 5809

Je pense qu'il s'agit d'un problème lié à l'état du lecteur. Essayez d'ouvrir le PdfReader une fois avant la boucle pour obtenir le nombre de pages. Stockez le nombre de pages dans une variable. Utilisez cette variable comme limite supérieure pour la boucle. Ensuite, dans la boucle, instanciez un nouveau PdfReader pour chaque page et disposez-en après chaque itération.

EDIT : Il s'est avéré que la stratégie d'extraction de texte est le coupable. Elle retient l'état d'une manière ou d'une autre. Il faut toujours instancier un nouveau SimpleTextExtractionStrategy avant d'appeler GetTextFromPage ou omettre le strategy alors une nouvelle instance de l'implémentation par défaut de ITextExtractionStrategy sera créé en interne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X