Python-pdfplumber读取PDF内容

news2024/9/19 10:52:13

文章目录

  • 前言
  • 一、pdfplumber模块
    • 1.1 pdfplumber的特点
    • 1.2 pdfplumber.PDF类
    • 1.3pdfplumber.Page类
  • 二 pdfplumber的使用
    • 2.1 加载PDF
    • 2.2 pdfplumber.PDF 类
    • 2.3 pdfplumber.Page 类
    • 2.4 读取PDF
    • 2.5 读取PDF文档信息
    • 2.6 查看总页数
    • 2.7 查看总页数读取第一页的宽度,页高等信息
    • 2.8 读取文本
    • 2.9 读取表格
    • 3.1 pdfplumber提取表格数据
    • 示例
      • 读取文字
      • 读取表格

前言

PDF是一种编写文档格式,便于跨操作系统传播文档。Python的开源库 pdfplumber,可以较为方便地获取pdf的各种信息,包含pdf的基本信息(作者、创建时间、修改时间…)及表格、文本、图片等信息,基本可以满足较为简单的格式转换功能。

一、pdfplumber模块

1.1 pdfplumber的特点

  • 1、可以轻松访问有关每个PDF对象的详细信息。
  • 2、可以提取文本和表格的更高级别,可以自定义的方法。
  • 3、支持紧密集成的可视化调试。
  • 4、有通过裁剪框过滤对象等实用功能。

pdfplumber中有两个基础类,PDF和Page。PDF用来处理整个文档,Page用来处理整个页面。

1.2 pdfplumber.PDF类

  • .metadata: 获取pdf基础信息,返回字典
  • pages 一个包含pdfplumber.Page实例的列表,每一个实例代表pdf每一页的信息。

1.3pdfplumber.Page类

pdfplumber核心功能,对PDF的大部分操作都是基于这个类,包括提取文本、表格、尺寸等。

二 pdfplumber的使用

2.1 加载PDF

调用pdfplumber.open(x)加载PDF, 其中x可以有以下几种格式:

a、PDF文件路径。

b、文件对象, 以字节流形式加载。

c、类文件对象, 以字节流形式加载。

读取 PDF代码:pdfplumber.open("路径/文件名.pdf",password="test",laparams={"line_overlap":0.7})
解读:
passworf:加载受密码保护的PDF要传递password关键字参数。
laparams:将布局分析参数设置为pdfminer.six的布局引擎,传递laparams关键字参数。

2.2 pdfplumber.PDF 类

pdfplumber.PDF 类代表一个PDF文件,主要有两个属性。

属性说明
.metadata元数据键值对字典,摘自PDF的“信息”。通常包括“CreationDate"(创建日期)、“ModDate"(修改日期)、Producer"(创建者)等。
.pages包含pdfplumber . Page(页实例)的列表。

2.3 pdfplumber.Page 类

pdfplumber.Page是pdfplumber核心,大部分的操作都是围绕此类进行。

属性
.page_number页码
.width页面宽
.height页面长
.objects/ .chars /.lines /. rects /. curves / . images属性中的每一个都是一个列表,每个列表都是嵌入在页面上的每个此类对象包含一个字典。

2.4 读取PDF

import pdfplumber
import pandas as pd

with pdfplumber.open("ag-energy-round-up-2017-02-24.pdf") as pdf:

2.5 读取PDF文档信息

with pdfplumber.open("ag-energy-round-up-2017-02-24.pdf") as pdf:
    print(pdf.metadata)

结果

{‘Title’: ‘National Ag Energy’, ‘Author’: ‘LGMN, Des Moines, IA’, ‘Keywords’: ‘National Ag Energy ethanol biodiesel bioenergy’, ‘CreationDate’: “D:20170224133144-06’00’”, ‘ModDate’: “D:20170224133144-06’00’”, ‘Producer’: ‘Microsoft® Excel® 2013’, ‘Creator’: ‘Microsoft® Excel® 2013’}

2.6 查看总页数

len(pdf.pages)

2.7 查看总页数读取第一页的宽度,页高等信息

first_page = pdf.pages[0]
# 查看页码
print('页码:', first_page.page_number)
 # 查看页宽
 print('页宽:', first_page.width)
# 查看页高
print('页高:', first_page.height)

2.8 读取文本

with pdfplumber.open("继(吊岩坪)110-2018-05(都吊东线2区).pdf") as pdf:
    # 第一页pdfplumber.Page实例
    first_page = pdf.pages[0]
    text = first_page.extract_text()
    print(text)

2.9 读取表格

import pdfplumber
import pandas as pd

with pdfplumber.open("继(吊岩坪)110-2018-05(都吊东线2区).pdf") as pdf:
    page_third = pdf.pages[0]
    table_1 = page_third.extract_table()
    #table_df = pd.DataFrame(table_1[1:], columns=table_1[0])
    print(table_1)

##三 、示例

3.1 pdfplumber提取表格数据

提取表格数据主要用到extract_tables()和extract_table()两种方法,这两种提取方式各有不同。
extract_tables()方法——输出文档所有表格,返回一个嵌套列表。

with pdfplumber.open(r'继(吊岩坪)110-2018-05(都吊东线2区).pdf') as pdf_info:  # 打开pdf
    page_one = pdf_info.pages[0]
    page_one_table = page_one.extract_tables()  # 获取pdf第一页的所有表格数据
    for row in page_one_table:
        print('第一页的表格数据:', row)

extact_table()方法——不会返回文档的所有表格,仅返回行数最多的表格数据。如存在多个行数相等的表格,则默认输出顶部表格数据。表格的每一行都为一个单独的列表,列表中的元素即为原表格的各个单元格的数据。

示例

# 提取pdf表格数据并保存到excel中
import pdfplumber
from openpyxl import Workbook


class PDF(object):
    def __init__(self, file_path):
        self.pdf_path = file_path
        # 读取pdf
        try:
            self.pdf_info = pdfplumber.open(self.pdf_path)
            print('读取文件完成!')
        except Exception as e:
            print('读取文件失败:', e)

    # 打印pdf的基本信息、返回字典,作者、创建时间、修改时间/总页数
    def get_pdf(self):
        pdf_info = self.pdf_info.metadata
        pdf_page = len(self.pdf_info.pages)
        print('pdf共%s页' % pdf_page)
        print("pdf文件基本信息:\n", pdf_info)
        self.close_pdf()

    # 提取表格数据,并保存到excel中
    def get_table(self):
        wb = Workbook()  # 实例化一个工作簿对象
        ws = wb.active  # 获取第一个sheet
        con = 0
        try:
            # 获取每一页的表格中的文字,返回table、row、cell格式:[[[row1],[row2]]]
            for page in self.pdf_info.pages:
                for table in page.extract_tables():
                    for row in table:
                        # 对每个单元格的字符进行简单清洗处理
                        row_list = [cell.replace('\n', ' ') if cell else '' for cell in row]
                        ws.append(row_list)  # 写入数据
                con += 1
                print('---------------分割线,第%s页---------------' % con)
        except Exception as e:
            print('报错:', e)
        finally:
            wb.save('\\'.join(self.pdf_path.split('\\')[:-1]) + '\pdf_excel.xlsx')
            print('写入完成!')
            self.close_pdf()

    # 关闭文件
    def close_pdf(self):
        self.pdf_info.close()


if __name__ == "__main__":
    file_path = input('请输入pdf文件路径:')
    pdf_info = PDF(file_path)
    pdf_info.get_pdf() # 打印pdf基础信息
    # 提取pdf表格数据并保存到excel中,文件保存到跟pdf同一文件路径下
    pdf_info.get_table()
import pdfplumber
text_path = r"D:\Project\MyData\Study\GUI\6_GUI编程(第三部分)\第十一章GUI图形用户界面编程.pdf"

with pdfplumber.open(text_path) as pdf:
    print(pdf.pages)#获取pdf文档所有的页,类型是dict
    total_pages = len(pdf.pages)
    print("total_pages: ",total_pages)

    page = pdf.pages[0]  #获取第一页
    print(type(page))  #<class 'pdfplumber.page.Page'>
    # print(page.extract_text())  #获取第一页的内容

    #fitz读取pdf全文
    content=""
    for i in range(0,len(pdf.pages)):
        # page=
        content += pdf.pages[i].extract_text()
        # print(page.extract_text())
        # print(page.extract_tables())
    # print(content)

读取文字

import pdfplumber
import pandas as pd

with pdfplumber.open("E:\\600aaa_2.pdf") as pdf:
    page_count = len(pdf.pages)
    print(page_count)  # 得到页数
    for page in pdf.pages:
        print('---------- 第[%d]页 ----------' % page.page_number)
        # 获取当前页面的全部文本信息,包括表格中的文字
        print(page.extract_text())

读取表格

import pdfplumber
import pandas as pd
import re

with pdfplumber.open("E:\\600aaa_1.pdf") as pdf:
    page_count = len(pdf.pages)
    print(page_count)  # 得到页数
    for page in pdf.pages:
        print('---------- 第[%d]页 ----------' % page.page_number)

 

        for pdf_table in page.extract_tables(table_settings={"vertical_strategy": "text",
                                                         "horizontal_strategy": "lines",
                                                        "intersection_tolerance":20}): # 边缘相交合并单元格大小

            # print(pdf_table)
            for row in pdf_table:
                # 去掉回车换行
                print([re.sub('\s+', '', cell) if cell is not None else None for cell in row])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1465575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021 前言简介方法实现Emotion ReasonerResponse Generator实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Improv…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

2.22 Qt day3 多界面跳转+qss登录界面优化+发布软件+对话框

思维导图&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号…

Modern C++ std::variant的实现原理

1. 前言 std::variant是C17标准库引入的一种类型&#xff0c;用于安全地存储和访问多种类型中的一种。它类似于C语言中的联合体&#xff08;union&#xff09;&#xff0c;但功能更为强大。与联合体相比&#xff0c;std::variant具有类型安全性&#xff0c;可以判断当前存储的…

kali xrdp

Kali Linux 使用远程桌面连接——xrdp&xfce_kali xfce桌面-CSDN博客 Ubuntu/Debian/Kali xrdp远程桌面黑屏/空屏/无画面解决办法 - 知乎 (zhihu.com) sudo apt-get install xrdp -y sudo apt-get install xfce4 -ysudo systemctl enable xrdp --now systemctl status xrd…

PowerDesigner:pdm文件与sql文件互相转,数据库类型切换

PowerDesigner 依据sql文件生成pdm file——reverse engineer—— database 依据pdm文件导出sql 选中——database——generate database 切换库类型

利用nginx内部访问特性实现静态资源授权访问

在nginx中&#xff0c;将静态资源设为internal&#xff1b;然后将前端的静态资源地址改为指向后端&#xff0c;在后端的响应头部中写上静态资源地址。 近期客户对我们项目做安全性测评&#xff0c;暴露出一些安全性问题&#xff0c;其中一个是有些静态页面&#xff08;*.html&…

Flink中的双流Join

1. Flink中双流Join介绍 Flink版本Join支持类型Join API1.4innerTable/SQL1.5inner,left,right,fullTable/SQL1.6inner,left,right,fullTable/SQL/DataStream Join大体分为两种&#xff1a;Window Join 和 Interval Join 两种。 Window Join又可以根据Window的类型细分为3种…

nginx服务基础用法(概念、安装、热升级)

目录 一、I/O模型概述 1、I/O概念 1.1 计算机的I/O 1.2 Linux的I/O 2、零拷贝技术 3、同步/异步&#xff08;消息反馈机制&#xff09; 4、阻塞/非阻塞 5、网络I/O模型 5.1 阻塞型 I/O 模型&#xff08;blocking IO&#xff09; 5.2 非阻塞型 I/O 模型 (nonblocking …

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中&#xff0c;使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据&#xff0c;并结合代理IP技术&#xff0c;以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术&#xff0c;通过代理服务器转发请求&a…

Google发布开放的模型Gemma

今天&#xff0c;Google 发布了一系列最新的开放式大型语言模型 —— Gemma&#xff01;Google 正在加强其对开源人工智能的支持&#xff0c;我们也非常有幸能够帮助全力支持这次发布&#xff0c;并与 Hugging Face 生态完美集成。 Gemma 提供两种规模的模型&#xff1a; 7B …

使用向量数据库pinecone构建应用05:人脸相似度查询Facial Similarity Search

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

深入探索Linux:ACL权限、特殊位与隐藏属性的奥秘

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念&#xff0c;但随着时间的推移&#xff0c;这种模型在某些情况下显得…

SQL库操作

1、创建数据库 概念 创建数据库&#xff1a;根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …

springmvc+mybatis+springboot航空飞机订票售票系统_f48cp

互联网发展的越来越快了&#xff0c;在当下社会节点&#xff0c;人们也开始越来越依赖互联网。通过互联网信息和数据&#xff0c;极大地满足用户要求[5]。飞机订票系统使用了B/S模式&#xff0c;并且不需要安装第三方插件&#xff0c;他们甚至能直接在电脑上随机随地实现飞机订…

Go 中的 init 如何用?它的常见应用场景有哪些呢?

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十六篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 Go 中有一个特别的 init() 函数&#xff0c;它主要用于包的初始化。init() 函数在包被引入后会被自动执行。如果在 main 包中&#xff0c;它也…

JavaGuide-SQL在mysql中的执行过程

SQL在mysql中的执行过程 原文连接 SQL在mysql中的执行过程 基础架构概览 我们先总结基本组件 连接器: 身份认证 权限相关的,我们连接的时候会验证查询缓存: 8.0之后移除,执行查询的时候,会先查缓存分析器: 分析你的sql语句,包括词法分析 语法分析优化器: 按照mysql认为最…

LED智能互联办公室照明恒流调光IC芯片无频闪H5114

调光高辉度65536级/高精度3% LED降压型恒流驱动器H5114 产品描述 H5114是一款外围电路简单的多功能平 均电流型LED恒流驱动器&#xff0c;适用于5-90V电压范围的非隔离式大功率恒流LED驱动领域。 芯片采用了平均电流模式控制&#xff0c;输出电流精度在3&#xff05;&#xff…

http相关概念以及apache的功能(最详细讲解!!!!)

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

GEE入门篇|遥感专业术语(实践操作1):搜索及查看图像集合信息

Earth Engine 的搜索栏可用于查找影像和定位重要内容有关 Earth Engine 中数据集的信息&#xff0c;让我们使用位于搜索栏上方的Earth Engine代码&#xff0c;用于查找有关 Landsat 7 集合 2 的信息原始场景。首先&#xff0c;在搜索栏中输入“Landsat 7 collection 2”&#x…