引言
- 在研究表格结构还原时,针对基于文本为基础的PDF,是可以尝试直接提取表格的,不用走OCR模型。
- 基于文本为基础的意思就是用PDF阅读器打开PDF文件,可以直接复制的。
Camelot only works with text-based PDFs and not scanned documents. (As Tabula explains, “If you can click and drag to select text in your table in a PDF viewer, then your PDF is text-based”.)
camelot提取表格相关代码
- foo.pdf下载链接:link
- 说明1:因为camelot底部是依赖pdfminer库来做PDF内容提取的,所以其获得的内容坐标值中的y值需要用page的高减去获得的值,才是正常框的值。
- 说明2: 同样因为是基于pdfminer库提取内容,所以默认提取内容,获得框坐标时,dpi值默认为72,而camelot的read_pdf函数获得图像,其dpi值为300。这就有了表格框坐标与获得图像位置不对应的问题。这块提了issue-486,可以移步去那里详细看一下。
- 对应校正代码:
import camelot import copy import cv2 def draw_bbox(img, start_point, end_point, ratio=1): start_point = tuple(map(lambda x: round(x * ratio), start_point)) end_point = tuple(map(lambda x: round(x * ratio), end_point)) cv2.rectangle(img, start_point, end_point, (0, 255, 0), 2) pdf_path = 'foo.pdf' tables = camelot.read_pdf(pdf_path, flavor='lattice', backend="poppler") table = tables[0] table_x0, table_y0, table_x1, table_y1 = table._bbox img = table._image[0] ratio = 300 / 72 pdf_height = img.shape[0] / ratio new_tmp_img = copy.deepcopy(img) draw_bbox(new_tmp_img, start_point=(table_x0, pdf_height - table_y0), end_point=(table_x1, pdf_height - table_y1), ratio=ratio) cv2.imwrite('foo_right.jpg', new_tmp_img)
- 结果图:
- 结果图: