Python PyPDF2、pdfplumber 提取 PDF 文本、图片内容

Python PyPDF2、pdfplumber 提取 PDF 文本、图片内容PythonPyPDF2、pdfplumber提取PDF文本、图片内容PythonPyPDF2、pdfplumber提取PDF文本、图片内容安装库安装pdfplumber安装PyPDF2内容提取代码图片提取文本提取完整代码PythonPyPDF2、pdfplumber提取PDF文本、图片内容说明本方法提取的图片并不算完整,我测试用的是阿里2017年双十一的一份P…

大家好,又见面了,我是你们的朋友全栈君。

Python PyPDF2、pdfplumber 提取 PDF 文本、图片内容

说明

本方法提取的图片并不算完整,我测试用的是阿里2017年双十一的一份PDF,AliDouble11.pdf,提取过程中有一处报错,部分图片提取不完整

由于PyPDF2 直接提取文本内容对中文支持不友好,因此结合两个库提取

安装库

安装 pdfplumber

pdfplumber 可以使用 pip 安装

pip install pdfplumber 

安装 PyPDF2

PyPDF2 需要去 GitHub 下载 https://github.com/mstamy2/PyPDF2

下载完成后解压,进入解压的目录 E:\tools\PyPDF2-master

执行 setup.py 进行安装

python setup.py install

不用pip安装的原因是 pip 下载的只更新到 1.26.0 更新日期是 2016年5月19日,只用这个版本无法提取 jpg 格式图片,会报错

Traceback (most recent call last):
  File "D:/projects/util/pdf_util.py", line 106, in extract_image
    data = xObject[obj].getData()
  File "D:\projects\util\venv\lib\site-packages\PyPDF2\generic.py", line 844, in getData
    decoded._data = filters.decodeStreamData(self)
  File "D:\projects\util\venv\lib\site-packages\PyPDF2\filters.py", line 361, in decodeStreamData
    raise NotImplementedError("unsupported filter %s" % filterType)
NotImplementedError: unsupported filter /DCTDecode

如果已安装 pypdf 建议先卸载 然后安装,卸载的时候最好检查是否卸载完全,即 PyPDF2 文件夹是否仍存在 ,否则可能会报错

ImportError: cannot import name 'paethPredictor'

内容提取代码

图片提取

示例代码在文件夹 PyPDF2-master\Scripts 下的 pdf-image-extractor.py

import time
import PyPDF2
import pdfplumber
from PIL import Image
def extract_image(page):
try:
# 提取第2页图片(从0开始计数)
page_image = pdf_image_reader.getPage(pageNumber=1)
extract_image(page_image)
if '/XObject' in page['/Resources']:
xObject = page['/Resources']['/XObject'].getObject()
for obj in xObject:
if xObject[obj]['/Subtype'] == '/Image':
size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
data = xObject[obj].getData()
if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
mode = "RGB"
else:
mode = "P"
# 保存图片的文件名前缀
img_pre = str(int(time.time()*1000))
if '/Filter' in xObject[obj]:
if xObject[obj]['/Filter'] == '/FlateDecode':
img = Image.frombytes(mode, size, data)
img.save(img_pre + ".png")
elif xObject[obj]['/Filter'] == '/DCTDecode':
img = open(img_pre + ".jpg", "wb")
img.write(data)
img.close()
elif xObject[obj]['/Filter'] == '/JPXDecode':
img = open(img_pre + ".jp2", "wb")
img.write(data)
img.close()
elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
img = open(img_pre + ".tiff", "wb")
img.write(data)
img.close()
else:
img = Image.frombytes(mode, size, data)
img.save(img_pre + ".png")
else:
print("本页无图片")
except:
print("图片提取失败")

文本提取

def extract_content(pdf_path):
# 内容提取,使用 pdfplumber 打开 PDF,用于提取文本
with pdfplumber.open(pdf_path) as pdf_file:
# 使用 PyPDF2 打开 PDF 用于提取图片
pdf_image_reader = PyPDF2.PdfFileReader(open(pdf_path, "rb"))
print(pdf_image_reader.getNumPages())
content = ''
# len(pdf.pages)为PDF文档页数,一页页解析
for i in range(len(pdf_file.pages)):
print("当前第 %s 页" % i)
# pdf.pages[i] 是读取PDF文档第i+1页
page_text = pdf_file.pages[i]
# page.extract_text()函数即读取文本内容
page_content = page_text.extract_text()
if page_content:
content = content + page_content + "\n"
print(page_content)

完整代码

import time
import PyPDF2
import pdfplumber
from PIL import Image
def extract_image(page):
try:
if '/XObject' in page['/Resources']:
xObject = page['/Resources']['/XObject'].getObject()
for obj in xObject:
if xObject[obj]['/Subtype'] == '/Image':
size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
data = xObject[obj].getData()
if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
mode = "RGB"
else:
mode = "P"
# 保存图片的文件名前缀
img_pre = str(int(time.time()*1000))
if '/Filter' in xObject[obj]:
if xObject[obj]['/Filter'] == '/FlateDecode':
img = Image.frombytes(mode, size, data)
img.save(img_pre + ".png")
elif xObject[obj]['/Filter'] == '/DCTDecode':
img = open(img_pre + ".jpg", "wb")
img.write(data)
img.close()
elif xObject[obj]['/Filter'] == '/JPXDecode':
img = open(img_pre + ".jp2", "wb")
img.write(data)
img.close()
elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
img = open(img_pre + ".tiff", "wb")
img.write(data)
img.close()
else:
img = Image.frombytes(mode, size, data)
img.save(img_pre + ".png")
else:
print("本页无图片")
except:
print("图片提取失败")
def extract_content(pdf_path):
# 内容提取,使用 pdfplumber 打开 PDF,用于提取文本
with pdfplumber.open(pdf_path) as pdf_file:
# 使用 PyPDF2 打开 PDF 用于提取图片
pdf_image_reader = PyPDF2.PdfFileReader(open(pdf_path, "rb"))
print(pdf_image_reader.getNumPages())
content = ''
# len(pdf.pages)为PDF文档页数,一页页解析
for i in range(len(pdf_file.pages)):
print("当前第 %s 页" % i)
# pdf.pages[i] 是读取PDF文档第i+1页
page_text = pdf_file.pages[i]
# page.extract_text()函数即读取文本内容
page_content = page_text.extract_text()
if page_content:
content = content + page_content + "\n"
print(page_content)
# 提取图片
page_image = pdf_image_reader.getPage(pageNumber=i)
extract_image(page_image)
if __name__ == '__main__':
pdf_file = "../media/AliDouble11.pdf"
extract_content(pdf_file)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152390.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 抓包工具Charles使用教程

    抓包工具Charles使用教程文章目录一、什么是Charles?二、下载安装:三、http抓包:一、什么是Charles?Charles,因产品Icon为青花瓷造型,俗称青花瓷。主要是用来抓取网络流量包,可以分析产生的网络请求、可以配置代理来抓取手机流量包数据。二、下载安装:1、官方渠道,收费版;2、安装破解版,百度网盘地址:https://pan.baidu.com/s/1_ApnyPqoN5EQ6JvHMjnCTQ三、http抓包:1、开始代理配置:目录:Proxy-ProxySettings2、查看电

  • 群、环、域的概念总结[通俗易懂]

    群、环、域的概念总结[通俗易懂]很容易看懂群简而言之,群的概念可以理解为:一个集合以及定义在这个集合上的二元运算,满足群的四条公理,封闭性、结合性、单位元、反元素。具体理解为:封闭性:在集合上作任意二元运算,不会诞生新的运算,这个集合已经经过充分的完美拓扑。结合性:组合一个二元操作链,之间没有先后运算的区别,这种操作是平坦的(区别交换律)。单位元:具有单位的属性,单位元和任何一个元素操作等于那个元素本身。…

  • 双非本科22届暑期实习,成功拿到B站、阿里实习offer[通俗易懂]

    双非本科22届暑期实习,成功拿到B站、阿里实习offer[通俗易懂]拼一把不一定成功,但是不试试看肯定没有结果!1.前言想写这篇文章很久了,也有粉丝留言、私信问我打卡系列怎么断更了这么多天(狗头保命),首先给大家解释一下最近为什么“失踪了”?由于近两周要入职,找租房,整理微信公众号,所以没多少时间写博客,今天难得闲下来,做一篇近期总结给大家。关于交流群:有粉丝私信,建议创建一个学习群,大家互相分享校招经验,学习心得(我因为怕管理群太麻烦,而一拖再拖,不过也好歹建群了),大家可以通过我的博客首页关注一波公众号:兴趣使然的草帽路飞去获取交流群和内推群群.

  • ESP-Drone开源 Wi-Fi 无人机固件首次编译与错误排查

    ESP-Drone开源 Wi-Fi 无人机固件首次编译与错误排查**ESP-Drone原名ESP-Plane***代码仓库:[esp-drone](https://github.com/espressif/esp-drone)*中文文档:[gettingstarted](https://docs.espressif.com/projects/espressif-esp-drone/zh_CN/latest/index.html)*展示视频:[安装与试飞](https://b23.tv/hnLq8Z)

  • 根号及运算法则_根号下运算法则

    根号及运算法则_根号下运算法则1.根号及运算法则1.根号及运算法则成立条件:a≥0,n≥2且n∈N。成立条件:a≥0,n≥2且n∈N。成立条件:a≥0,b>0,n≥2且n∈N。成立条件:a≥0,b>0,n≥

  • SQL 开发任务超 50% !滴滴实时计算的演进与优化

    SQL 开发任务超 50% !滴滴实时计算的演进与优化摘要:ApacheFlink是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号