如何使用pdfPlumber过滤特定区域内的文本并打开CV?

How to filter text within a certain area using pdfPlumber and open CV?

提问人:Valuex 提问时间:8/18/2022 更新时间:8/18/2022 访问量:672

问:

我有一堆来自会议论文集的pdf文件。
每个 pdf 文件的结构如下所示:

                   Tile with bold, large size font
    Author1                Author2                 AuthorN
Afflication1          Afflication2            AfflicationN
Email1                  Email2                   Email3

我使用pdfPlumber选择字体大小最大的字符作为标题,它有效。
为了获取作者 - 隶属关系 - 电子邮件信息,我使用 cv2 来识别文本块,
然后过滤每个 cv2 框中的字符。
但现在它不起作用。
似乎 boxpoints 的 x/y(由 cv2 生成)与 pdfPlumber 生成的 x0/x1/top/bottom 不同。

这是我是如何做到的。任何帮助或意见将不胜感激。

def getCharsInBox(box):
    left_point_x=np.min(box[:,0])
    right_point_x=np.max(box[:,0])
    top_point_y=np.min(box[:,1])
    bottom_point_y=np.max(box[:,1])
    return lambda x:((x.get("x0",0)>=left_point_x &\
                      x.get("x0",0)<=right_point_x &\
                      x.get("top",0)>=top_point_x &\
                      x.get("bottom",0)<=bottom_point_y))


for box in region:
    filtered=page.filter(getCharsInBox(box))
    pdfAAE=filtered.extract_text()


Python PDF pdf水管工

评论


答:

1赞 Valuex 8/18/2022 #1

我想通了。
在 pdfPlumber 中,x0/x1/y0/y1 的单位,...是,实际 1/72 英寸。这是来自pdf标准。
在 opencv 中,“单位”是像素
所以像素在进行过滤之前需要转换为

另一个值得注意的一点是,即使在 corping 之后,页面对象 (pdfPlumper) 中每个字符的协调仍然基于原始页面。因此,必须减去这些滤波的 coppped x/y corrdination,如下所示:

def getCharsInBox(box):
    # img.shape=[width of img, heigh of image,other]
    left_point_x=np.min(box[:,0])*page.width/img.shape[1]
    right_point_x=np.max(box[:,0])*page.width/img.shape[1]
    top_point_y=np.min(box[:,1])*page.height/img.shape[0]
    bottom_point_y=np.max(box[:,1])*page.height/img.shape[0]
    return lambda x:((x.get("x0",0)>=left_point_x &\
                      x.get("x0",0)<=right_point_x &\
                      x.get("top",0)-croppedY>=top_point_x &\
                      x.get("bottom",0)-croppedY<=bottom_point_y))


for box in region:
    filtered=page.filter(getCharsInBox(box))
    pdfAAE=filtered.extract_text()