geekdoc-python-zh/docs/pythonlibrary/extracting-pdf-metadata-and...

5.3 KiB
Raw Permalink Blame History

用 Python 提取 PDF 元数据和文本

原文:https://www.blog.pythonlibrary.org/2018/04/10/extracting-pdf-metadata-and-text-with-python/

有很多与 Python 相关的 PDF 包。我最喜欢的一个是 PyPDF2 。您可以使用它来提取元数据、旋转页面、分割或合并 pdf 等。这就像是现有 pdf 的瑞士军刀。在本文中,我们将学习如何使用 PyPDF2 提取 PDF 的基本信息


入门指南

PyPDF2 不是 Python 标准库的一部分,所以您需要自己安装它。这样做的首选方法是使用 pip


pip install pypdf2

现在我们已经安装了 PyPDF2让我们学习如何从 PDF 中获取元数据!


提取元数据

您可以使用 PyPDF2 从任何 PDF 中提取大量有用的数据。例如,您可以了解文档的作者、标题和主题以及有多少页。让我们从位于 https://leanpub.com/reportlab 的 Leanpub 下载这本书的样本来了解一下。我下载的样本名为“reportlab-sample.pdf”。

代码如下:


# get_doc_info.py

from PyPDF2 import PdfFileReader

def get_info(path):
    with open(path, 'rb') as f:
        pdf = PdfFileReader(f)
        info = pdf.getDocumentInfo()
        number_of_pages = pdf.getNumPages()

    print(info)

    author = info.author
    creator = info.creator
    producer = info.producer
    subject = info.subject
    title = info.title

if __name__ == '__main__':
    path = 'reportlab-sample.pdf'
    get_info(path)

这里我们从 PyPDF2 导入 PdfFileReader 类。这个类让我们能够使用各种访问器方法读取 PDF 并从中提取数据。我们做的第一件事是创建我们自己的 get_info 函数,它接受 PDF 文件路径作为唯一的参数。然后,我们以只读二进制模式打开文件。接下来,我们将该文件处理程序传递给 PdfFileReader并创建它的一个实例。

现在我们可以通过使用 getDocumentInfo 方法从 PDF 中提取一些信息。这将返回一个pypdf 2 . pdf . document information的实例,它具有以下有用的属性:

  • 作者
  • 创造者
  • 生产者
  • 科目
  • 标题

如果您打印出 DocumentInformation 对象,您将会看到:


{'/Author': 'Michael Driscoll',
 '/CreationDate': "D:20180331023901-00'00'",
 '/Creator': 'LaTeX with hyperref package',
 '/Producer': 'XeTeX 0.99998',
 '/Title': 'ReportLab - PDF Processing with Python'}

我们还可以通过调用 getNumPages 方法来获得 PDF 中的页数。


从 pdf 中提取文本

PyPDF2 对从 PDF 中提取文本的支持有限。不幸的是,它没有提取图像的内置支持。我在 StackOverflow 上看到过一些使用 PyPDF2 提取图像的菜谱,但是代码示例似乎很随意。

让我们尝试从上一节下载的 PDF 的第一页中提取文本:


# extracting_text.py

from PyPDF2 import PdfFileReader

def text_extractor(path):
    with open(path, 'rb') as f:
        pdf = PdfFileReader(f)

        # get the first page
        page = pdf.getPage(1)
        print(page)
        print('Page type: {}'.format(str(type(page))))

        text = page.extractText()
        print(text)

if __name__ == '__main__':
    path = 'reportlab-sample.pdf'
    text_extractor(path)

您会注意到,这段代码的开始方式与我们之前的示例非常相似。我们仍然需要创建一个 PdfFileReader 的实例。但是这一次,我们使用 getPage 方法抓取页面。PyPDF2 是从零开始的,很像 Python 中的大多数东西,所以当你给它传递一个 1 时,它实际上抓取了第二页。在这种情况下,第一页只是一个图像,所以它不会有任何文本。

有趣的是如果你运行这个例子你会发现它没有返回任何文本。相反我得到的是一系列换行符。不幸的是PyPDF2 对提取文本的支持非常有限。即使它能够提取文本,它也可能不会按照您期望的顺序排列,并且间距也可能不同。

要让这个示例代码工作,您需要尝试在不同的 PDF 上运行它。我在美国国税局的网站上找到了一个:https://www.irs.gov/pub/irs-pdf/fw9.pdf

这是为个体经营者或合同工准备的 W9 表格。它也可以用在其他场合。无论如何,我以w9.pdf的名字下载了它,并把它添加到了 Github 库。如果您使用 PDF 文件而不是示例文件,它会很高兴地从第 2 页中提取一些文本。我不会在这里复制输出,因为它有点长。

您可能会发现 pdfminer 包比 PyPDF2 更适合提取文本。


包扎

PyPDF2 包非常有用。使用它,我们能够从 pdf 中获得一些有用的信息。我可以在 PDF 文件夹中使用 PyPDF并使用元数据提取技术按照创建者名称、主题等对 pdf 进行分类。试试看,看你怎么想!


相关阅读