欢迎光临散文网 会员登陆 & 注册

python处理PDF文件入门

2023-06-11 12:26 作者:dupaper  | 我要投稿

首先安装mupdf的包

打开文件,如果打开不受支持的文件,则PyMuPDF将抛出文件数据错误。

读取一个PDF文件,循环页面,读取内容,写入到一个txt中

get_text(opt*clip=Noneflags=Nonetextpage=Nonesort=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(rectfilename=Nonepixmap=Nonestream=Nonemask=Nonerotate=0alpha=-1oc=0xref=0keep_proportion=Trueoverlay=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(posbufferfilenameufilename=Nonedesc=Noneicon='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(namebufferfilename=Noneufilename=Nonedesc=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(pnotext=Nonefontsize=11width=595height=842fontname='helv'fontfile=Nonecolor=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_passDocument.is_encrypted)。

  • 获得文档的访问权限 ( Document.authenticate())。

  • Document.save()使用或Document.write()和设置 PDF 文件的加密细节

以下代码片段创建一个新的PDF并使用单独的用户和所有者密码对其进行加密。授予打印、复制和注释的权限,但不允许使用用户密码进行身份验证的人进行任何更改。





python处理PDF文件入门的评论 (共 条)

分享到微博请遵守国家法律