Python提取PDF文本数据

简介

很多文件为了安全都会存成pdf格式,如论文、技术文档、书籍等,而通过程序从pdf文档中提取对应的文本内容比较麻烦。在Python中,用于解析pdf文件的扩展包有很多,常用的有pdfminer3k、PyPDF2、Camelot、pdfplumber等。本文主要介绍如何使用pdfplumber库来解析pdf文件。

pdfplumber最适合提取电脑生成的pdf,而不是扫描出来的pdf。它是在pdfminer和pdfminer.six的基础上设计的。

安装

pip3 install pdfplumber

python3 -m pip install pdfplumber

运行

有如下pep8.pdf文件

pep8

我们可以通过pdfplumber来提取以上pdf文件的文本信息。

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    print(pdf.pages)  # Page对象列表

结果如下

[<Page:1>, <Page:2>, <Page:3>, <Page:4>, <Page:5>, <Page:6>, <Page:7>, <Page:8>, <Page:9>, <Page:10>, <Page:11>, <Page:12>, <Page:13>, <Page:14>, <Page:15>, <Page:16>, <Page:17>]

上面的pdf.pages代表pdf文件中每页(共17页)的对象列表。

我们来提取第一页的文本信息

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    page = pdf.pages[0]
    print(page.extract_text())  # 提取文本

结果如下

Python PEP8 编码规范 中文版
原文链接:http://legacy.python.org/dev/peps/pep-0008/
PEP 8
Title Style Guide for Python Code
Version c451868df657
Last-Modified 2016-06-08 10:43:53 -0400 (Wed, 08 Jun 2016)
Author Guido van Rossum <guido at python.org>, Barry Warsaw
<barry at python.org>, Nick Coghlan <ncoghlan at gmail.co
m>
Status Active
Type Process
Content-Type: text/x-rst
Created 05-Jul-2001
Post-History 05-Jul-2001, 01-Aug-2013
Introduction 介绍
本文提供的Python代码编码规范基于Python主要发行版本的标准库。Python的C语言实现的C代码规范请查看相应的PEP指南[1]。
这篇文档以及PEP 257(文档字符串的规范)改编自Guido原始的《Python Style Guide》一文,同时添加了一些来自Barry的风格指南[2]。
这篇规范指南随着时间的推移而逐渐演变,随着语言本身的变化,过去的约定也被淘汰了。
许多项目有自己的编码规范,在出现规范冲突时,项目自身的规范优先。
A Foolish Consistency is the Hobgoblin of Little
Minds 尽信书,则不如无书
Guido的一条重要的见解是代码阅读比写更加频繁。这里提供的指导原则主要用于提升代码的可读性,使得在大量的Python代码中保持一致。
就像PEP 20提到的,“Readability counts”。
这是一份关于一致性的风格指南。这份风格指南的风格一致性是非常重要的。更重要的是项目的风格一致性。在一个模块或函数的风格一致性
是最重要的。
然而,应该知道什么时候应该不一致,有时候编码规范的建议并不适用。当存在模棱两可的情况时,使用自己的判断。看看其他的示例再决定
哪一种是最好的,不要羞于发问。
特别是不要为了遵守PEP约定而破坏兼容性!
几个很好的理由去忽略特定的规则:
1.  当遵循这份指南之后代码的可读性变差,甚至是遵循PEP规范的人也觉得可读性差。
2.  与周围的代码保持一致(也可能出于历史原因),尽管这也是清理他人混乱(真正的Xtreme Programming风格)的一个机会。
3.  有问题的代码出现在发现编码规范之前,而且也没有充足的理由去修改他们。
4.  当代码需要兼容不支持编码规范建议的老版本Python。
Code lay-out 代码布局
Indentation 缩进
每一级缩进使用4个空格。
续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐[7]。当使用挂行缩进时,
应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。

如果只想提取第一页中的表格信息,则可以用以下方法

import pdfplumber

with pdfplumber.open("pep8.pdf") as pdf:
    page = pdf.pages[0]
    for row in page.extract_table():
        print(row)

结果如下

['PEP', '8']
['Title', 'Style Guide for Python Code']
['Version', 'c451868df657']
['Last-Modified', '2016-06-08 10:43:53 -0400 (Wed, 08 Jun 2016)']
['Author', 'Guido van Rossum <guido at python.org>, Barry Warsaw\n<barry at python.org>, Nick Coghlan <ncoghlan at gmail.co\nm>']
['Status', 'Active']
['Type', 'Process']
['Content-Type:', 'text/x-rst']
['Created', '05-Jul-2001']
['Post-History', '05-Jul-2001, 01-Aug-2013']

extract_table()会返回一个包含表格数据的嵌套列表。

其他常用的提取方法

  • .extract_text() 用来提页面中的文本,将页面的所有字符对象整理为的那个字符串
  • .extract_words() 返回的是所有的单词及其相关信息
  • .extract_tables() 提取页面的所有表格
  • .to_image() 用于可视化调试时,返回PageImage类的一个实例(使用此方法需要安装可视化调试工具ImageMagick

总结

pdfplumber是一个很强大的pdf解析工具包,上面也只是简单的介绍了其中一部分功能,如果想了解更多关于pdfplumber的使用方法,可以去相关的官方文档中查看。

posted @ 2021-08-24 18:34  蓝莓薄荷  阅读(2841)  评论(0编辑  收藏  举报