python处理PDF文件入门
首先安装mupdf的包
打开文件,如果打开不受支持的文件,则PyMuPDF将抛出文件数据错误。
读取一个PDF文件,循环页面,读取内容,写入到一个txt中
get_text(opt, *, clip=None, flags=None, textpage=None, sort=False)
参数:
opt (str) –表示要求的格式的字符串,是上述格式之一。支持大写和小写混合。
在v1.16.3版本中进行了修改,现在也接受 "words "和 "blocks "的值。
clip (rect-like) – (v1.17.7版新增)将提取的文本限制在这个矩形范围内。如果没有,则提取整个页面的内容。对选项 "html"、"xhtml "和 "xml "没有影响。
flags (int) –(v1.16.2版新增)指标位,用于控制是否包括图像或如何处理文本的空白和连字符。可用的指标见文本提取标志,默认设置见文本提取标志默认值。
textpage – (v1.19.0版新增)使用先前创建的TextPage。这大大减少了执行时间:根据提取选项的不同,可减少50%以上,最高可达95%。如果指定了,"flags "和 "clip "参数将被忽略,因为它们是只属于文本页的属性。如果省略,将创建一个新的、临时的文本页。
sort (bool) – (v1.19.1中的新内容)按垂直坐标、然后是水平坐标对输出进行排序。在许多情况下,这应该足以产生一个 "自然 "的阅读顺序。对(X)HTML和XML没有影响。输出选项 "单词 "按单词的bboxes的(y1, x0)排序。对于 "block"、"dict"、"json"、"rawdict"、"rawjson "也是如此:它们都是按照相应块的bbox的(y1, x0)排序。如果指定为 "text",那么在内部则使用 "blocks"。
返回类型:str, list, dict
返回:页面的内容是一个字符串、一个列表或一个字典。详情请参考相应的TextPage方法。
从PDF中提取图像
page.get_images() 仅限PDF:返回一个由页面引用的图像的列表。是Document.get_page_images()的封装器。
合并PDF文件
将PDF文件与其他类型的文件合并
为PDF添加水印
添加水印本质上就像在每个PDF页面的底部添加图像一样简单。应该确保图像具有所需的不透明度和纵横比,以使其看起来符合您的需要。在上面的示例中,每个文件引用都创建了一个新图像,但为了提高性能(通过节省内存和文件大小),该图像数据应该只被引用一次 - 请参阅代码示例和实现说明Page.insert_image()
。
insert_image(rect, filename=None, pixmap=None, stream=None, mask=None, rotate=0, alpha=-1, oc=0, xref=0, keep_proportion=True, overlay=True)
仅限PDF:在给定的矩形内放置一个图像。该图像可能已经存在于PDF中,或者是从一个像素图、一个文件或一个内存区域中获取。
参数:
rect (rect_like) – 放置图像的地方。必须是有限的并且不是空的。
filename (str) – 图像文件的名称(MuPDF支持的所有格式,见支持的输入图像格式)。
stream (bytes,bytearray,io.BytesIO) –内存中的图像(MuPDF支持的所有格式--见支持的输入图像格式)。在v1.14.13版本中改变了:现在也支持io.BytesIO了。
pixmap (Pixmap) – 一个包含图像的像素图.
mask (bytes,bytearray,io.BytesIO) – (v1.18.1版新增)内存中的图像 - 作为基础图像的图像掩码(alpha值)。当指定时,必须以文件名或流的形式提供基础图像,而且不能是已经有遮罩的图像。.
xref (int) – (v1.18.13版新增)PDF中已经存在的图像的xref。如果给出,参数文件名、Pixmap、stream、alpha和 mask
将被忽略。页面将简单地接收一个对现有图像的引用。
alpha (int) – (在v1.19.3版中改变)已废弃。不再需要--给定时被忽略。.
rotate (int) –(在v1.14.11版本中新增)旋转图像。必须是90度的整数倍。正值的旋转是逆时针旋转。如果你需要任意角度的旋转,可以考虑先将图像转换为PDF(Document.convert_to_pdf()),然后用Page.show_pdf_page()代替。
oc (int) – (v1.18.3版新增)(xref)使图像的可见性依赖于这个OCG或OCMD。在多次插入的第一次之后被忽略。该属性与生成的PDF图像对象一起存储,因此在整个PDF中控制图像的可见性。
keep_proportion (bool) – (v1.14.11版新增)保持图像的长宽比。
返回类型:int
返回:嵌入图像的xref。如果再次插入图像,这可以作为xref参数,获得非常显著的性能提升。
旋转PDF
set_rotation(rotate) 仅限PDF:设置页面的旋转。
参数:
rotate (int) - 一个整数,指定所需的旋转度数。必须是90的整数倍。值将被转换为0、90、180、270中的一个。
裁剪PDF
要将页面裁剪为定义的Rect
set_cropbox(r) 仅限PDF:改变页面的可见部分。
参数:
r (rect_like) - 页面的新可见区域。注意,这必须以未旋转的坐标指定,不是空的,也不是无限的,并且完全包含在Page.mediabox中。
附加文件
要将另一个文件附加到页面(相当于添加了另一个文件的链接),附件的默认图标是“图钉”,但是您可以通过设置参数来更改它icon
add_file_annot(pos, buffer, filename, ufilename=None, desc=None, icon='PushPin')
参数:
pos (point_like) – 包含MuPDF提供的 "PushPin "图标的18x18矩形的左上角点。
buffer (bytes,bytearray,BytesIO) –缓冲区。要存储的数据(实际的文件内容,任何数据,等等)。
filename (str) – 与数据有关的文件名。
ufilename (str) – 文件名的可选PDF单字节码版本。默认为文件名。
desc (str) – 文件的可选描述。默认为文件名。
icon (str) – v1.16.0版新增)选择 "PushPin"(默认)、"Graph"、"Paperclip"、"Tag "中的一个作为附加数据的视觉符号。
返回类型:Annot
返回:创建的注释。笔触颜色黄色=(1,1,0),不支持填充颜色。
嵌入文件
要将文件嵌入文档,与附加文件一样,添加文件时请Document.embfile_add()
注意,第一个参数filename
应包括实际文件扩展名。
embfile_add(name, buffer, filename=None, ufilename=None, desc=None)
仅限PDF:嵌入一个新文件。除名称外,所有的字符串参数都可以是unicode(在以前的版本中,只有ASCII能正确工作)。文件内容将被压缩(如有好处)。
参数:
name (str) – 文件名,不能是已有文件。
buffer (bytes,bytearray,BytesIO) –文件内容,现在也支持io.BytesIO。
filename (str) –可选的文件名。仅限于文档,如果没有,将被设置为名称。
ufilename (str) –可选的unicode文件名。仅限文档,如果没有,将被设置为文件名。
desc (str) – 可选的描述。仅限文档,如果没有,将被设置为名称。
返回类型:int
返回:该方法现在返回插入的文件的XRef。此外,该文件对象现在将自动获得基于当前日期时间的PDF键/CreationDate和/ModDate。
删除页面
要从文档中删除页面
要从文档中删除多个页面
页面索引是从零开始的,因此要删除文档的第 10 页,您可以执行以下操作doc.delete_page(9)
。
同样,将删除第 10 - 15 页(含)。doc.delete_pages(from_page=9, to_page=14)
重新排列页面
复制页面
选择页面
使用PyMuPDF,您可以使用所有选项来复制、移动、删除或重新排列PDF的页面。存在允许您逐页执行此操作的直观方法,例如方法Document.copy_page()
。
或者,您也可以准备一个完整的Python序列形式的新页面布局,其中包含您想要的页码、您想要的顺序以及您想要的每页次数。以下可以说明可以做什么Document.select()
doc.select([1, 1, 1, 5, 4, 9, 9, 9, 0, 2, 2, 2])
现在让我们准备一个双面打印的 PDF(在不直接支持此功能的打印机上):
页数由len(doc)
(等于doc.page_count
)给出。以下列表分别表示偶数页码和奇数页码:
p_even = [p in range(doc.page_count) if p % 2 == 0]
p_odd = [p in range(doc.page_count) if p % 2 == 1]
此代码段创建了相应的子文档,然后可用于打印文档:
以下示例将反转所有页面的顺序
此代码段将 PDF 与自身复制,以便它将包含页面0、1、...、n、0、1、...、n (速度非常快,并且不会显着增加文件大小!):
添加空白页
使用它来创建具有另一种预定义纸张格式的页面:
便利功能paper_size()
知道 40 多种行业标准纸张格式可供选择。将所需的字典键传递给以paper_size()
检索纸张尺寸。支持大小写。如果将“-L”附加到格式名称,则返回横向版本。
paper_size(s)
返回已知纸张格式代码的宽度和高度的便捷函数。对于标准分辨率 72 像素 = 1 英寸,这些值以像素为单位给出。
当前定义的格式包括'A0'到'A10'、'B0'到'B10'、'C0'到'C10'、'Card-4x6'、'Card-5x7'、'Commercial'、'Executive'、'Invoice '、'Ledger'、'Legal'、'Legal-13'、'Letter'、'Monarch'和'Tabloid-Extra',每个都采用纵向或横向格式。
格式名称必须作为字符串提供(区分大小写),可以选择使用“-L”(横向)或“-P”(纵向)作为后缀。没有后缀默认为纵向。
参数:
s ( str ) – 上面的任何格式名称,大写或小写,如“A4”或“letter-l”。
返回类型:元组
返回:纸张格式的(宽度,高度) 。对于未知格式,返回(-1, -1) 。示例:fitz.paper_size(“A4”)返回(595, 842)和fitz.paper_size(“letter-l”)返回(792, 612)。
插入带有文本内容的页面
使用该Document.insert_page()
方法还会插入一个新页面并接受相同的width
参数height
。但它还允许您将任意文本插入新页面并返回插入的行数。
文本参数可以是一个(序列)字符串(假设为 UTF-8 编码)。插入将从点(50, 72)开始,该点位于页面顶部下方一英寸处,距离左侧 50 点。返回插入的文本行数。
insert_page(pno, text=None, fontsize=11, width=595, height=842, fontname='helv', fontfile=None, color=None)
仅限PDF:插入一个新页并插入一些文本。方便的函数,结合了Document.new_page()和Page.insert_text()的部分。
参数:
pno (int) –要插入的页数(基数0)。必须在(-1, doc.page_count + 1)范围内。特殊值-1和doc.page_count在最后一页之后插入。
返回类型:int
返回:Page.insert_text()的结果(成功插入的行数)
拆分单个页面
这涉及将PDF页面分成任意部分。例如,您可能有一个包含Letter格式页面的PDF,您想要以四倍的放大倍数打印:每个页面被分成 4 个部分,每个部分再次以Letter格式进入一个单独的PDF页面。
示例:

合并单个页面
连接PDF页面以形成一个新的PDF,每个页面包含两个或四个原始页面(也称为“2-up”、“4-up”等)。这可用于创建小册子或类似缩略图的概览。
示例:

PDF加密解密
从 1.16.0 版本开始,完全支持PDF解密和加密(使用密码)。您可以执行以下操作:
检查文档是否受密码保护/(仍)加密(
Document.needs_pass
,Document.is_encrypted
)。获得文档的访问权限 (
Document.authenticate()
)。Document.save()
使用或Document.write()
和设置 PDF 文件的加密细节
以下代码片段创建一个新的PDF并使用单独的用户和所有者密码对其进行加密。授予打印、复制和注释的权限,但不允许使用用户密码进行身份验证的人进行任何更改。