首页 > 编程语言 >Python处理PDF——PyMuPDF的安装与使用

Python处理PDF——PyMuPDF的安装与使用

时间:2023-10-13 15:14:14浏览次数:60  
标签:Python PyMuPDF 文档 图像 PDF Document page 页面

1、安装

PyMuPDF可以从源码安装,也可以从wheels安装。

对于Windows, LinuxMac OSX平台,在PyPI的下载部分有wheels。这包括Python 64位版本3.6到3.9。Windows版本也有32位版本。从最近开始,Linux ARM架构也出现了一些问题——查找平台标签manylinux2014_aarch64

除了标准库,它没有强制性的外部依赖项。 只有在安装了某些包时,才会有一些不错的方法:

  • Pillow: 当使用Pixmap.pil_save()和 Pixmap.pil_tobytes()时需要
  • fontTools:当使用Document.subset_fonts()时需要
  • pymupdf-fonts 是一个不错的字体选择,可以用于文本输出方法

使用pip安装命令:

pip install PyMuPDF

导入库:

import fitz

关于命名fitz的说明

这个库的标准Python导入语句是import fitz。这是有历史原因的:
MuPDF的原始渲染库被称为Libart

在Artifex软件获得MuPDF项目后,开发的重点转移到编写一种新的现代图形图书馆称为“Fitz”Fitz最初是作为一个研发项目,以取代老化的Ghostscript图形库,但却成为了MuPDF的渲染引擎(引用自维基百科)。

2、使用方法

2.1. 导入库,查看版本
import fitz
print(fitz.__doc__)
PyMuPDF 1.18.16: Python bindings for the MuPDF 1.18.0 library.
Version date: 2021-08-05 00:00:01.
Built for Python 3.8 on linux (64-bit).

2.2. 打开文档

doc = fitz.open(filename)

这将创建Document对象doc。文件名必须是一个已经存在的文件的python字符串。
也可以从内存数据打开文档,或创建新的空PDF。您还可以将文档用作上下文管理器。

3.3. Document的方法和属性

方法/属性描述
Document.page_count 页数 (int)
Document.metadata 元数据 (dict)
Document.get_toc() 获取目录 (list)
Document.load_page() 读取页面

示例:

>>> doc.count_page
1
>>> doc.metadata
{'format': 'PDF 1.7',
 'title': '',
 'author': '',
 'subject': '',
 'keywords': '',
 'creator': '',
 'producer': '福昕阅读器PDF打印机 版本 10.0.130.3456',
 'creationDate': "D:20210810173328+08'00'",
 'modDate': "D:20210810173328+08'00'",
 'trapped': '',
 'encryption': None}

3.4. 获取元数据

PyMuPDF完全支持标准元数据。Document.metadata是一个具有以下键的Python字典。
它适用于所有文档类型,但并非所有条目都始终包含数据。元数据字段为字符串,如果未另行指示,则为无。还要注意的是,并非所有数据都始终包含有意义的数据——即使它们不是一个都没有。

KeyValue
producer producer (producing software)
format format: ‘PDF-1.4’, ‘EPUB’, etc.
encryption encryption method used if any
author author
modDate date of last modification
keywords keywords
title title
creationDate date of creation
creator creating application
subject subject

3.5. 获取目标大纲

toc = doc.get_toc()

3.6. 页面(Page)

页面处理是MuPDF功能的核心。
• 您可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
• 您可以提取多种格式的页面文本和图像,并搜索文本字符串。
• 对于PDF文档,可以使用更多的方法向页面添加文本或图像。

首先,必须创建一个页面Page。这是Document的一种方法:

page = doc.load_page(pno) # loads page number 'pno' of the document (0-based)
page = doc[pno] # the short form

这里可以使用任何整数-inf<pno<page_count。负数从末尾开始倒数,所以doc[-1]是最后一页,就像Python序列一样。

更高级的方法是将文档用作页面的迭代器:

for page in doc:
    # do something with 'page'
    
# ... or read backwards
for page in reversed(doc):
    # do something with 'page'
    
# ... or even use 'slicing'
for page in doc.pages(start, stop, step):
    # do something with 'page'

 


接下来,主要介绍Page的常用操作!

a. 检查页面的链接、批注或表单字段

使用某些查看器软件显示文档时,链接显示为==“热点区域”==。如果您在光标显示手形符号时单击,您通常会被带到该热点区域中编码的标记。以下是如何获取所有链接:

# get all links on a page
links = page.get_links()

links是一个Python字典列表。

还可以作为迭代器使用:

for link in page.links():
    # do something with 'link'

如果处理PDF文档页面,还可能存在注释(Annot)或表单字段(Widget),每个字段都有自己的迭代器:

for annot in page.annots():
    # do something with 'annot'
    
for field in page.widgets():
    # do something with 'field'

b. 呈现页面

此示例创建页面内容的光栅图像:

pix = page.get_pixmap()

pix是一个Pixmap对象,它(在本例中)包含页面的RGB图像,可用于多种用途。

方法Page.get_pixmap()提供了许多用于控制图像的变体:分辨率、颜色空间(例如,生成灰度图像或具有减色方案的图像)、透明度、旋转、镜像、移位、剪切等。

例如:创建RGBA图像(即,包含alpha通道),指定pix=page.get_pixmap(alpha=True)。\

Pixmap包含以下引用的许多方法和属性。其中包括整数宽度、高度(每个像素)和跨距(一个水平图像行的字节数)。属性示例表示表示图像数据的矩形字节区域(Python字节对象)。

还可以使用page.get_svg_image()创建页面的矢量图像。

c. 将页面图像保存到文件中

我们可以简单地将图像存储在PNG文件中:

pix.save("page-%i.png" % page.number)

d. 提取文本和图像

我们还可以以多种不同的形式和细节级别提取页面的所有文本、图像和其他信息:

text = page.get_text(opt)

opt使用以下字符串之一以获取不同的格式:

  • "text":(默认)带换行符的纯文本。无格式、无文字位置详细信息、无图像
  • "blocks":生成文本块(段落)的列表
  • "words":生成单词列表(不包含空格的字符串)
  • "html":创建页面的完整视觉版本,包括任何图像。这可以通过internet浏览器显示
  • "dict"/"json":与HTML相同的信息级别,但作为Python字典或resp.JSON字符串。
  • "rawdict"/"rawjson""dict"/"json"的超级集合。它还提供诸如XML之类的字符详细信息。
  • "xhtml":文本信息级别与文本版本相同,但包含图像。
  • "xml":不包含图像,但包含每个文本字符的完整位置和字体信息。使用XML模块进行解释。

e. 搜索文本

您可以找到某个文本字符串在页面上的确切位置:

areas = page.search_for("mupdf")

这将提供一个矩形列表,每个矩形都包含一个字符串“mupdf”(不区分大小写)。您可以使用此信息来突出显示这些区域(仅限PDF)或创建文档的交叉引用。

3.7. PDF操作

PDF是唯一可以使用PyMuPDF修改的文档类型。其他文件类型是只读的。

但是,您可以将任何文档(包括图像)转换为PDF,然后将所有PyMuPDF功能应用于转换结果,Document.convert_to_pdf()

Document.save()始终将PDF以其当前(可能已修改)状态存储在磁盘上。

通常,您可以选择是保存到新文件,还是仅将修改附加到现有文件(“增量保存”),这通常要快得多。

下面介绍如何操作PDF文档。

a. 修改、创建、重新排列和删除页面

有几种方法可以操作所谓页面树(描述所有页面的结构):

  • PDF:Document.delete_page()Document.delete_pages()删除页面

  • Document.copy_page()Document.fullcopy_page()Document.move_page()将页面复制或移动到同一文档中的其他位置。

  • Document.select()将PDF压缩到选定页面,参数是要保留的页码序列。这些整数都必须在0<=i<page_ count范围内。执行时,此列表中缺少的所有页面都将被删除。剩余的页面将按顺序出现,次数相同(!)正如您所指定的那样。

    因此,您可以轻松地使用创建新的PDF:

    • 第一页或最后10页
    • 仅奇数页或偶数页(用于双面打印)
    • 包含或不包含给定文本的页
    • 颠倒页面顺序

    保存的新文档将包含仍然有效的链接、注释和书签(i.a.w.指向所选页面或某些外部资源)。

  • Document.insert_page()Document.new_page()插入新页面。
    此外,页面本身可以通过一系列方法进行修改(例如页面旋转、注释和链接维护、文本和图像插入)。

b. 连接和拆分PDF文档

方法Document.insert_pdf()在不同的pdf文档之间复制页面。下面是一个简单的joiner示例(doc1和doc2在PDF中打开):

# append complete doc2 to the end of doc1
doc1.insert_pdf(doc2)

下面是一个拆分doc1的片段。它将创建第一页和最后10页的新文档:

doc2 = fitz.open() # new empty PDF
doc2.insert_pdf(doc1, to_page = 9) # first 10 pages
doc2.insert_pdf(doc1, from_page = len(doc1) - 10) # last 10 pages
doc2.save("first-and-last-10.pdf")

c. 保存

Document.save()将始终以当前状态保存文档。

您可以通过指定选项incremental=True将更改写回原始PDF。这个过程(通常)非常快,因为更改会附加到原始文件,而不会完全重写它。

d. 关闭

在程序继续运行时,通常需要“关闭”文档以将底层文件的控制权交给操作系统。

这可以通过Document.close()方法实现。除了关闭基础文件外,还将释放与文档关联的缓冲区。

 

标签:Python,PyMuPDF,文档,图像,PDF,Document,page,页面
From: https://www.cnblogs.com/yoyo1216/p/17762127.html

相关文章

  • Python中的h5py介绍
    Python中的h5py介绍HDF5(HierarchicalDataFormat5)是一种用于存储和组织大量科学数据的文件格式。h5py是Python中的一个库,提供了对HDF5文件的高级封装,使得在Python中处理HDF5文件变得更加简单和高效。本文将介绍h5py的基本概念和使用方法。什么是HDF5文件?HDF5文件是一种用于存储和......
  • MNE-Python中的Epoch
    (图片来自links视频截图,侵删)在MNE-Python中,Epoch是指将原始脑电数据按照一定的时间窗口和事件标记进行切割和分类的过程。即将原始数据切割成若干个时间段(通常称为Epochs或Trials),每个时间段对应一个特定的事件(例如视觉刺激、听觉刺激、按键反应等)。Epoch是脑电数据分析中常用的......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-20-处理鼠标拖拽-下篇
    1.简介上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种类似拼图的验证码如何处理。于是写了这一篇文章,另外也是相对前边做一个简单的总结......
  • word转pdf文档
    word转pdf文档1.依赖其中的aspose-words依赖地址:https://releases.aspose.com/java/repo/com/aspose/<!--word文档转化为pdf文档--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId&g......
  • 铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)
    视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性。该技术在视频补全、对象移除、视频恢复等领域有广泛应用。近年来,两种突出的方案在视频修复中崭露头角:flow-basedpropagation和spatiotemporalTran......
  • python实现ppt内容输出为word形式
    一、只输出文本内容frompptximportPresentationfromdocximportDocumentwordfile=Document()#给定ppt文件所在的路径filepath=r"C:\Users\18703\Desktop\智家经分\智家经分v2.pptx"pptx=Presentation(filepath)#遍历ppt文件的所有幻灯片页forslideinppt......
  • python实现docx转pptx(word文档转幻灯片)
    以前都是手工将word内容复制粘贴到ppt中,实在受够了。文心一言真是大忽悠,给的转换方案是用docx2pptx库,然而根本没有这个库,倒是可以用我下面的代码生成这个库:-)网上很多方案是转成图片形式插入ppt,导致无法正常编辑ppt.于是研究出以下方案:1.先将word文档的页面设置改为自定义大小......
  • python_两两比较计算相似矩阵
    距离矩阵余弦距离矩阵余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异点集内或矩阵内两两元素之间的距离矩阵##简单使用两重循环defcompute_squared_EDM_method(X):#获得矩阵都行和列,因为是行向......
  • Python中的布尔值用途及特点介绍!
    Python中数据类型有很多种,而布尔值就是其中之一,是比较常见的数据类型。Python中bool表示布尔值,布尔值有两个True和Flase,常配合Python的条件语句来使用,一起来看看详细的内容介绍。Python中布尔值是什么?Python中的布尔值是一种基本数据类型,它的取值只有两种True和Flase......
  • python学习笔记3 遍历目录, 列出文件名
    importosdeflistDir(curPath,pixLen):list=[]#print("当前路径:"+curPath)files=os.listdir(curPath)forpathinfiles:fullPath=os.path.join(curPath,path)ifos.path.isfile(fullPath):#append......