Python中的PDF处理

Python中的PDF处理

Python被认为是一种极其灵活的编程语言,具有广泛的库,它是一种高级语言,具有易于阅读和编写的语法。Python在机器学习、Web开发、网络安全、应用程序开发等不同领域的应用正在扩展。因此,这门编程语言广泛地被程序员、工程师和开发人员选择。

在接下来的教程中,我们将使用Python编程语言处理PDF文件。

PDFPortable Document Format 的缩写,它是一种文档文件格式,包含文本、表格、图像等内容,通常在我们需要保存不能进一步修改或轻松共享和打印的文件时使用。PDF文件格式是由Adobe于1993年开发的,目的是以独立于软件、应用程序、操作系统和硬件的方式呈现包含格式化文本和图像的文档。

以下教程分为不同的部分,以便我们全面了解使用Python进行PDF处理和处理的相关内容。

那么,让我们开始吧。

一些著名的Python PDF库

Python提供了各种用于操作PDF文件的库。在处理PDF时通常使用的一些著名库包括:

  1. PDFMiner
  2. PyPDF4
  3. PyPDF2
  4. Python-docx
  5. PyMuPDF

还有很多其他的库。

虽然有不同的包用于在Python中执行不同的PDF操作,但在本教程中,我们只讨论一些库的工作,例如 PDFMiner、PyPDF2、PyMuPDF、reportlab 等。

PyPDF2 被认为是广泛选择的用于处理PDF的Python模块之一。该包易于使用并提供各种功能。但是当我们谈论提取文本时, PDFMiner 包更加精确和可靠。

PDFMiner 专门为用户从PDF文件中提取文本而设计。在涉及PDF文件操作时,不同的软件包在不同方面的效率上可能更高效。因此,在本教程中,我们将根据它们的舒适度和可靠性来讨论使用不同库进行PDF文件操作。

使用Python从PDF中提取文本

PDF由各种内容组成,如文本,表格,图像,表单等。这些文件是数据的图形解释。它们提供有关显示或纸张精确位置的信息。但是,它们没有指定句子或段落的逻辑结构,并且在显示大小发生变化时无法自适应。 PDFMiner 包通过评估布局和预测文本和其他内容的位置来为用户完成工作。

PDFMiner 被认为是一个强大的库,用于从PDF文件中提取文本等操作。因此,在接下来的部分中,我们将演示使用 PDFMiner 进行文本提取的用法。

首先,我们需要安装 PDFMiner 包。

安装PDFMiner包

我们可以使用以下命令安装 PDFMiner 包:

语法:

$ pip install pdfminer

一旦安装完成,我们将开始进行主要部分,使用PDFMiner库提取文本。

让我们考虑以下示例,演示如何使用Python的PDFMiner库提取文本。

示例:

from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
O_string = StringIO()
with open('my_file.pdf', 'rb') as input_file:
    my_parser = PDFParser(input_file)
    my_doc = PDFDocument(my_parser)
    rsrcmgr = PDFResourceManager()
    my_device = TextConverter(rsrcmgr, O_string, laparams = LAParams())
    my_interpreter = PDFPageInterpreter(rsrcmgr, my_device)
    for my_page in PDFPage.create_pages(my_doc):
        my_interpreter.process_page(my_page)
print(O_string.getvalue())

输出:

A Simple PDF File 
 This is a small demonstration .pdf file - 
 just for use in the Virtual Mechanics tutorials. More text. And more 
 text. And more text. And more text. And more text. 
 And more text. And more text. And more text. And more text. And more
 text. And more text. Boring, zzzzz. And more text. And more text. And
 more text. And more text. And more text. And more text. And more text.
 And more text. And more text.
 And more text. And more text. And more text. And more text. And more
 text. And more text. And more text. Even more. Continued on page 2 ...
 Simple PDF File 2
 ...continued from page 1. Yet more text. And more text. And more text.
 And more text. And more text. And more text. And more text. And more
 text. Oh, how boring typing this stuff. But not as boring as watching
 paint dry. And more text. And more text. And more text. And more text.
 Boring.  More, a little more text. The end, and just as well.

解释:

在上面的代码片段中,我们从io库导入了StringIO模块并从PDFMiner模块中导入了所需的函数和类。我们创建了一个StringIO对象,并使用with语句打开了目录中的pdf文件。根据PDFMiner文档,PDFPageInterpreter用于处理页面内容,而PDFResourceManager用于存储共享资源,如字体或图像。PDFPage用于对数据进行逐页分析。LAParams加载了字符、文本框、文本行、图像和图表的布局分析。在这些帮助下,TextConverter函数帮助将PDF文档转换为文本。

我们将”my_file.pdf”作为要分析并通过PDFMiner模块执行的PDF文件。我们可以使用process_page函数从PDF文件中提取文本。

最后,print(text)函数将打印出从PDF中提取的文本。因此,通过PDFMiner库可以从PDF文件中提取文本。

使用Python从PDF中提取图片

每当我们想要从PDF中提取图片时,可以使用PyMuPDF。该库使用了一个附加模块fitz,使得从PDF文件中提取图片变得更容易。在直接使用这些模块之前,让我们先安装所需的库。

安装PyMuPDF包

我们可以使用以下命令安装PyMuPDF包:

语法:

$ pip install pymupdf
$ pip install fitz

一旦安装完成,我们将进入主要部分,使用 PyMuPDF 库和 fitz 模块提取文本。

让我们考虑以下示例,演示在Python中提取图像。

示例:

# PyMuPDF
import fitz
import io
from PIL import Image
# path to our input file
my_file = "file2.pdf" 
# Input PDF file
my_pdf = open(my_file)
for page_num in range(len(my_pdf)):
   cur_page = my_pdf[page_num]
   img = cur_page.getImageList()
   for image_num, image in enumerate(cur_page.getImageList()):
       # get the XREF of the image
       xref = image[0]
       # extract the image bytes
       cur_image = my_pdf.extractImage(xref)
       imgBytes = cur_image["image"]
       # get the image extension
       img_ext = cur_image["ext"]
       # load it to PIL
       image = Image.open(io.BytesIO(imgBytes))
       # save it to local disk
       image.save(open(f"page{page_num + 1}_img{image_num}.{img_ext}", "wb"))

输出:

[+] Found a total of 2 images in page 0
[+] Found a total of 2 images in page 1   

说明:

在上面的代码片段中,我们已经导入了所需的模块。然后,我们使用 fitz 模块加载PDF文件。然后,我们逐页找到图像列表。然后,我们将PDF中的图像字节转换为实际图像并将其保存在本地。因此,通过这种方式,我们从PDF文件中提取了图像。

使用Python从PDF中提取表格

与提取图像和文本相比,从PDF文件中提取表格要容易一些。Python提供了一个预定义的库 camelot ,我们可以使用它来提取表格。因此,在我们开始实现代码之前,首先必须安装该库。

安装camelot库

我们可以使用pip安装程序使用以下命令安装 camelot 模块:

语法:

$ pip install camelot

一旦安装完成,让我们开始在Python中从PDF文件中提取表格。

示例:

import camelot
# reading the pdf file
my_tables = camelot.read_pdf("my_table.pdf")
print(my_tables[0].df)

解释:

在以上的代码片段中,我们导入了 camelot 库。然后,我们使用 camelot 库的 read_pdf() 函数从PDF文件中提取表格,并将它们存储在一个变量中作为列表。最后,我们使用表格的索引值和df属性打印出其中一个提取出来的表格。因此,我们成功地从PDF文件中提取了表格。

使用Python从PDF中提取URL

提取URL被认为是Python提供的另一个方便的函数。Python有一个预定义的库叫做 “pdfx” ,通常用于从PDF文件中提取URL。我们可以利用诸如 PDFMiner、PyPDF2 等库来提取文本,并使用正则表达式来找出URL。然而,这个过程很长且繁琐。因此,为了缩短代码的长度,我们将使用 pdfx 库来从PDF文件中提取URL。

安装pdfx库

我们可以使用pip安装程序以下命令来安装 pdfx 库:

语法:

$ pip install pdfx

安装完成后,让我们考虑以下示例,以了解如何从PDF中提取URL。

示例:

import pdfx
# reading the PDF File
my_pdf = pdfx.PDFx("sample-url.pdf")
# get list of URLS
print(my_pdf.get_references_as_dict())

输出:

{'url': ['https://www.javatpoint.com/python-pass', 'https://www.javatpoint.com/python-tutorial', 'https://www.javatpoint.com/python-seaborn-library', 'https://www.javatpoint.com/', 'https://www.javatpoint.com/chatbot-in-python', 'https://www.javatpoint.com/python-if-else']}  

解释:

在上面的代码片段中,我们已经导入了 pdfx 库。然后我们使用 PDFx() 函数从目录中读取PDF文件。我们接着使用 get_references_as_dict() 函数以字典形式提取输入PDF文件中的所有URL。

使用Python将PDF中的页面提取为图像

在本节中,我们将学习如何将PDF文件中的页面提取为图像。为了完成这个任务,我们需要另一个简短而简单的库,即 pdf2image 。当我们想将PDF文件转换为图像时,通常会使用这个库。

让我们从安装这个库开始。

安装pdf2image库

我们可以使用以下命令使用pip安装 pdf2image 库:

语法:

$ pip install pdf2image

一旦安装完成,让我们考虑以下示例以了解 pdf2image 库的工作原理。

示例:

from pdf2image import convert_from_path
my_pages = convert_from_path("my_file.pdf", 120) 
n = 0
# iterating through pages
for page in my_pages:
   n += 1
   page.save(f"output{n}.jpg", "JPEG")

解释:

在上面的代码片段中,我们从 pdf2image 库中导入了 convert_from_path 函数。然后我们使用了导入的函数,提供了一个值为120的参数。这个值被称为DPI或每英寸点数。数值越高,形成的图像越清晰、尺寸越大。我们通过将每页保存为JPEG图像来迭代处理每一页。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程