Estrai PDF di testo

Il formato di file PDF è popolare perché il contenuto del file non può essere modificato facilmente, rispetto ad altri formati di file di elaborazione testi. Tuttavia, puoi estrarre testo da documenti PDF con Aspose.PDF per .NET API. In questo articolo, esploriamo alcune delle numerose possibilità di ricerca ed estrazione di testo da file PDF utilizzando C#. Di seguito è riportato un elenco di funzionalità di cui parleremo in questo blog:

Estrai testo da un intero documento PDF usando C#

La lettura di contenuti di testo da un documento PDF è una funzionalità utilizzata di frequente. Puoi estrarre tutto il testo da tutte le pagine del documento seguendo i passaggi seguenti:

  1. Carica documento PDF
  2. Crea un oggetto TextAbsorber.
  3. Accetta l’assorbitore per tutte le pagine
  4. Scrivi il testo estratto su un file e salvalo

Di seguito il frammento di codice segue questi passaggi e mostra come estrarre il testo da un intero documento PDF usando C#:

Cerca ed estrai testo da una pagina specifica in PDF in C#

Dopo aver esplorato l’estrazione del testo a livello di documento, estraiamo il testo da una pagina specifica di un documento PDF. Segui semplicemente i passaggi seguenti per soddisfare le tue esigenze:

  1. Carica documento PDF
  2. Crea un oggetto TextAbsorber.
  3. Accetta l’assorbitore per una pagina specifica
  4. Scrivi il testo estratto su un file e salvalo

Il seguente frammento di codice segue questi passaggi per leggere il testo da qualsiasi pagina di un file PDF utilizzando C#:

Cerca ed estrai testo da una regione specifica della pagina PDF in C#

Facciamo un ulteriore passo avanti con questa estrazione del testo. Prendi in considerazione la possibilità di trovare del testo da un’area specifica della pagina. È importante capire qui che l’unità di misura di base in Aspose.PDF per .NET è il punto, dove 72 punti equivalgono a 1 pollice. Inoltre, l’angolo inferiore sinistro è considerato l’origine (0,0) della pagina. Di seguito sono riportati i passaggi per leggere il testo da un’area o una sezione specifica della Pagina nel documento PDF:

  1. Carica il documento PDF di origine
  2. Crea un oggetto TextAbsorber.
  3. Imposta TextSearchOptions e specifica le coordinate rettangolari
  4. Accetta l’assorbitore per una pagina specifica
  5. Scrivi il testo estratto su un file

Il frammento di codice seguente mostra questi passaggi per estrarre il testo da un’area specifica usando C#:

// Apri documento
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Crea oggetto TextAbsorber per estrarre il testo
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Accetta l'assorbitore per la prima pagina
pdfDocument.Pages[1].Accept(absorber);
// Ottieni il testo estratto
string extractedText = absorber.Text;
// Crea uno scrittore e apri il file
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Scrivi una riga di testo nel file
tw.WriteLine(extractedText);
// Chiudi il flusso
tw.Close();

Cerca o estrai testo specifico da file PDF con espressioni regolari utilizzando C#

Puoi estrarre un testo specifico da un documento PDF che corrisponde a uno schema. Ad esempio, potresti voler estrarre alcune parole o numeri specifici. A questo scopo, dovresti progettare un’espressione regolare. L’API utilizzerà tale espressione regolare per trovare il testo corrispondente nel documento PDF. Di seguito sono riportate le linee guida per cercare ed estrarre testo specifico da file PDF:

  • Carica il documento PDF di input
  • Crea un oggetto TextAbsorber.
  • Progetta e imposta un’espressione regolare per abbinare del testo
  • Scorri ogni frammento di testo estratto

Il seguente frammento di codice C# usa un’espressione regolare che cerca il testo contenente 4 cifre, ad esempio 1999,2000 e così via, in tutte le pagine del documento.

// documento aperto
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// creare un oggetto TextAbsorber per trovare tutte le istanze della frase di ricerca di input
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// accetta l'assorbitore per tutte le pagine
pdfDocument.Pages.Accept(textFragmentAbsorber);
// ottenere i frammenti di testo estratti
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// scorrere i frammenti
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

Estrai il testo dalle celle della tabella nel documento PDF usando C#

L’estrazione di testo da tabelle su una pagina PDF è leggermente diversa. Abbiamo lavorato con la classe TextAbsorber negli esempi precedenti, ma l’estrazione del testo da una tabella è leggermente diversa. Pertanto, è necessario seguire i passaggi seguenti per estrarre il testo dagli oggetti Tabella:

  1. Carica il file PDF di origine
  2. Crea un oggetto della classe TableAbsorber.
  3. Iterare attraverso AbsorbedTable
  4. Scorri ogni cella in ogni riga della tabella

Di seguito il frammento di codice segue questi passaggi ed estrae in modo efficiente il testo dalle celle della tabella nel documento PDF utilizzando C#:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

Cerca ed estrai il testo evidenziato dal documento PDF utilizzando C#

Il testo evidenziato è presente come Annotazione nei file PDF. Contengono testo contrassegnato che li rende diversi dal testo convenzionale in un documento. I passaggi seguenti descrivono come leggere il testo evidenziato usando C#:

  1. Carica il documento di origine
  2. Scorri tutte le annotazioni
  3. Filtra TextMarkupAnnotation
  4. Recupera frammenti di testo evidenziati

Quello che segue è un frammento di codice basato sui passaggi precedenti, può essere utilizzato per ottenere il testo evidenziato dai file PDF:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Scorri tutte le annotazioni
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Filtra TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Recupera frammenti di testo evidenziati
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Visualizza il testo evidenziato
            Console.WriteLine(tf.Text);
        }
    }
}

Estrai testo PDF con un consumo di memoria ridotto utilizzando C#

Di seguito sono riportati due diversi approcci per ottimizzare il consumo di memoria durante l’estrazione di testo da documenti PDF utilizzando il linguaggio C#.

i) Utilizzo del metodo Reset() e FreeMemory()

A volte l’estrazione del testo può consumare memoria e processore enormi. Forse quando il file di input è enorme e contiene molto testo. Perché l’oggetto TextFragmentAbsorber memorizza tutti i frammenti di testo trovati nella memoria.

Pertanto, la soluzione che consigliamo qui è chiamare il metodo absorber.Reset() dopo l’elaborazione di ogni pagina. Inoltre, se stai eseguendo solo operazioni di lettura, puoi anche liberare la memoria detenuta dagli oggetti della pagina, con il metodo page.FreeMemory(). Quindi è necessario seguire i passaggi seguenti per utilizzare risorse minime:

  1. Carica il documento PDF di origine
  2. Specificare TextEditOptions
  3. Leggi TextFragment
  4. Chiama il metodo Reset().
  5. Chiama il metodo FreeMemory().

Il frammento di codice seguente mostra l’estrazione di testo da documenti PDF utilizzando C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //Leggi qualcosa dai frammenti
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

Abbiamo testato questo frammento di codice con un enorme file di esempio contenente 450 pagine, 24500 frammenti di testo e molte immagini raster e vettoriali. Il processo ha consumato solo 500 MB di memoria. Un altro suggerimento qui è che puoi addebitare Garbage Collector .NET per ridurre il consumo massimo di memoria a circa 250 MB con un costo aggiuntivo di 10 secondi di tempo di elaborazione.

ii) Usare l’enumerazione MemorySaving

Aspose.PDF per .NET API supporta la configurazione della modalità di risparmio di memoria durante la lettura di testo da un file PDF. L’enumerazione TextExtractionOptions.TextFormattingMode serve allo scopo di un consumo ottimale delle risorse. I passaggi seguenti riepilogano i passaggi che devi seguire per questo approccio:

  1. Carica il file PDF di origine
  2. Crea un oggetto TextDevice.
  3. Imposta Opzioni di estrazione del testo
  4. Estrai il testo e scrivi il testo in un file

Di seguito il frammento di codice mostra l’approccio di risparmio di memoria usando C#:

// Apri documento
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// Stringa per contenere il testo estratto
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Crea dispositivo di testo
        TextDevice textDevice = new TextDevice();

        // Imposta le opzioni di estrazione del testo - imposta la modalità di estrazione del testo (Raw o Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Converti una pagina particolare e salva il testo nello stream
        textDevice.Process(pdfPage, textStream);
        // Converti una pagina particolare e salva il testo nello stream
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Chiudi il flusso di memoria
        textStream.Close();
        // Ottieni testo dal flusso di memoria
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Salva il testo estratto in un file di testo
File.WriteAllText(dataDir, builder.ToString());

Conclusione

Abbiamo esplorato alcuni dei molti casi d’uso utili in questo articolo, ci sono infinite possibilità di estrarre testo da documenti PDF usando C# con Aspose.PDF per .NET API. Puoi saperne di più tramite documentazione API. In caso di qualsiasi domanda, contattaci su Forum di supporto gratuito.

Guarda anche