Extraer tablas de un pdf

Estoy tratando de obtener los datos de las tablas en este PDF . He intentado pdfminer y pypdf con un poco de suerte, pero realmente no puedo obtener los datos de las tablas.

Así es como se ve una de las tablas: introduzca la descripción de la imagen aquí

Como puede ver, algunas columnas están marcadas con una ‘x’. Estoy tratando de esta tabla en una lista de objetos.

Este es el código hasta ahora, estoy usando pdfminer ahora.

# pdfminer test from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfparser import PDFParser from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfdevice import PDFDevice, TagExtractor from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, PDFPageAggregator from pdfminer.cmapdb import CMapDB from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage from pdfminer.image import ImageWriter from cStringIO import StringIO import sys import os def pdfToText(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = file(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = '' maxpages = 0 caching = True pagenos = set() records = [] i = 1 for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True): # process page interpreter.process_page(page) # only select lines from the line containing 'Tool' to the line containing "1 The 'All'" lines = retstr.getvalue().splitlines() idx = containsSubString(lines, 'Tool') lines = lines[idx+1:] idx = containsSubString(lines, "1 The 'All'") lines = lines[:idx] for line in lines: records.append(line) i += 1 fp.close() device.close() retstr.close() return records def containsSubString(list, substring): # find a substring in a list item for i, s in enumerate(list): if substring in s: return i return -1 # process pdf fn = '../test1.pdf' ft = 'test.txt' text = pdfToText(fn) outFile = open(ft, 'w') for i in range(0, len(text)): outFile.write(text[i]) outFile.close() 

Eso produce un archivo de texto y obtiene todo el texto, pero las x no tienen el espaciado conservado. La salida se ve así: introduzca la descripción de la imagen aquí

Las x son solo espaciadas en el documento de texto

En este momento, solo estoy produciendo resultados de texto, pero mi objective es producir un documento html con los datos de las tablas. He estado buscando ejemplos de OCR, y la mayoría de ellos parecen confusos o incompletos. Estoy abierto a usar C # o cualquier otro idioma que pueda producir los resultados que estoy buscando.

EDITAR: Habrá varios PDF como este de los que necesito obtener los datos de la tabla. Los encabezados serán los mismos para todos los archivos PDF (hasta donde sé).

Me di cuenta, iba en la dirección equivocada. Lo que hice fue crear pngs de cada tabla en el pdf y ahora estoy procesando las imágenes usando opencv y python.

Pruebe con Tabula y, si funciona, use la biblioteca tabula-extractor (escrita en ruby) para extraer los datos mediante progtwigción.