解决:使用camelot提取PDF中表格框与图像位置不对应问题

引言
  • 在研究表格结构还原时,针对基于文本为基础的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)
    
    • 结果图:

你可能感兴趣的:(工具,python,camelot,提取PDF表格)