Qualche volta potrebbe capitare, come oggi è capitato a me, di dover cercare del testo contenuto dentro ad un file PDF tramite codice .net.
Innanzitutto mi sono affidato alla sempre ottima libreria
ITextSharp con la quale mi sento sempre a mio agio, ma purtroppo questa volta non ho trovato niente di "già pronto" per questa esigenza.
Allora ho cominciato da "buon developer" a cercare su internet qualche
specifica del file pdf da Adobe e se qualche altro avesse già fatto qualcosa del genere.
Alla fine ne sono uscito con questo codice che sembra funzionare discretamente per quasi tutti i documenti su cui dovevo cercare:
StringBuilder sb = new StringBuilder();
PdfReader reader = new PdfReader("...path del file pdf...");
for (int i = 1; i <= reader.NumberOfPages; i++)
{
byte[] bytes = reader.GetPageContent(i);
bool inserire = false;
char c;
foreach (byte item in bytes)
{
c = (char)item;
if (c == '(')
{
inserire = true;
continue; //--- sta cominciando una parola salto la tonda
}
if (c == ')')
inserire = false; //--- finita la parola
if(inserire)
sb.Append(c);
}
}
sb.ToString(); //--- ho tutto il testo del pdf in questa stringa
Come da specifiche ( capitolo 4:Text delle specifiche di adobe ) il testo viene racchiuso dentro alle parentesi tonde, e ITextSharp mi permette di analizzare direttamente il contenuto della singola pagina (metodo "GetPageContent()" ) , carattere per carattere, senza preoccuparmi di codifiche o altri byte che compongono file pdf.
Chiaramente arrivato ad avere il testo in memoria su una stringa l'obiettivo è raggiunto,ossia posso usare le Regex per fare qualsiasi tipo di ricerca...