PDF文件格式

现在,可移植文档格式(PDF)属于最经常使用的数据格式。在1990年,PDF文档的结构由Adobe定义。PDF格式的思想是,对于通讯过程当中涉及的双方(建立者,做者或发送者以及接收者)而言,传输的数据/文档看起来彻底相同。html

工具和库

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

PyPDF2:一个Python库,用于提取文档信息和内容,逐页拆分文档,合并文档,裁剪页面并添加水印。PyPDF2支持未加密和加密的文档。git

PDFMiner:彻底用Python编写,适用于Python 2.4。对于Python 3,请使用克隆的包PDFMiner.six。这两个软件包都容许您解析,分析和转换PDF文档。这包括对PDF 1.7以及CJK语言(中文,日文和韩文)的支持,以及各类字体类型(Type1,TrueType,Type3和CID)。github

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的商业加强版本。this

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读取xps文件_Python操做PDF-文本和图片提取(使用PyPDF2和PyMuPDF)相关推荐

  1. python读取log文件_python文件读写(一)-txt, log, json, csv, xml文件

    1.概述在平时自动化测试工作中,经常会用python对一些文件进行读写操作.其中使用最多的文件格式,就是txt,  log,  json,  csv,  xml,  zip, tar, gz,  ra ...

  2. python读取写入文件_Python读取文件,写入文件,打开文件,删除文件,复制文件

    python读取写入文件 In this tutorial we are going to learn about Python File Operations such as python read ...

  3. python 读取yml文件_python读取yaml配置文件

    什么是yaml 1.yaml [ˈjæməl]: Yet Another Markup Language :另一种标记语言.yaml 是专门用来写配置文件的语言,非常简洁和强大, 2.支持多种语言:p ...

  4. python读取yaml文件_python 怎么读取yaml文件

    yaml简介 1.yaml [ˈjæməl]: Yet Another Markup Language:另一种标记语言.yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件 ...

  5. python 读取大文件_Python读取大文件

    1. 前言 前几天在做日志分析系统,需要处理几十G的文件,我尝试用原来的for line in open(filepath).readlines()处理,但停顿好久也没变化,可见占用不小的内存.在网上 ...

  6. python读取matlab文件_python写文件vs matlab写文件,由另一个s读取

    我在python中打开/关闭文件时遇到了一个奇怪的问题.我正在尝试在python中做同样的事情,就像我在matlab中成功地做的那样,我在通过文本文件与一些软件通信时遇到了一个问题.为什么我不去解决这 ...

  7. python读取手机文件_python 读取 网络 文件

    Python之pandas数据加载.存储 Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 ...

  8. python读取docx文件_Python 实现docx文件的读写操作

    我们在做一些数据统计或分析的时候,有时会接触到Execl 格式或者Word 格式的文件.Execl格式的数据提取和解析,我们在之前的文章分享过一些非常好用的Python第三方库,本文中主要介绍如何使用 ...

  9. python读取写入文件_Python读取和写入文件

    1 从文件中读取数据 1.1 读取整个文件 创建名为test的txt文本文件,添加内容如下所示: 1234567890 2345678901 3456789012 实现代码: with open('t ...

  10. python 读取yml文件_Python 读取 yaml 配置文件 | 文艺数学君

    摘要这一篇介绍 Python 中使用 yaml 的方式加载配置文件,包含关于 pyyaml 的简单使用,读入和写入配置文件. 简介 之前我们介绍过使用 configparser 来读取配置文件(Pyt ...

最新文章

  1. “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象
  2. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件
  3. Linux 从头学 01:CPU 是如何执行一条指令的?
  4. oracle pdb是什么意思,浅谈Oracle数据库12c PDB技术
  5. ubuntu 12.04 LTS安装zimbra
  6. 从新获取jar_hadoop3.0新特性总结
  7. mysql语句错误怎么查找_为什么我的mysql语句一直报错,找不到错误,望各位大佬指点一番...
  8. 19年全国数学建模比赛A题代码(简单的迭代思想)
  9. 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
  10. CAN接口芯片MCP2515的波特率和滤波器设置问题
  11. Axure RPO_ 8 下载安装教程
  12. 京东商城搜索框特效实现
  13. Paraview:Python Calculator Filter
  14. ae渲染文件服务器,在 After Effects 中自动执行渲染和网络渲染
  15. 纸张大小、规格、度量详解
  16. 新能源汽车制造商Captain Technology距离上市又近了一步
  17. 机器学习(八):样本分布不均衡问题的处理
  18. 批量wod转pdf、批量excle转pdf、pdf转excle、word实现方案
  19. 传智健康day04 预约管理-套餐管理
  20. caffe实现多label输入(修改源码版)

热门文章

  1. 2020年中国微特电机行业现状、竞争格局及未来发展趋势分析,我国产量达全球70%,技术与发达国家仍有差距「图」
  2. 单网卡配置内外网同时上网
  3. files函数提取文件名HTML,Excel小技巧之轻松提取文件夹中的文件名
  4. 【百度网盘】电脑版百度网盘二维码无法加载的问题
  5. python椭圆花瓣_python之花瓣美女下载详解
  6. mysql文件后缀名是什么_数据库文件的扩展名是什么?
  7. c语言无法打开源文件stdafx.h,VS2013/2012/2010 下无法打开 源 文件“stdafx.h”的解决方法...
  8. db2 jdbc驱动参数_db2的jdbc驱动安装及例子
  9. 【信息技术】【2014.07】交通监控中的车辆跟踪与速度估计
  10. ipad浏览器安装java_360浏览器苹果平板下载