【问题标题】:How to detect colored blocks in a PDF file with python (pdfminer, minecart, tabula...)如何使用 python(pdfminer、minecart、tabula ...)检测 PDF 文件中的彩色块
【发布时间】:2023-01-12 05:22:23
【问题描述】:
我正在尝试从 PDF 文件中提取相当多的表格。这些表格用不同的颜色方便地“突出显示”,这使得眼睛很容易捕捉(参见示例屏幕截图)。
我认为检测那些彩色块的位置/坐标并使用坐标提取表格会很好。
我已经弄清楚了表格提取部分(使用 tabula-py)。所以这是阻止我的第一步。据我所知,minecart 是处理 PDF 文件中颜色和形状的最佳工具,但使用 OpenCV 进行全尺寸图像处理除外。但是我没有运气检测彩色框/块坐标。
将不胜感激任何帮助!
【问题讨论】:
标签:
python
pdf
shapes
pdfminer
【解决方案1】:
我想我有一个解决方案:
import minecart
pdffile = open(fn, 'rb')
doc = minecart.Document(pdffile)
page = doc.get_page(page_num) # page_num is 0-based
for shape in page.shapes.iter_in_bbox((0, 0, 612, 792 )):
if shape.fill:
shape_bbox = shape.get_bbox()
shape_color = shape.fill.color.as_rgb()
print(shape_bbox, shape_color)
然后我需要过滤颜色或形状大小......
我之前的失败是因为使用了错误的页码 :(
【解决方案2】:
PyMuPDF 允许您提取所谓的“艺术线条”:页面上的矢量图。
这是一个“路径”词典列表(如 PDF 调用互连绘图),您可以从中为您选择感兴趣的子项。
例如。以下标识代表填充矩形的图形,不要太小:
page = doc[0] # load some page (here page 0)
paths = page.get_drawings() # extract all vector graphics
filled_rects = [] # filled rectangles without border land here
for path in paths:
if path["type"] != "f" # only consider paths with a fill color
continue
rect = path["rect"]
if rect.width < 20 or rect.height < 20: # only consider sizable rects
continue
filled_rects.append(rect) # hopefully an area coloring a table
# make a visible border around the hits to see success:
for rect in filled_rects:
page.draw_rect(rect, color=fitz.pdfcolor["red"])
doc.save("debug.pdf")