[Python-es] Analizar cadena y extraer valores

Luis Iglesias luis.iglesias en vigo.org
Lun Jun 2 10:16:46 CEST 2014


----- Mensaje original -----
De: "Manuel A. Estevez Fernandez" <stvzito en gmail.com>
Para: "La lista de python en castellano" <Python-es en python.org>
Enviados: Jueves, 29 de Mayo 2014 19:03:47
Asunto: [Python-es] Analizar cadena y extraer valores




Saludos a todos 


Tengo la siguiente necesidad: 


Extraer el texto de un archivo PDF (una factura), el cual lo resolví utilizando pyPdf, sin embargo el texto texto resultante de la lectura, es una sola linea de texto de la cual debo extraer. 
El patrón de la información siempre es el mismo: 


COMMERCIAL INVOICESeller [Datos] Consignee [Datos] Notify Party [Datos] Departure Date: [datos] Delivery and Payment Term [Datos] Country of origin [Datos] Invoice No. & Date [Datos] PO no. & Date [Datos] Buyer Reference NO & Date [Datos] Buyer [Datos] Remarks [Datos] Other References [Datos ]Goods description Model code Quantity Unit priceAmount [descripcion] [Modelo] [Cantidad] [PrecioUnitario][Monto] Total: [Descripcion] [Cantidad] [Importe][Moneda][descripcion] [Modelo] [Cantidad] [PrecioUnitario][Monto] Total: [Descripcion] [Cantidad] [Importe][Moneda][descripcion] [Modelo] [Cantidad] [PrecioUnitario][Monto] Total: [Descripcion] [Cantidad] [Importe][Moneda] /////////END OF DATA////////////// 


Las que se encuentran en negritas son los tags que se repiten de forma fija. 


Sería de mucha ayuda si me pudieran indicar cuáles herramientas utilizar o algún método general para realizar este proceso. 


Gracias de antemano. 

by: 

ISC. Manuel Alejandro Estévez Fernández 

-------------------------------------------
Hola.
No conozco pyPDF.
Para analizar PDFs uso el programa pdftotext incluido en el paquete poppler-utils en linux. Creo que hay algo parecido también en Windows. La salida es un html en el que separa cada palabra con sus coordenadas indicando también los saltos de página.

$ pdftotext -htmlmeta -bbox impreso.pdf impreso.html

Y el documento generado tiene este aspecto:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta name="Producer" content="Acrobat Distiller 4.0 for Windows"/>
<meta name="CreationDate" content=""/>
</head>
<body>
<doc>
  <page width="595.000000" height="842.000000">
    <word xMin="462.760000" yMin="30.882720" xMax="476.708536" yMax="37.320720">Sello</word>
    <word xMin="478.599568" yMin="30.882720" xMax="501.197992" yMax="37.320720">registro</word>
    <word xMin="41.699520" yMin="197.208240" xMax="48.137520" yMax="243.360000">SOLICITANTE</word>
    <word xMin="54.040000" yMin="176.562820" xMax="66.043216" yMax="183.000820">DNI</word>
    <word xMin="77.422120" yMin="176.562820" xMax="88.506616" yMax="183.000820">CIF</word>
  </page>
</doc>
</body>
</html>

Puede ser un poco pesado tener que tratar palabra a palabra pero en mi caso es porque los programas que pasan pdf a texto plano, en caso de texto en tablas pueden mezclar unos campos con otros. Con esta solución, no es difícil hacer algunas funciones que recojan el texto en una región determinada. Las tengo en python, si te interesa te las paso.





Más información sobre la lista de distribución Python-es