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())

如上面的图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)。

使用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中脚本的扩展版本。

使用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)

查找所有包含文本的页面

这个用例非常实用,并且工作方式类似于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”一词的搜索结果。

结论

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

python提取pdf中的文字和图片_Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)...相关推荐

  1. java提取word中的文字,java获取word里面的文本

    需求场景 开发的web办公系统如果需要处理大量的Word文档(比如有成千上万个文档),用户一定提出查找包含某些关键字的文档的需求,这就要求能够读取 word 中的文字内容,而忽略其中的文字样式.表格. ...

  2. PDF中的文字怎么复制到Word?教你两个高效转换的方法

    PDF中的文字怎么复制到Word?PDF文件和Word文件都是两种十分常见的办公文件,特别是在一些重要的文件上,我们尝尝会将两种文件格式混合使用.当我们需要编辑的时候,我们会将PDF文件转换成Word ...

  3. Python提取PDF中的文字和图片

    一,使用Python提取PDF中的文字 # 只能处理包含文本的PDF文件 #coding=utf-8 import sys import importlib importlib.reload(sys) ...

  4. Python 获得pdf中的文字、图片文字方法

    Python 获得pdf中的文字.图片文字方法 下载word版文件 OCR,全称Optical character recognition,中文译名叫做光学文字识别.它把图像中的字符,转换为机器编码的 ...

  5. python提取cad中的文字_[python]提取PPT中的文字(包括图片中的文字)

    python是一门很强大的语言,因为有着丰富的第三方库,所以可以说Python是无所不能的. 很多人都知道,Python可以操作Excel,PDF·还有PPT,这篇文章就围绕Python提取PPT中的 ...

  6. python提取ppt文本_提取PPT中的文字(包括图片中的文字)

    python是一门很强大的语言,因为有着丰富的第三方库,所以可以说Python是无所不能的. 很多人都知道,Python可以操作Excel,PDF·还有PPT,这篇文章就围绕Python提取PPT中的 ...

  7. Spring Boot 提取pdf中的文字

    Spring Boot 提取pdf中的文字 提取pdf中的文字,由于字体不同,可能会提取出来乱码.(友情提示:建议先pdf文件转成图片,然后调用百度api提取文字,准确率高.跳转链接:https:// ...

  8. 使用Adobe Acrobat X Pro在PDF中添加文字和图片

    在pdf中添加文字: 使用右侧"工具">"内容">"添加或编辑文本框"来打开"打字机"工具栏.单击pdf中的 ...

  9. C# 获取图片,Pdf中的文字

    识别图片中的文字 首先把下载好的tessdata放在自己项目的bin\Debug\tessdata文件夹中. 附一个tessdata的下载地址:https://github.com/tesseract ...

最新文章

  1. React Native 和ionic2 你选择哪一个?
  2. bigdecimal 小于等于0_图解小于 K 的两数之和
  3. JS原生方法实现jQuery的ready()
  4. 云开发数据库VS传统数据库丨云开发101
  5. 遍历children_589. N叉树的前序遍历
  6. 蓝桥杯第八届省赛JAVA真题----方格分割
  7. 10天确定Python,运行环境(超详细步骤)
  8. 我是如何一步步拿下 Google Offer 的?
  9. Hybrid App的架构
  10. html5制作表单网页
  11. HTML 字体 大小 颜色对照表
  12. JDK正式免费、Log4j2爆核弹级漏洞、LayUI下线,2021的10 件大事
  13. 【Matlab创建word文档,插入图注或表注】
  14. JS 更合理的随机分组
  15. 定义幂函数C语言,【知识点】幂函数定义与性质
  16. 什么是power bi
  17. centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件
  18. 《小学生四则运算出题软件》个人项目总结
  19. maven明明本地仓库有依赖包,还会远程下载的问题
  20. 编译器:GNU工具链GCC编译器的编译方法和编译步骤

热门文章

  1. 基于卷积神经网络和SVM分类器的汽车识别-matlab
  2. BZOJ3670 NOI2014 动物园 题解代码
  3. java毕业设计“小蜜蜂”校园代取快递系统(附源码、数据库)
  4. 关于系统开发(软件工程框架构建)的一点迷思
  5. LoRaWAN模块在车辆跟踪定位中的应用
  6. [B2R]Bob1.0.1
  7. 二进制包(binary file)和源代码文件的区别
  8. 《薄冰实用英语语法详解》独家连载之十九:倒装
  9. 智能家居DIY的又一神器ESPEasy For ioBroker
  10. 火狐浏览器f12不显示firebug开发者模式问题总结