从零开始:使用Python和PymuPDF进行PDF操作

这篇文章介绍了PyMuPDF,一个强大的Python库,用于处理PDF文件,包括其跨平台兼容性、丰富的PDF操作功能(如读写、分割、合并、加密等)、API设计以及示例代码如分割PDF、提取图片和添加水印。
摘要由CSDN通过智能技术生成

PyMuPDF是一个用于处理PDF文件的Python库,它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。

PyMuPDF的主要特点如下:

  • 跨平台兼容性:PyMuPDF支持多种操作系统,如Windows、macOS和Linux,可以在这些平台上运行Python程序。
  • 强大的PDF处理能力:PyMuPDF提供了丰富的功能来操作PDF文件,如读取、写入、分割、合并、旋转、裁剪等。此外,它还支持加密和解密PDF文档,以及提取文本、图像和元数据等信息。
  • 易于使用:PyMuPDF的API设计简洁明了,易于学习和使用。开发者可以通过简单的函数调用来实现各种PDF操作,而无需深入了解底层细节。

安装

pip install pymupdf

分割PDF

把每一页单独保存为一个pdf

def split_per_page(input, output):
    if not os.path.exists(output):
        os.makedirs(output)
    
    doc = fitz.open(input)
    for page in range(doc.page_count):
        dst_doc = fitz.open()
        dst_doc.insert_pdf(doc,from_page=page,to_page=page)
        dst_doc.save(os.path.join(output,f'{page}.pdf'))
        dst_doc.close()
    doc.close()

# 把每一个页面保存为一个pdf,并保存在test文件夹中
split_per_page("test.pdf","test")

把范围内的页面保存为pdf

def split_range_page(input, output, range):
    if not os.path.exists(output):
        os.makedirs(output)
    doc = fitz.open(input)
    start = range[0] - 1
    end = range[1] - 1
    dst_doc = fitz.open()
    dst_doc.insert_pdf(doc, from_page=start, to_page=end)
    dst_doc.save(os.path.join(output,'range_page.pdf'))
    dst_doc.close()
    doc.close()

# 把1-10也保存为pdf,保存在test文件夹中
split_range_page('test.pdf','test', [1,10])

把任意的页面保存为pdf

def split_selected_page(input, output, pages):
    if not os.path.exists(output):
        os.makedirs(output)
    
    doc = fitz.open(input)
    result = map(lambda x: x - 1, pages)
    doc.select(list(result))
    doc.save(os.path.join(output,'selected_pages.pdf'))
    doc.close()
    
# 把第一、三、八页面保存为pdf,并保存在test文件夹中
split_selected_page('test.pdf','test',[1,3, 8])

合并PDF

import fitz

doc_a = fitz.open("a.pdf") # open the 1st document
doc_b = fitz.open("b.pdf") # open the 2nd document

doc_a.insert_pdf(doc_b) # merge the docs
doc_a.save("a+b.pdf") # save the merged document with a new filename

# 把b.pdf合并到a.pdf,保存为a+b.pdf


提取pdf中的所有的图片

import fitz

doc = fitz.open("test.pdf") # open a document

for page_index in range(len(doc)): # iterate over pdf pages
	page = doc[page_index] # get the page
	image_list = page.get_images()

	# print the number of images found on the page
	if image_list:
		print(f"Found {len(image_list)} images on page {page_index}")
	else:
		print("No images found on page", page_index)

	for image_index, img in enumerate(image_list, start=1): # enumerate the image list
		xref = img[0] # get the XREF of the image
		pix = fitz.Pixmap(doc, xref) # create a Pixmap

		if pix.n - pix.alpha > 3: # CMYK: convert to RGB first
			pix = fitz.Pixmap(fitz.csRGB, pix)

		pix.save("page_%s-image_%s.png" % (page_index, image_index)) # save the image as png
		pix = None

把PDF保存为图片

def covert2pic(zoom):
    doc = fitz.open("test.pdf")
    total = doc.page_count
    for pg in range(total):
        page = doc[pg]
        zoom = int(zoom)            #值越大,分辨率越高,文件越清晰
        rotate = int(0)
        
        trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).prerotate(rotate)
        pm = page.get_pixmap(matrix=trans, alpha=False)
      
        lurl='.pdf/%s.jpg' % str(pg+1)
        pm.save(lurl)
    doc.close()

covert2pic(200)

PDF添加图片水印

def add_watermark(input, watermark):
    doc = fitz.open(input)
    for page in doc:
        page.insert_image(page.bound(),filename=watermark, overlay=False)
    doc.save(os.path.join("test","watermark.pdf"))
    doc.close()
    
add_watermark("test.pdf","watermark.png")

PDF加密

PDF加密有两种形式

  • 用户加密,需要输入密码才能打开pdf
  • 拥有者加密,可以防止打印、复制、添加注释、添加删除页面等功能
def encrypt_pdf():
    perm = int(
        fitz.PDF_PERM_ACCESSIBILITY # always use this
                | fitz.PDF_PERM_PRINT # permit printing
                | fitz.PDF_PERM_COPY # permit copying
                | fitz.PDF_PERM_ANNOTATE # permit annotations
    ) # 可以打印,复制,添加注释
    owner_pass = "owner" # owner password
    user_pass = "user" # user password
    encrypt_meth = fitz.PDF_ENCRYPT_AES_256 # strongest algorithm
    doc = fitz.open("test.pdf") # empty pdf
    doc.save("encrypt.pdf",encryption=encrypt_meth,owner_pw=owner_pass,permissions=perm,user_pw=user_pass) # 同时使用
    
# 这两个加密方式可以,单独使用,也可以同时使用

# 单独使用用户加密
doc.save("encrypt.pdf",encryption=encrypt_meth,owner_pw=owner_pass)

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

若有侵权,请联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值