首页 > 编程知识 正文

python提取pdf中的文字,使用python提取pdf文件

时间:2023-05-04 18:04:44 阅读:185690 作者:3216

问题的说明如下图所示,一份pdf有几十页,一页有9张图像。

提取图像,然后用图像下面的文本命名图像

主要问题:

图像提取文本识别参考了上面文本识别的资料,但是上面的图像提取顺序不一致,无法将两者结合起来实现我的需求

#爬虫防范码原创CSDN咨询: https://blog.csdn.net/qq_35866846

查看了pdfminer的源代码,找到了将pdf保存在一个页面上的方法。 保存后,在Image中裁剪图像的像素点。 格式是固定的,可以使用这个方法。 还没有找到更好的方法。 因为在网上找不到比较完整的处理问题的方法,所以我认为这是第一个版本。 有其他更好方法的朋友,请在评论区考虑

关于Image图像处理,我以前也写过几个博客:

图像将按宽度成比例缩放

长图按固定像素长度剪切

Python实现图像剪切缝线实验——numpy序列的脑浆游戏

代码实现#导入库import fitz、time、re、os、pdfminer、 datetimefrompdfminer.pdfparserimportpdfparserfrompdfminer.pdfdocumentimportpdfdocumentfrompdfminer.pdfpageimpage mpdfminer.pdfinterpimportpdfresourcemanager, PDFPageInterpreter #爬虫防范码---原创CSDN诡道: https://blog.csdn.net/q _ 35866846 frompdfminer.pdfdeviceimportpdfdevicefrompdfminer.layoutimportlaparamsfrompdfminer.converterimportpdfpageageagegegager image#页被保存为图像defsave_page_pic(pdf_path ),在保存page_path(:#之前,图像保存文件夹forwjinOS.listdir ) page_path wj ) )二进制引线doc=fitz.open(pdf_path )循环分页处理for d in doc: # )获取页码page=int(str(d ).split((1)1)单页图像命名pic.png ' page _ pic _ path=OS.path.join (page _ path ), pic_name ) #爬虫防范码---原创CSDN诡道: https://blog.csdn.net/QQ _ 35866846 #图片保存pix=d.get pixmap (ifpix.n 533660 # ) 否则,首先转换cmykpix0=fitz.pixmap ) fitz.csRGB,以确定pix ) pix0.writepng(page_pic_path ) pix0=None pix=None # code_path 'rb ' ) # createapdfparserobjectassociatedwiththefileobjectparser=pdf parser (# createapdfdocumentobjecttthatstststtttttttttttharer 爬行动物防范码---原创CSDN咨询: https://blog.csdn.net/QQ _ 35866846 # passwordforinitializationas2ndparameterdocument=pdf dococe checkifthedocumentallowstextextraction.if not,abbkifthedocumentallowstextextraction.if not

le: raise PDFTextExtractionNotAllowed # Create a PDF resource manager object that stores shared resources. rsrcmgr = PDFResourceManager() # Create a PDF device object. #device = PDFDevice(rsrcmgr) # BEGIN LAYOUT ANALYSIS. # Set parameters for analysis. laparams = LAParams( char_margin=10.0, line_margin=0.2, boxes_flow=0.2, all_texts=False, ) # Create a PDF page aggregator object. # device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 防爬虫识别码--原创CSDN诡途:https://blog.csdn.net/qq_35866846 device = PDFPageAggregator(rsrcmgr, laparams=laparams) # Create a PDF interpreter object. interpreter = PDFPageInterpreter(rsrcmgr, device) # loop over all pages in the document page_count = 0 result =[] for page in PDFPage.create_pages(document): page_count+=1 # read the page into a layout object interpreter.process_page(page) layout = device.get_result() txt_list = [] for obj in layout._objs: if isinstance(obj, pdfminer.layout.LTTextBoxHorizontal): txt = obj.get_text() # 无法识别的字符进行解码 cid_list = re.findall("cid:d+",txt) for cid in cid_list: cid_key = cid.split(":")[1] txt = txt.replace(f"({cid})",code_str[cid_key]) # 解码完成后判断是否还有未识别的字符 cid_list = re.findall("cid:d+",txt) if len(cid_list): print(f"解码字典需补充: {cid_list}") # 保存储存 txt_list.append(txt) txt_list.insert(0,page_count) result.append(txt_list) data = pd.DataFrame(result) data.columns =["页码" if col == 0 else f"元素{col}" for col in data.columns ] return datadef save_product_pic(txt_data,product_path,page_path): count,total_page= 0,len(os.listdir(page_path)) data = txt_data.copy() # 存储图片名称 result = [] for pic_name in os.listdir(page_path): count+=1 # 读取单页图片 pic_path = os.path.join(page_path,pic_name) im=Image.open(pic_path) # pdf中的页码 page = int(pic_name.split('_')[1].split('.')[0]) need_col = ['元素4', '元素5', '元素6', '元素10', '元素11', '元素12', '元素16', '元素17', '元素18'] product_pic_list = data[need_col][data.页码==page].values.tolist()[0] # (x,y)=im.size # 9张图的像素点设置 x_list = [[45,183],[237,375],[429,567]] y_list = [[38,245],[290,497],[542,749]] # 标记对应位置图片 # 横向1,2,3 n 4,5,6 n 7,8,9 i = 0 for _y in y_list: upper,lower=_y for _x in x_list: i+=1 left,right=_x # 循环获取每张图的像素点位 box = (left, upper, right, lower) # 最后一页可能没有9张图 # 防爬虫识别码--原创CSDN诡途:https://blog.csdn.net/qq_35866846 _product_pic_name=product_pic_list[i-1] if _product_pic_name : # 获取单个产品图的名称 product_pic_name = _product_pic_name.strip('n')+".png" result.append(product_pic_name[:-4]) # 构建图片保存路径 product_pic_path = os.path.join(product_path,product_pic_name) # 裁剪第 i 张图 i∈[1,9] 并保存 im.crop(box).save(product_pic_path) print(f"第{count}页图片提取成功,剩余{total_page-count}页!") pd_result = pd.DataFrame(result,columns=["图片名称"]) return pd_resultpdf_path = os.path.join("pdf",os.listdir("pdf")[0])today = str(datetime.datetime.today())[:10]fina_path = f"存档//{today}"product_path = f"存档//{today}//pic"# 单页图片存储地址page_path = "page_pic"# 自定义解码字典 - 及时更新补充 识别文本时对应无法识别的编码 # 防爬虫识别码--原创CSDN诡途:https://blog.csdn.net/qq_35866846code_str = {"46":"K","49":"N","25":"6","23":"4","28":"9","57":"V","45":"J","24":"5","56":"U",}try: os.mkdir(fina_path)except: print(f"文件夹 {fina_path} 已存在") try: os.mkdir(product_path)except: print(f"文件夹 {product_path} 已存在")# 分页保存成图片save_page_pic(pdf_path,page_path)# 提取文本信息txt_data = parse_pdf_txt(pdf_path,code_str)# 把提取到的文字 保存到本地# txt_data.to_excel(os.path.join(fina_path,"pdf文字信息.xlsx"),index=False)pic_name = save_product_pic(txt_data,product_path,page_path)# 把提取到的文字 整理后保存到本地-合并成一列,并只保留图片信息pic_name.to_excel(os.path.join(fina_path,"pdf文字信息.xlsx"),index=False)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。