使用python解析pdf文件

使用python解析pdf文件使用python解析pdf文件本文主要介绍怎么使用python解析pdf文件pdf文件格式今天,pdf已经是最常用的数据格式。在1990,Adobe公司定义pdf文档的结构。PDF格式背后的理念是,传输的数据/文档对于参与通信过程的双方(创建者、作者或发送者以及接收者)来说看起来完全相同。PDF是PostScript格式的继承者,并被标准化为ISO32000-2:2017。处理PDF文件对于Linux,有强大的命令行工具可用,例如pdftk和pdfgrep。但作为开发人员,基

使用python解析pdf文件

本文主要介绍怎么使用python解析pdf文件

pdf文件格式

今天,pdf已经是最常用的数据格式。在1990, Adobe公司定义pdf文档的结构。PDF 格式背后的理念是,传输的数据/文档对于参与通信过程的双方(创建者、作者或发送者以及接收者)来说看起来完全相同。PDF 是 PostScript 格式的继承者,并被标准化为 ISO 32000-2:2017

处理PDF文件

对于 Linux,有强大的命令行工具可用,例如 pdftkpdfgrep。但作为开发人员,基于 Python库构建自己的 PDF 软件, 并可以免费使用,是一件非常令人兴奋的事情。
本文是一个小系列的开始,将介绍一些有用的 Python 库。 在第一部分中,我们将重点关注已有 PDF 的处理。 将介绍如何读取PDF和提取内容(文本和图像)、旋转单页以及将文档拆分为单独的页面。 第二部分将介绍基于叠加层添加水印。 第三部分将专注于编写/创建 PDF,还将包括删除和重新组合单个页面到新文档中。

工具和库

Python 相关的 PDF 工具、模块和库有点混乱,需要花点时间弄清楚什么是什么,以及哪些项目是持续维护的。根据我们的调研,以下是最新的库:

  • PyPDF2: 一个用于提取文档信息和内容、逐页拆分文档、合并文档、裁剪页面和添加水印的 Python 库。 PyPDF2 支持加密和加密文档。2016年后就没在更新和维护。
  • PDFMiner:这个包完全用 Python 编写,适用于 Python 2.4。对于 Python 3来说,请使用pdfminer.six这两个包都可以解析、分析和转换 PDF 文档。这包括对 PDF 1.7 以及 CJK 语言(中文、日语和韩语)和各种字体类型(Type1、TrueType、Type3 和 CID)的支持。该库目前还在维护和更新。
  • PDFQuery:它将自己描述为“一个快速且友好的 PDF 抓取库”,通过封装 PDFMiner、lxmlpyquery 而实现的。它的设计目标是“用尽可能少的代码从多个 PDF 中可靠地提取数据”。2016年后就没在更新和维护。
  • tabula-py:它是对tabula-java 的简单Python 包装,可以从 PDF 中读取表格并将它们转换为 Pandas 数据格式,还能将 PDF 文件转换为 CSV/TSV/JSON 文件。该库目前还在维护和更新。
  • pdflib for Python:它是对 Poppler 库的扩展。它可以解析、分析和转换 PDF 文档。2019年后就没在更新和维护。
  • PyFPDF: Python下的PDF文档生成库。它从 FPDF PHP 库移植而来,FPDF是一个著名的 PDFlib 替代库,它有许多示例、脚本。2017年后就没在更新和维护。
  • PDFTables:提供从 PDF 文档中提取表格的商业服务.提供 API 以便 PDFTables 可以用作 SAAS。
  • PyX -Python 图形包:PyX 是用于创建 PostScript、PDF 和 SVG 文件的 Python 包。它结合了 PostScript 绘图模型的抽象和 TeX/LaTeX 接口。该库目前还在维护和更新。
  • ReportLab: 一个强大的库,主要专注于 PDF 文档的精确创建。免费提供开源版本以及名为 ReportLab PLUS 的商业增强版。该库目前还在维护和更新。
  • PyMuPDF (又称为 “fitz”)MuPDF 的 Python 绑定,这是一个轻量级的 PDF 和 XPS 查看器。该库可以访问 PDF、XPS、OpenXPS、epub、漫画和小说格式的文件,并以其顶级性能和高渲染质量而闻名。该库目前还在维护和更新。
  • pdfrw:一个纯基于 Python 的 PDF 解析器,用于读写 PDF。一个纯基于 Python 的 PDF 解析器,用于读写 PDF。它真实地再现矢量格式而无需光栅化。与 ReportLab 结合使用,它有助于在使用 ReportLab 创建的新 PDF 中重用现有 PDF 的部分内容。
Library Used for
PyPDF2
PyMuPDF
pdflib
PDFTables
tabula-py
PDFMiner.six
PDFQuery
pdfrw 读,写/创建
Reportlab 写/创建
PyX 写/创建
PyFPDF 写/创建

下面将重点介绍 PyPDF2 和 PyMuPDF,并介绍如何以最简单的方式提取文本和图像。结合官方文档和其他资源提供的大量示例有助于理解 PyPDF2 的用法。相比之下,官方 PyMuPDF 文档要清晰得多,使用该库的速度要快得多。

使用PyPDF2抽取文字

安装PyPDF2

pip install PyPDF2

例子1:抽取文档信息和内容

#!/usr/bin/python
from PyPDF2 import PdfFileReader

pdf_document = "example.pdf"
with open(pdf_document, "rb") as filehandle:
    pdf = PdfFileReader(filehandle)
    # 使用getDocumentInfo获取文档信息
    info = pdf.getDocumentInfo()
    # 使用getNumPages获取文档页数,页面从0开始计数
    pages = pdf.getNumPages()

    print (info)
    print ("number of pages: %i" % pages)

    page1 = pdf.getPage(0)
    print(page1)
    print(page1.extractText())

输出结果如下图所示

请添加图片描述

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

使用PyMuPDF抽取文字

安装PyMuPDF

pip install PyMuPDF

显示文档信息、打印页数和提取 PDF 文档的文本的方式与 PyPDF2 类似(参见例2)。 要导入的模块命名为fitz

例子2:使用PyMuPDF抽取文档信息和内容

#!/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 文档中的原样。

请添加图片描述

使用PyMuPDF 抽取文字是个好的选择!!!

使用PyMuPDF抽取图片

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

例子3:使用PyMuPDF抽取图片

#!/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

用几个pdf测试了下,发现会存一些像素全为0的图像

使用PyPDF2将一个PDF文件分割成多个PDF文件

例子4:使用PyPDF2将一个PDF文件分割成多个PDF文件

#!/usr/bin/python
#!/usr/bin/python

from PyPDF2 import PdfFileReader, PdfFileWriter

pdf_document = "example.pdf"
pdf = PdfFileReader(pdf_document)

for page in range(pdf.getNumPages()):
    pdf = PdfFileReader(pdf_document)
    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)

在写入pdf文件时,如果是中文的pdf,写入会报错Illegal character in Name Object,解决方案可参见如下网址(https://blog.csdn.net/python_go/article/details/111187316),亲测有效!

使用PyMuPDF抽取包含指定内容的页

这个用例非常实用,工作方式类似pdfgrep。使用 PyMuPDF,脚本返回包含给定搜索字符串的所有页码。页面一个接一个地加载,并在 searchFor() 方法的帮助下检测所有出现的搜索字符串。 如果匹配,则会在标准输出上打印相应的消息。

例子5:使用PyMuPDF抽取包含指定内容的页

#!/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))

总结

本文简单介绍如何使用python解析PDF文件,PyMuPDF和PyPDF2是两个常用的python包。

今天的文章使用python解析pdf文件分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27825.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注