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文档
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END