python pdf表格识别不出来,如何使用Python从PDF中提取表格作为文本?

该答案适用于遇到带有图像的PDF并需要使用OCR的任何人。我找不到可行的开箱即用的解决方案; 没有什么可以给我我所需的准确性。

这是我发现可以使用的步骤。

使用

Tesseract

检测旋转, 然后使用

ImageMagick

mogrify

进行修复。

使用OpenCV搜索和提取表。

使用OpenCV查找并提取表中的每个单元格。

使用OpenCV修剪并清除每个单元格, 以免使OCR软件混乱。

使用Tesseract识别每个单元格。

将每个单元格的提取文本合并为所需的格式。

我写了一个带有模块的python软件包, 可以帮助完成这些步骤。

其中一些步骤不需要任何代码, 它们使用外部工具, 例如

pdfimages

tesseract

。我将给出一些需要代码的步骤的快速示例。

搜索表格:

import cv2

def find_tables(image):

BLUR_KERNEL_SIZE = (17, 17)

STD_DEV_X_DIRECTION = 0

STD_DEV_Y_DIRECTION = 0

blurred = cv2.GaussianBlur(image, BLUR_KERNEL_SIZE, STD_DEV_X_DIRECTION, STD_DEV_Y_DIRECTION)

MAX_COLOR_VAL = 255

BLOCK_SIZE = 15

SUBTRACT_FROM_MEAN = -2

img_bin = cv2.adaptiveThreshold(

~blurred,

MAX_COLOR_VAL,

cv2.ADAPTIVE_THRESH_MEAN_C,

cv2.THRESH_BINARY,

BLOCK_SIZE,

SUBTRACT_FROM_MEAN,

)

vertical = horizontal = img_bin.copy()

SCALE = 5

image_width, image_height = horizontal.shape

horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (int(image_width / SCALE), 1))

horizontally_opened = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, horizontal_kernel)

vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, int(image_height / SCALE)))

vertically_opened = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, vertical_kernel)

horizontally_dilated = cv2.dilate(horizontally_opened, cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1)))

vertically_dilated = cv2.dilate(vertically_opened, cv2.getStructuringElement(cv2.MORPH_RECT, (1, 60)))

mask = horizontally_dilated + vertically_dilated

contours, hierarchy = cv2.findContours(

mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE,

)

MIN_TABLE_AREA = 1e5

contours = [c for c in contours if cv2.contourArea(c) > MIN_TABLE_AREA]

perimeter_lengths = [cv2.arcLength(c, True) for c in contours]

epsilons = [0.1 * p for p in perimeter_lengths]

approx_polys = [cv2.approxPolyDP(c, e, True) for c, e in zip(contours, epsilons)]

bounding_rects = [cv2.boundingRect(a) for a in approx_polys]

# The link where a lot of this code was borrowed from recommends an

# additional step to check the number of "joints" inside this bounding rectangle.

# A table should have a lot of intersections. We might have a rectangular image

# here though which would only have 4 intersections, 1 at each corner.

# Leaving that step as a future TODO if it is ever necessary.

images = [image[y:y+h, x:x+w] for x, y, w, h in bounding_rects]

return images

从表中提取单元格。

这与2非常相似, 因此我不会包含所有代码。我将提到的部分是有关对单元格进行排序的。

我们要从左到右以及从上到下识别单元格。

我们将在左上角找到一个矩形。然后我们找到所有中心在左上矩形的顶部和底部Y值内的矩形。然后, 我们根据这些矩形中心的x值对这些矩形进行排序。我们将从列表中删除这些矩形并重复。

def cell_in_same_row(c1, c2):

c1_center = c1[1] + c1[3] - c1[3] / 2

c2_bottom = c2[1] + c2[3]

c2_top = c2[1]

return c2_top < c1_center < c2_bottom

orig_cells = [c for c in cells]

rows = []

while cells:

first = cells[0]

rest = cells[1:]

cells_in_same_row = sorted(

[

c for c in rest

if cell_in_same_row(c, first)

],

key=lambda c: c[0]

)

row_cells = sorted([first] + cells_in_same_row, key=lambda c: c[0])

rows.append(row_cells)

cells = [

c for c in rest

if not cell_in_same_row(c, first)

]

# Sort rows by average height of their center.

def avg_height_of_center(row):

centers = [y + h - h / 2 for x, y, w, h in row]

return sum(centers) / len(centers)

rows.sort(key=avg_height_of_center)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种开源的编程语言,可以使用它实现各种数据处理和分析任务,包括处理PDF文件。在处理PDF文件时,需要提取表格和文字内容,这就需要使用Python的相关库。 有许多Python库可以用于处理PDF文件,其比较流行的包括PyPDF2、pdfminer、pypdfocr等。这些库提供了一些方便的功能,例如提取PDF文件的文字、获取PDF文件表格等。 在实现同时提取表格和文字时,可以使用Tabula-py和PDFplumber这两个库。Tabula-py提供了一种简单的方式来提取PDF文件表格,它可以识别文本表格并将其转换为CSV、JSON以及HTML格式。PDFplumber则可以对PDF文件进行更加全面的处理,它可以提取PDF文件的文字、图片、表格等内容。 使用Tabula-py库实现提取表格的示例代码如下: ``` import tabula # 设置参数 pdf_file = "example.pdf" output_file = "example.csv" # 读取表格 df = tabula.read_pdf(pdf_file, pages='all') # 将表格转换为CSV格式并保存到磁盘 df.to_csv(output_file, index=False, encoding='utf-8') ``` 使用PDFplumber库实现提取文字的示例代码如下: ``` import pdfplumber # 设置参数 pdf_file = "example.pdf" # 打开PDF文件 with pdfplumber.open(pdf_file) as pdf: # 遍历每一页 for page in pdf.pages: # 提取文字 text = page.extract_text() # 输出结果 print(text) ``` 以上示例演示了如何使用Python库实现同时提取PDF文件表格和文字内容。根据具体的需求,可以选择合适的库进行处理,并将其集成到自己的应用程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值