需要将pdf转成txt,先后尝试使用python库pdfminer与pyocr(tesseract)。

1. pdfminer:

没研究原理,识别效果还可以。但识别效果是按照各个区域块去识别文字,而不是按行识别,所以格式混乱时不太推荐。当文字在pdf上无法选中时,pdfminer也无法识别该文字。好像还可以用来识别表格之类的,没试过。代码如下:

先装库:pip install pdfminer3k

from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import LTTextBoxHorizontal, LAParamsdef pdf2txt_miner(f_from, f_to):# 按块识别, 可选中的文字print(f'start: {f_from}')fp = open(f_from, 'rb')# 用文件对象来创建一个pdf文档分析器praser = PDFParser(fp)# 创建一个PDF文档doc = PDFDocument()# 连接分析器 与文档对象praser.set_document(doc)doc.set_parser(praser)# 提供初始化密码# 如果没有密码 就创建一个空的字符串doc.initialize()# 检测文档是否提供txt转换,不提供就忽略if not doc.is_extractable:pass# raise PDFTextExtractionNotAllowedelse:# 创建PDf 资源管理器 来管理共享资源rsrcmgr = PDFResourceManager()# 创建一个PDF设备对象laparams = LAParams()device = PDFPageAggregator(rsrcmgr, laparams=laparams)# 创建一个PDF解释器对象interpreter = PDFPageInterpreter(rsrcmgr, device)with open(f_to, 'w') as f:# 循环遍历列表,每次处理一个page的内容for page in doc.get_pages():  # doc.get_pages() 获取page列表interpreter.process_page(page)# 接受该页面的LTPage对象layout = device.get_result()# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,for x in layout:if (isinstance(x, LTTextBoxHorizontal)):results = x.get_text()for gar in garbage_text:if results.startswith(gar):breakelse:print(results)f.write(results.replace('\n', ' '))fp.close()

2. pyocr:

效果还可以,在本次的需求上效果比pdfminer要好。我安装了windows和centos的两个系统,但很遗憾具体步骤我都记不清了.....虽然还是上周的事情..........

简单描述一下吧。

(1) windows: 需要装PIL、tesseract、pyocr、imagemagic。

(2) centos: https://github.com/tesseract-ocr/tesseract/wiki#centos-fedora-scientificlinux-opensuse-rhel-packages

注意:tesseract在两个系统中都需要配置环境变量的。

代码如下:

from wand.image import Image
from PIL import Image as PI
import pyocr
import pyocr.buildersdef pdf_ocr(f_from, f_to):print(pyocr.get_available_tools())# 默认三个tools,分别为tesseract,libtesseract,cuneiform,我使用的是tesseract。tool = pyocr.get_available_tools()[0]print(tool.get_available_languages())# 语言选择英语lang = tool.get_available_languages()[0]req_image = []total_txt = ''final_list = []pkl_path = f_from.rsplit('.')[0]+'___txt.pkl'with open(f_to, 'w', encoding='utf-8') as f_to:if os.path.exists(pkl_path):total_txt = pickle.load(open(pkl_path, 'rb'))else:# pdf先转成图片,resolution可以调分辨率。image_pdf = Image(filename=f_from, resolution=300)# image_pdf = Image(filename=f_from)image_jpeg = image_pdf.convert('jpeg')for img in image_jpeg.sequence:print(img)img_page = Image(image=img)req_image.append(img_page.make_blob('jpeg'))# 对图片进行ocr识别for idx, img in enumerate(req_image):print(idx)txt = tool.image_to_string(PI.open(io.BytesIO(img)),lang=lang,builder=pyocr.builders.TextBuilder())total_txt = total_txt + txtpickle.dump(total_txt, open(pkl_path, 'wb'))

python之pdf转txt的两种方法——pdfminer与ocr相关推荐

  1. python requirements.txt_python生成requirements.txt的两种方法

    这篇文章主要介绍了python生成requirements.txt的两种方法,每种方法给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 python项目如何在另一个环境上重新构建项目 ...

  2. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)

    本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...

  3. ​CAD图纸怎么转换成PDF格式?这两种方法快速转换

    怎么把CAD图纸转换成PDF格式呢?大家在使用CAD绘图工具制作CAD图纸的时候,在将图纸绘制好后为了能够方便发送和浏览,会选择把图纸转换成PDF文件格式来保存发送,这样就不会出现文件打不开的现象.但 ...

  4. python hist直方图拟合曲线_详解用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotli ...

  5. Java调用打印机打印PDF文档的两种方法

    最近,由于项目需求,需要增加系统调用打印机打印PDF文档功能.以前在Asp.Net项目中做过套打,但是现在的需求直接文档打印,下面是实现代码调用打印机的两种方法. 1.Java Print Servi ...

  6. OFD文件怎么转换成PDF格式?这两种方法轻松实现转换

    怎么把OFD文件转换成PDF格式呢?OFD文件大家可能不太熟悉,使用的也不多,它其实也是一种归档保存的一种文件格式,在很多方面与PDF文件有些相似,但是打开它需要使用到相关的OFD阅读器,这个就会让很 ...

  7. 如何把图片转换成PDF格式?这两种方法不要错过

    怎么把图片转换成PDF文件格式呢?PDF文件一直以来都是我们传输文件的好帮手,它的显著效果不仅可以体现在文件上,也可以在图片中拥有良好的体验感.我们将图片转换成PDF格式来发送或者是打印,就不会出现排 ...

  8. python直方图拟合曲线_用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotli ...

  9. Python 项目依赖包 第三方库 生成requirements.txt的两种方法

    python项目如何在另一个环境上重新构建项目所需要的运行环境依赖包? 使用的时候边记载是个很麻烦的事情,总会出现遗漏的包的问题,这个时候手动安装也很麻烦,不能确定代码报错的需要安装的包是什么版本.这 ...

最新文章

  1. Linux运维人员成长之路学习书籍推荐
  2. OC实例变量和属性-@synthesize与@property
  3. er图转为数据流程图_draw.io for Mac(流程图绘制工具)
  4. SQL Server中的角色(服务器级别和数据库级别角色)
  5. 通过excel模板文件根据数据库数据修改其中的单元格数据
  6. laravel数据库相关操作
  7. MySQL流浪记(三)—— Linux安装MySQL数据库5.7.30(亲测有效3分钟即可)
  8. scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?
  9. OpecCV颜色分割
  10. c++解决哥德巴赫猜想问题/c++实现任一大于2的偶数都可以写为两个素数之和
  11. 大数据分析对物联网发展有什么影响
  12. python核心编程---读书笔记:第16章 网络编程
  13. NumPy常用中文手册
  14. wpsOffice文件在线预览-java接入
  15. 企业实践|分布式系统可观测性之应用业务指标监控
  16. 多语言机器翻译 | (1)多语言翻译模型简介
  17. 【机器学习】花卉识别01
  18. iOS 分析MVC、MVP、MVVM、VIPER
  19. ShowWindow 隐藏、显示、最大化、最小化窗口
  20. 概率速度2013年阿里巴巴暑期实习生笔试题--2013年5月5日考试

热门文章

  1. Docker构建MySQL镜像并初始化
  2. aircrack-ng渗透WPA加密
  3. 【运维实战家】无线三建七优之负载均衡-锐捷无线
  4. 英语经典口语999句
  5. 本网吧单机游戏存档路径!!!
  6. 如何进行产品功能设计
  7. 【​观察】数据中心业务这张“神秘牌”,如何加码联想中国区提速?
  8. mac应用程序在哪_如何在Mac上列出所有应用程序
  9. Project2007操作手册(原创)
  10. BatBot智慧电力(运维)云平台