安装:pip install PyMuPDF
PyMuPDF使用手册参见https://pymupdf.readthedocs.io/en/latest/index.html
MuPDF是一个轻量级的PDF、XPS和电子书查看器。MuPDF由软件库、命令行工具和各种平台的查看器组成:
PyMuPDF是MuPDF的Python接口库:
对于所有支持的文档类型可以:
通过open可打开文档(Document对象):
import fitz
doc = fitz.open(filename)
# ...
doc.save('file')
doc.close()
Document中发主要方法与属性:
方法/属性 | 描述 |
---|---|
Document.page_count | 页数 (int) |
Document.metadata | 元数据 (dict) |
Document.get_toc() | 获取目录 (list) |
Document.load_page() | 读取页面 |
对于PDF文档,有以下页面操作方法:
Document.metadata是一个具有以下键的Python字典。
Key | Value |
---|---|
producer | producer (producing software) |
format | format: ‘PDF-1.4’, ‘EPUB’, etc. |
encryption | encryption method used if any |
author | 作者 |
modDate | 最后修改日期 |
keywords | 关键字 |
title | 标题 |
creationDate | 创建日期 |
creator | creating application |
subject | subject |
页面是MuPDF的核心:
• 可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
• 可以提取多种格式的页面文本和图像,并搜索文本字符串。
• 对于PDF文档,可以使用更多的方法向页面添加文本或图像。
从Document中获取页面,页面索引:
# pno是页面索引
page = doc.load_page(pno)
# or
page = doc[pno]
页面操作方法:
page.get_links()
:获取页面中的连接(返回字典);page.annots()
:获取注释;page.widgets()
:获取表单;pix = page.get_pixmap()
:获取光栅图像(整个页面作为一个图像);
pix.save('page.jpg')
:保存为图像;page.get_svg_image()
:获取矢量图像;page.get_text(opt)
:获取文本,opt可为:
page.search_for("txt")
:搜索文本通过get_pixmap获取每页PDF为图片,然后保存即可。其中zoom用于控制生成图片的缩放比例。
import fitz
def pdf2image(pdfFile, storePath, zoom=2.0):
doc = fitz.open(pdfFile)
picName = os.path.splitext(os.path.basename(pdfFile))[0]
index = 0
os.makedirs(storePath, exist_ok=True)
images = []
print(f"To convert: {pdfFile}")
for pg in range(doc.page_count):
page = doc[pg]
index += 1
rotate = int(0)
print(f"\tconvert page {index}")
# 每个尺寸的缩放系数(提高生成分辨率)
zoom_x, zoom_y = zoom, zoom
mat = fitz.Matrix(zoom_x, zoom_y)
pm = page.get_pixmap(matrix=mat, alpha=False)
imgName = '{}-{}.jpg'.format(picName, index)
imgFile = os.path.join(storePath, imgName)
pm.save(imgFile)
images.append(imgFile)
doc.close()
return images
把图片插入到新建页中(插入位置使用页面框,即填充整个页面)
def image2pdf(imgDir, pdfFile, width=595, height=842):
doc = fitz.open()
print("To convert image to PDF:")
for img in sorted(glob.glob("{}/*".format(imgDir))):
print(f"\tAdd image {img}")
page = doc.new_page(width=width, height=height)
page.insert_image(page.rect, filename=img) # 将当前页插入文档
doc.save(pdfFile)
print(f"PDF save to {pdfFile}")
doc.close()
转PPT时需要用到pptx库:pip install python-pptx
使用文档:https://python-pptx.readthedocs.io/en/latest/index.html
先把PDF转为图片,然后把每张图片生成一个幻灯片页面(PPT页面大小有width与height控制)
import fitz
import pptx
from pptx.util import Inches
def pdf2pptx(pdfFile, pptFile, imgPath, width=10, height=7.5, zoom=2.0):
images = pdf2image(pdfFile, imgPath, zoom)
ppt = pptx.Presentation()
for i in images:
layout = ppt.slide_layouts[0] # 定义一个PPT页面样式
slide = ppt.slides.add_slide(layout)
slide.shapes.add_picture(
image_file=i,
left=Inches(0),
top=Inches(0),
width=Inches(width),
height=Inches(height)
)
ppt.save(pptFile)
shutil.rmtree(imgPath)