26342 Letture

Leggere in un colpo solo il contenuto di centinaia di file PDF

Problema pratico: estrarre le prime righe da ciascun file PDF contenuto in una determinata cartella.
Un conoscente ci ha contattato perché aveva la necessità di annotare quanto contenuto nell'intestazione di alcune centinaia di file PDF, tutti memorizzati in una directory su disco.
Nell'esempio di soluzione che segue, illustriamo un approccio che prevede l'utilizzo di Visual Studio e di PDFBox, una libreria opensource che facilita enormemente la gestione dei documenti in formato PDF.

La soluzione seguente è stata messa a punto utilizzando Visual Basic 2005 Express Edition ma nulla vieta di impiegare la versione 2008 del pacchetto Microsoft (ved. questa pagina per il download).

PDFBox mette a disposizione gli strumenti per estrarre il testo presente nei documenti PDF, unire assieme più file, effettuare attività di codifica e decodifica, compilare i moduli presenti nei PDF, creare immagini a partire dalle singole pagine che compongono i PDF, stampare i documenti, effettuare ricerche.


Come primo passo è necessario scaricare il pacchetto di PDFBox estraendone il contenuto in una cartella di propria scelta, sul disco fisso.

Dopo aver avviato un nuovo progetto in Visual Basic, si dovrà provvedere a creare un paio di textbox all'interno del form principale (Form1) denominandole (proprietà Name), rispettivamente, txtTesto (quella superiore) e txtErrori (quella inferiore).
Nella prima textbox l'applicazione andrà ad annotare la parte iniziale del contenuto di tutti i file PDF; nella seconda textbox saranno appuntati i documenti che non dovessero essere leggibili.
Il pulsante Procedi (da denominare cmdProcedi) consentirà di avviare l'operazione di analisi del contenuto dei documenti PDF.
Da ultimo, è bene aggiungere due etichette: nella prima (lblFiles), l'applicazione in corso di sviluppo mostrerà i file via a via analizzati. La seconda label, invece, serve solo per chiarire a chi utilizzerà l'applicazione quale contenuto sarà mostrato nel secondo textbox (Documenti PDF che non è stato possibile gestire).

Le proprietà FormBorderStyle, MaximizeBox e StartPosition possono essere poste, rispettivamente, su FixedSingle, False e CenterScreen per modificare l'aspetto della finestra. La proprietà Text del form, al solito, permette di variare il tipo della finestra (i.e. Importa intestazione PDF).

La proprietà ScrollBars delle due textbox è bene sia posta su Vertical così da provocare la comparsa delle barre di scorrimento verticali.

Aggiungere i riferimenti a PDFBox

A questo punto, è indispensabile aggiungere i riferimenti alle librerie di PDFBox. Per procedere, basta cliccare sul menù Progetto, Aggiungi riferimento..., selezionare la scheda Sfoglia, portarsi nella cartella ove si è precedentemente estratto il contenuto del pacchetto di PDFBox ed aggiungere i file seguenti:
IKVM.GNU.Classpath.dll
PDFBox-0.7.3.dll
IKVM.Runtime.dll
FontBox-0.1.0-dev.dll


Nella finestra del codice, in Visual Basic, si dovrà innanzi tutto digitare quanto segue:
Imports System.IO
Imports org.pdfbox.pdmodel
Imports org.pdfbox.util

Stesura del codice

La funzione parseUsingPDFBox permetterà di estrarre il contenuto del file PDF sotto forma di testo:
Private Function parseUsingPDFBox(ByVal filename As String) As String
   Dim doc As PDDocument = PDDocument.load(filename)
   Dim stripper As PDFTextStripper = New PDFTextStripper()
   Try
      Return stripper.getText(doc)
   Catch
      txtErrori.Text = txtErrori.Text + vbCrLf + filename
      Return ""
   End Try
End Function


All'interno dell'evento Click del pulsante cmdProcedi si può inserire quanto segue:

Dim sPDF As String
Dim s As Integer = 0
Dim i
Dim stringa As String
Dim c As Long = 1

Dim dimensione As Integer

txtTesto.Text = ""
txtErrori.Text = ""
cmdProcedi.Enabled = False

Dim strFileSize As String = ""
Dim directory As New IO.DirectoryInfo(Application.StartupPath)
Dim filesArray As IO.FileInfo() = directory.GetFiles("*.pdf")
Dim file As IO.FileInfo

dimensione = filesArray.GetLength(dimensione)

For Each file In filesArray
      sPDF = parseUsingPDFBox(file.FullName)
      s = 0

      For i = 1 To 20
         s = InStr(s + 1, sPDF, vbCrLf)
      Next

   stringa = Mid(sPDF, 1, s)
   stringa = Replace(stringa, vbCrLf, " ")
   txtTesto.Text = txtTesto.Text + vbCrLf + vbCrLf + "- " + file.Name + " " + stringa

   lblFiles.Text = CStr(c) + " di " + CStr(dimensione)
   c = c + 1

   Application.DoEvents()


Next

MessageBox.Show("Operazione completata.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information)
cmdProcedi.Enabled = True


Com'è possibile verificare, dapprima l'elenco dei file PDF contenuti nella cartella dell'applicazione vengono inseriti all'interno di un array. La cartella all'interno della quale i documenti PDF vengono cercati è la stessa dalla quale l'applicazione viene eseguita, ovvero Application.StartupPath. Questo comportamento è liberamente modificabile prevedendo, per esempio, la comparsa di una finestra di dialogo (FolderBrowserDialogo od OpenFileDialog) che consenta all'utente di selezionare la cartella od i file d'interesse.

Per ciascun elemento contenuto nell'array (ciclo For ... Next viene invocata la funzione parseUsingPDFBox che restituisce il contenuto del documento PDF in formato testo (variabile stringa sPDF).

Il successivo ciclo For permette di individuare le prime venti righe del testo contenuto nel documento PDF correntemente preso in esame. Giunti alla ventesima esecuzione del ciclo For viene annotata nella variabile s la posizione dell'ultimo "accapo" (vbCrLf).
Tale valore (variabile s) viene passato alla funzione Mid che si occuperà di estrarre un numero di caratteri, partendo dall'inizio del testo estratto dal PDF (variabile sPDF), corrispondente al valore di s.

Successivamente, il testo raccolto viene aggiunto in calce alla textbox txtTesto.
L'istruzione seguente aggiorna il contenuto dell'etichetta lblFiles in modo tale che mostri il file sul quale si sta operando ed il numero complessivo di documenti PDF memorizzati nella cartella.


Si tratta di un esempio estremamente semplice realizzato in pochi minuti di lavoro. Purtuttavia, gli interessati possono trarne spunto per progettare applicazioni più complesse.
Maggiori informazioni sull'utilizzo di PDFBox sono disponibili in queste pagine.


Leggere in un colpo solo il contenuto di centinaia di file PDF - IlSoftware.it