in C#, Informatica, Programmazione

Estrarre Contenuto Testuale da PDF in C# con iText 7

L’estrazione di contenuti da un file pdf, sta diventando sempre più una richiesta per noi sviluppatori. La libreria iText 7 è una soluzione robusta e ampiamente riconosciuta per la manipolazione programmatica dei file PDF, offrendo funzionalità avanzate e una solida architettura per l’estrazione dati.

La presente guida fornisce una procedura dettagliata e professionale per l’implementazione di una funzionalità di estrazione del testo da un file PDF utilizzando la libreria iText 7.

1. Installazione del Pacchetto NuGet

Il primo passo consiste nell’integrazione della libreria iText 7 nel progetto C#. Si raccomanda di utilizzare il NuGet Package Manager di Visual Studio per una gestione efficiente delle dipendenze.

Aprire la Console di Gestione Pacchetti e digitare il seguente comando:

Install-Package iText7

Questo comando installerà la libreria di base di iText 7 e le sue dipendenze necessarie, preparando l’ambiente di sviluppo per l’interazione con i file PDF.

2. Implementazione della Logica di Estrazione

L’estrazione del testo si basa sull’utilizzo delle classi PdfReader e PdfDocument per accedere al contenuto del file. Il testo viene estratto pagina per pagina tramite la classe PdfTextExtractor, che applica una strategia di estrazione per interpretare e ordinare il testo in modo coerente.

Di seguito è riportato un metodo statico che incapsula la logica di estrazione, garantendo un’operazione sicura ed efficiente.

C#

using System;
using System.IO;
using System.Text;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

public static class PdfContentExtractor
{
    /// <summary>
    /// Estrae e restituisce l'intero contenuto testuale da un file PDF specificato.
    /// </summary>
    /// <param name="filePath">Il percorso completo del file PDF da elaborare.</param>
    /// <returns>Una stringa contenente il testo estratto dal documento.</returns>
    /// <exception cref="FileNotFoundException">Sollevata se il file specificato non esiste.</exception>
    public static string ExtractText(string filePath)
    {
        if (!File.Exists(filePath))
        {
            throw new FileNotFoundException($"Il file specificato non è stato trovato: {filePath}");
        }

        var textBuilder = new StringBuilder();

        // Utilizzo di un blocco 'using' per garantire la corretta gestione delle risorse.
        using (var reader = new PdfReader(filePath))
        using (var pdfDocument = new PdfDocument(reader))
        {
            int pageCount = pdfDocument.GetNumberOfPages();

            for (int pageNum = 1; pageNum <= pageCount; pageNum++)
            {
                var page = pdfDocument.GetPage(pageNum);

                // Estrae il testo dalla pagina utilizzando la strategia di estrazione predefinita.
                string pageText = PdfTextExtractor.GetTextFromPage(page, new LocationTextExtractionStrategy());
                
                textBuilder.Append(pageText);
                textBuilder.Append("\n"); // Aggiunge un separatore di linea tra le pagine
            }
        }
        
        return textBuilder.ToString();
    }
}

3. Analisi del Codice

L’implementazione presentata segue le best practice per la programmazione in C#:

  • Inclusione di Namespace: Le direttive using importano le classi necessarie da iText.Kernel.Pdf e iText.Kernel.Pdf.Canvas.Parser, fondamentali per l’accesso e l’estrazione del contenuto.
  • Gestione delle Risorse: I blocchi using vengono impiegati per la gestione degli oggetti PdfReader e PdfDocument. Questo assicura che le risorse di sistema, come i file aperti, vengano rilasciate in maniera tempestiva e automatica, prevenendo potenziali perdite di memoria.
  • Struttura a Ciclo: Un ciclo for itera attraverso ogni pagina del documento, numerate a partire da 1, consentendo un’elaborazione sequenziale.
  • Metodo di Estrazione: Il metodo PdfTextExtractor.GetTextFromPage è il componente principale per l’estrazione del testo. Accetta un oggetto PdfPage e una strategia di estrazione, come LocationTextExtractionStrategy, che analizza il posizionamento del testo per restituirlo in un ordine di lettura logico.
  • Efficienza della Stringa: L’utilizzo di StringBuilder per accumulare il testo estratto è una prassi consolidata in C# per ottimizzare le performance, specialmente con documenti di grandi dimensioni, evitando la creazione di numerosi oggetti stringa intermedi.

Questo metodo professionale consente agli sviluppatori di integrare la funzionalità di estrazione del testo in applicazioni C# con affidabilità e prestazioni elevate.

Una volta letto il contenuto del file pdf è possibile trasformalo, per esempio in chunk e successivamente memorizzare i chunk all’interno di un database vettoriale per applicazioni RAG.

4. Modello di licenza

iText 7 adotta un modello di licenza a doppia opzione, che offre flessibilità a seconda delle esigenze del progetto:

  1. Licenza AGPL (GNU Affero General Public License) – Open Source:
    • Questa licenza ti permette di utilizzare iText 7 gratuitamente.
    • Tuttavia, ha una condizione molto importante: se utilizzi iText 7 in un’applicazione che interagisce con gli utenti su una rete (ad esempio, un’applicazione web o un servizio online), devi rendere disponibile il codice sorgente completo della tua applicazione, non solo quello relativo a iText.
    • Questa licenza è spesso definita “virale” o “copyleft” perché le sue condizioni si estendono all’intero progetto che la utilizza.
    • È una scelta valida per progetti open source o per applicazioni interne a un’azienda che non vengono distribuite a terzi.
  2. Licenza Commerciale:
    • Se non puoi o non vuoi rispettare i termini della licenza AGPL (ad esempio, se la tua applicazione è proprietaria, a codice chiuso o non puoi divulgare il codice sorgente), devi acquistare una licenza commerciale da iText.
    • Questa licenza ti esonera dalle restrizioni dell’AGPL, permettendoti di mantenere il tuo codice sorgente riservato.
    • Le licenze commerciali offrono anche vantaggi aggiuntivi, come supporto tecnico professionale, aggiornamenti, e garanzie legali. Il prezzo è spesso basato sul volume di utilizzo (numero di documenti processati) o su una sottoscrizione annuale.

In sintesi, la scelta della licenza dipende strettamente dalla natura del tuo progetto:

  • Se il tuo progetto è open source o un’applicazione interna che non viene distribuita, la licenza AGPL potrebbe essere sufficiente.
  • Se stai sviluppando un’applicazione commerciale o proprietaria che non vuoi divulgare, è necessario l’acquisto di una licenza commerciale.

È sempre consigliabile consultare la documentazione ufficiale di iText o, in caso di dubbi, contattare il loro team di supporto per assicurarsi di essere in piena conformità legale.