如何用Python/R关联PDF提取的文本数据与对应图片?
如何关联PDF提取的图片与对应文本标签并生成目标DataFrame?
我明白你现在的困境:你需要从PDF中提取编号(NUMBER)、订单号(ORDER)和对应图片,最终生成指定格式的DataFrame,同时把图片保存到指定文件夹。目前你已经能成功提取图片,但没法建立图片和文本标签的关联。
先看你期望的输出格式:
NUMBER ORDER IMAGE 09090087 345679 345679.jpg 09090087 535278 535278.jpg
你的现有代码只是遍历了PDF中的所有XObject图片,没有结合页面的文本信息来做关联。要解决这个问题,我们可以利用PyMuPDF(你正在用的fitz库)的页面文本提取和图片定位功能,把页面上的文本标签和同页面的图片绑定起来。
解决方案思路
- 遍历PDF的每一页,先提取页面中的文本,用正则匹配出
NUMBER和ORDER值。 - 提取当前页面中的所有图片,将图片以对应的
ORDER值命名保存(比如345679.jpg)。 - 把每一组
NUMBER、ORDER、图片文件名存入列表,最后转换为DataFrame。
修改后的代码实现
from __future__ import print_function import fitz import sys import re import pandas as pd # 定义正则表达式匹配NUMBER和ORDER(根据你的PDF文本格式调整) # 假设NUMBER是8位数字,ORDER是6位数字,可根据实际情况修改 pattern_number = re.compile(r'NUMBER\s*(\d{8})') pattern_order = re.compile(r'ORDER\s*(\d{6})') # 初始化存储数据的列表 data_list = [] # 指定图片保存文件夹 img_folder = "pdfimg/" doc = fitz.open(sys.argv[1]) for page_num in range(len(doc)): page = doc[page_num] # 提取页面文本 page_text = page.get_text() # 匹配当前页面的NUMBER和ORDER number_match = pattern_number.search(page_text) order_match = pattern_order.search(page_text) if not number_match or not order_match: continue # 如果当前页面没有匹配到,跳过 number = number_match.group(1) order = order_match.group(1) # 提取当前页面的所有图片 image_list = page.get_images(full=True) for img_index, img in enumerate(image_list): xref = img[0] pix = fitz.Pixmap(doc, xref) # 用ORDER作为图片文件名,若一页多张可加索引区分 img_filename = f"{order}.jpg" if img_index == 0 else f"{order}_{img_index}.jpg" img_path = f"{img_folder}{img_filename}" # 保存图片 if pix.n < 5: pix.save(img_path) else: pix_rgb = fitz.Pixmap(fitz.csRGB, pix) pix_rgb.save(img_path) pix_rgb = None pix = None # 将数据添加到列表 data_list.append({ "NUMBER": number, "ORDER": order, "IMAGE": img_filename }) # 生成DataFrame df = pd.DataFrame(data_list) print(df) # 可选:将DataFrame保存到CSV或数据库 # df.to_csv("pdf_data.csv", index=False)
关键说明
- 正则调整:你需要根据PDF中实际的文本格式调整
pattern_number和pattern_order的正则表达式,确保能准确匹配到NUMBER和ORDER的值。 - 多图处理:如果同一页面有多个图片,代码中通过添加索引区分文件名(比如
345679_0.jpg、345679_1.jpg),你可以根据实际需求修改这部分逻辑。 - 文本定位:如果文本和图片在页面上的位置有对应关系(比如图片在ORDER文本下方),还可以通过获取文本和图片的坐标来进一步确认关联,提升准确性。
内容的提问来源于stack exchange,提问作者COLO
相关产品推荐
相关产品推荐

