Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)

简介: Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)

PDF文件格式


如今,可移植文档格式(PDF)属于最常用的数据格式。在1990年,PDF文档的结构由Adobe定义。PDF格式的思想是,对于通信过程中涉及的双方(创建者,作者或发送者以及接收者)而言,传输的数据/文档看起来完全相同。


工具和库


适用于Python的PDF工具,模块和库的可用解决方案范围有些混乱,需要花一点时间弄清楚什么是什么,以及哪些项目需要连续维护。根据我们的研究,以下是最新的候选人:

  • PyPDF2:一个Python库,用于提取文档信息和内容,逐页拆分文档,合并文档,裁剪页面并添加水印。PyPDF2支持未加密和加密的文档。
  • PDFMiner:完全用Python编写,适用于Python 2.4。对于Python 3,请使用克隆的包PDFMiner.six。这两个软件包都允许您解析,分析和转换PDF文档。这包括对PDF 1.7以及CJK语言(中文,日文和韩文)的支持,以及各种字体类型(Type1,TrueType,Type3和CID)。
  • pdflib for Python:Poppler库的扩展,为它提供了Python绑定。它使您可以解析,分析和转换PDF文档。不要将其与具有相同名称的商业吊坠相混淆。
  • PyFPDF:一个在Python下生成PDF文档的库。从FPDF PHP库移植而来,这是著名的PDFlib扩展替换,其中包含许多示例,脚本和派生类。
  • PDFTables:一项商业服务,提供从PDF文档附带的表格中提取的内容。提供一个API,以便PDFTables可以用作SAAS。
  • PyX -Python图形包:PyX是用于创建PostScript,PDF和SVG文件的Python包。它结合了PostScript绘图模型的抽象和TeX / LaTeX接口。这些基元可以构建复杂的任务,例如以可发布的质量创建2D和3D绘图。
  • ReportLab:一个雄心勃勃的,具有行业实力的图书馆,主要致力于精确创建PDF文档。免费提供开放源代码版本和名为ReportLab PLUS的商业增强版本。
  • PyMuPDF(又称“ fitz”):MuPDF的Python绑定,这是一种轻量级的PDF和XPS查看器。该库可以访问PDF,XPS,OpenXPS,epub,漫画和小说书格式的文件,并且以其最佳性能和高渲染质量而闻名。
  • pdfrw:一个基于Python的纯PDF解析器,用于读写PDF。它忠实地再现矢量格式而无需光栅化。与ReportLab结合使用时,它有助于在使用ReportLab创建的新PDF中重用现有PDF的一部分。



图书馆 用于
PyPDF2
PyMuPDF
pdflib
PDF表格
PDFMiner.six
PDF查询
pdfrw 读,写/创作
PyFPDF 写/创作


我们将重点介绍PyPDF2和PyMuPDF,并说明如何以最简单的方式提取文本和图像。为了了解PyPDF2的用法,官方文档和许多其他资源提供的示例的组合对您有所帮助。相比之下,官方PyMuPDF文档更加清晰,并且使用该库的速度也大大加快。


使用PyPDF2提取文本

$ pip3 install PyPDF2

清单1首先导入了PdfFileReader该类。接下来,使用该类打开文档,并使用getDocumentInfo()方法提取文档信息,使用提取页数getDocumentInfo()以及第一页的内容。

请注意,PyPDF2从0开始计数页面,这就是该调用pdf.getPage(0)检索文档第一页的原因。最终,提取的信息被打印到stdout

清单1:提取文档信息和内容。

#!/usr/bin/python
from PyPDF2 import PdfFileReader
pdf_document = "example.pdf"
with open(pdf_document, "rb") as filehandle:
    pdf = PdfFileReader(filehandle)
    info = pdf.getDocumentInfo()
    pages = pdf.getNumPages()
    print (info)
    print ("number of pages: %i" % pages)
    page1 = pdf.getPage(0)
    print(page1)
    print(page1.extractText())


image.png

如上面的图1所示,提取的文本是连续打印的。没有段落或句子分隔。如PyPDF2文档中所述,所有文本数据都按照在页面内容流中提供的顺序返回,并且依靠它可能会导致一些意外。这主要取决于PDF文档的内部结构,以及PDF编写器过程如何生成PDF指令流。


使用PyMuPDF提取文本


可从PyPi网站上获取PyMuPDF,并在终端中使用以下命令安装软件包:

$ pip3 install PyMuPDF

显示文档信息,打印页数以及提取PDF文档的文本的方式与PyPDF2相似(请参见清单2)。要导入的模块名为fitz,并返回到PyMuPDF的先前名称。

清单2:使用PyMuPDF从PDF文档中提取内容。

#!/usr/bin/python
import fitz
pdf_document = "example.pdf"
doc = fitz.open(pdf_document)
print ("number of pages: %i" % doc.pageCount)
print(doc.metadata)
page1 = doc.loadPage(0)
page1text = page1.getText("text")
print(page1text)


PyMuPDF的优点是可以保持原始文档结构完整-带有换行符的整个段落都保留在PDF文档中(参见图2)。

image.png


使用PyMuPDF从PDF提取图像


PyMuPDF使用该方法简化了从PDF文档提取图像的过程getPageImageList()清单3基于PyMuPDF Wiki页面上的示例,并逐页地将PDF中的所有图像提取并保存为PNG文件。如果图像具有CMYK色彩空间,则将首先将其转换为RGB。

清单3:提取图像

#!/usr/bin/python
import fitz
pdf_document = fitz.open("file.pdf")
for current_page in range(len(pdf_document)):
    for image in pdf_document.getPageImageList(current_page):
        xref = image[0]
        pix = fitz.Pixmap(pdf_document, xref)
        if pix.n < 5:        # this is GRAY or RGB
            pix.writePNG("page%s-%s.png" % (current_page, xref))
        else:                # CMYK: convert to RGB first
            pix1 = fitz.Pixmap(fitz.csRGB, pix)
            pix1.writePNG("page%s-%s.png" % (current_page, xref))
            pix1 = None
        pix = None

在400页PDF上运行此Python脚本,它在不到3秒的时间内提取了117张图像,这真是了不起。单个图像以PNG格式存储。为了保持原始图像的格式和大小,而不是转换为PNG,请查看PyMuPDF Wiki中脚本的扩展版本。


image.png

图3:提取的图像


使用PyPDF2将PDF拆分为页面


对于此示例,首先需要同时导入PdfFileReader和和PdfFileWriter类。然后,我们打开PDF文件,创建一个阅读器对象,并使用阅读器对象的getNumPages方法遍历所有页面。

for循环内部,我们创建的新实例PdfFileWriter,该实例尚不包含任何页面。然后,使用pdfWriter.addPage()方法将当前页面添加到我们的writer对象。此方法接受一个页面对象,我们使用该PdfFileReader.getPage()方法获取该对象。

下一步是创建一个唯一的文件名,我们使用原始文件名加上单词“ page”以及页码来完成。我们在当前页码上加1,因为PyPDF2会计算从零开始的页码。

最后,我们以“写二进制”模式(mode wb)打开新文件名,并使用该类的write()方法pdfWriter将提取的页面保存到磁盘。

清单4:将PDF拆分为单个页面。

#!/usr/bin/python
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_document = "example.pdf"
pdf = PdfFileReader(pdf_document)
for page in range(pdf.getNumPages()):
    pdf_writer = PdfFileWriter()
    current_page = pdf.getPage(page)
    pdf_writer.addPage(current_page)
    outputFilename = "example-page-{}.pdf".format(page + 1)
    with open(outputFilename, "wb") as out:
        pdf_writer.write(out)
        print("created", outputFilename)


image.png

查找所有包含文本的页面


这个用例非常实用,并且工作方式类似于pdfgrep。该脚本使用PyMuPDF返回包含给定搜索字符串的所有页码。页面一页接一页地加载,借助该searchFor()方法,将检测到搜索字符串的所有出现情况。如果匹配则在上面印有相应的信息stdout

清单5:搜索给定的文本。

#!/usr/bin/python
import fitz
filename = "example.pdf"
search_term = "invoice"
pdf_document = fitz.open(filename):
for current_page in range(len(pdf_document)):
    page = pdf_document.loadPage(current_page)
    if page.searchFor(search_term):
        print("%s found on page %i" % (search_term, current_page))

下面的图5显示了一本400页的书中“ Debian GNU / Linux”一词的搜索结果。


image.png

结论


此处显示的处理PDF方法非常强大。使用相对较少的代码行数,很容易获得结果。


目录
相关文章
|
7月前
|
安全 JavaScript 开发者
Python 自动化办公神器|一键转换所有文档为 PDF
本文介绍一个自动化批量将 Word、Excel、PPT、TXT、HTML 及图片转换为 PDF 的 Python 脚本。支持多格式识别、错误处理与日志记录,适用于文档归档、报告整理等场景,大幅提升办公效率。仅限 Windows 平台,需安装 Office 及相关依赖。
375 0
|
6月前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
493 3
|
6月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1640 0
|
7月前
|
程序员 数据安全/隐私保护 Python
1行Python代码,实现PDF的加密、解密
程序员晚枫分享使用python-office库实现PDF批量加密与解密的新方法。只需一行代码,即可完成单个或多个PDF文件的加密、解密操作,支持文件路径与正则筛选,适合自动化办公需求。更新至最新版,适配性更佳,操作更简单。
278 8
1行Python代码,实现PDF的加密、解密
|
8月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
7月前
|
监控 Linux 数据安全/隐私保护
Python实现Word转PDF全攻略:从入门到实战
在数字化办公中,Python实现Word转PDF自动化,可大幅提升处理效率,解决格式兼容问题。本文详解五种主流方案,包括跨平台的docx2pdf、Windows原生的pywin32、服务器部署首选的LibreOffice命令行、企业级的Aspose.Words,以及轻量级的python-docx+pdfkit组合。每种方案均提供核心代码与适用场景,并涵盖中文字体处理、表格优化、批量进度监控等实用技巧,助力高效办公自动化。
1658 0
|
8月前
|
数据采集 存储 监控
Python爬虫实战:批量下载亚马逊商品图片
Python爬虫实战:批量下载亚马逊商品图片
|
8月前
|
前端开发 安全 Java
办公自动化必修课:用Python打造PDF全能处理工具
在职场中,PDF处理常令人崩溃:拆分、合并、加密等问题严重影响效率。本文教你用Python打造一个包含拆分、合并、加密、水印四大功能的PDF工具箱,通过实战代码提升办公自动化水平,让文档操作像拼乐高一样简单高效。
274 0
|
9月前
|
人工智能 开发工具 开发者
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。
422 0
|
6月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
849 102

推荐镜像

更多