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

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)

更详细的功能,可以参考pymupdf文档

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY4Pvb0p' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片