martes, 10 de mayo de 2011

Explotar un PDF en sus paginas y extraer textos claves

Problema:
Tienes un PDF generado por tu programa de nomina (pongamos A3NOM). En un solo archivo tienes las nominas de todos los empleados. Los textos en el PDF son accesibles, puedes copiar por ejemplo el DNI del empleado y el NIF de la empresa.
Tu necesitas guardar cada página en un fichero que tenga por nombre DNI-NIF.PDF

Solución:
Descargas itext desde http://sourceforge.net/projects/itextsharp/
Luego construyes una rutina que vaya recorriendo todas las páginas.
En cada una extraes el texto con GetTextFromPage
Luego extraes el dni y el nif con las expresiones regulares correspondientes.
Finalmente extraes y guardas la página en un archivo con el nombre deseado.
Mejor verlo en código:
Imports iTextSharp.text.pdf, System.Text, System.IO, System.Text.RegularExpressions

Sub recorrePaginas(ByVal archivo As String)
Dim rgDNI = New Regex("\d{8}[A-Z]")
Dim rgNIF = New Regex("[A-Z]\d{8}")
Dim lectorPDF = New PdfReader(archivo)
Dim TotalPaginas = lectorPDF.NumberOfPages
For Pagina = 1 To TotalPaginas
Console.WriteLine(Pagina.ToString + "\" + TotalPaginas.ToString)
Dim texto = parser.PdfTextExtractor.GetTextFromPage(lectorPDF, Pagina)
texto = Encoding.UTF8.GetString (ASCIIEncoding.Convert (Encoding.Default,
Encoding.UTF8, Encoding.Default.GetBytes(texto)))
Dim DNI = rgDNI.Match(texto).Value
Dim NIF = rgNIF.Match(texto).Value
Dim nombreArchivo = String.Format("c:\pruebas\{0}-{1}.pdf", DNI, NIF)
If File.Exists(nombreArchivo) Then File.Delete(nombreArchivo)
Dim doc = New iTextSharp.text.Document(lectorPDF.GetPageSizeWithRotation(Pagina))
Dim escritor = New PdfCopy(doc, File.Create(nombreARchivo))
doc.Open()
Dim paginaPDF = escritor.GetImportedPage(lectorPDF, Pagina)
escritor.AddPage(paginaPDF)
doc.Close()
escritor.Close()
Next
End Sub

Comentario:
Hay que ver como nos complican la vida los programadores de gestiones nominas y demás.
Con lo sencillo que sería dar la opción de generar en PDF separados la nominas y exportar en texto la información mas basica asociada al PDF.
¡Pero que se puede esperar de una gente que siempre escribe lo nombres de los campos en mayúsculas

2 comentarios:

Unknown dijo...

Hola buenos días,

Habría alguna posibilidad de que compilases el código y lo compartieses.

Es que no tengo mucha idea de programación y lo que propone es exactamente lo que necesito.

Muchas gracias.

Arturo Soler dijo...

Lo siento Jesús no es tan fácil.El código que muestro forma parte de una aplicación que se integra en nuestras bases de datos.