[Python]PDF文件与图片转换(PyMuPDF)及转PPT


PyMuPDF提供了PDF及流行图片处理接口。

安装与简介

安装:pip install PyMuPDF

PyMuPDF使用手册参见https://pymupdf.readthedocs.io/en/latest/index.html

MuPDF

MuPDF是一个轻量级的PDF、XPS和电子书查看器。MuPDF由软件库、命令行工具和各种平台的查看器组成:

  • 支持多种文档格式:如PDF、XPS、OpenXPS、CBZ、EPUB和FictionBook 2;
  • 命令行工具可注释、编辑文档,并将文档转换为其他格式:如HTML、SVG、PDF和CBZ。

PyMuPDF

PyMuPDF是MuPDF的Python接口库:

  • 可访问扩展名为“.pdf”、“.xps”、“.oxps”、“.cbz”、“.fb2”或“.epub”的文档;
  • 可像文档样处理流行图像格式:“.png”,“.jpg”,“.bmp”,“.tiff”等

对于所有支持的文档类型可以:

  • 解密文件
  • 访问元信息、链接和书签
  • 以栅格格式(PNG和其他格式)或矢量格式SVG呈现页面
  • 搜索文本
  • 提取文本和图像
  • 转换为其他格式:PDF, (X)HTML, XML, JSON, text
    • 对于PDF文档,存在大量的附加功能,可以:创建、合并或拆分。页面可以通过多种方式插入、删除、重新排列或修改(包括注释和表单字段)。
  • 可以提取或插入图像和字体
  • 完全支持嵌入式文件
  • pdf文件可以重新格式化,以支持双面打印,色调分离,应用标志或水印
  • 完全支持密码保护:解密、加密、加密方法选择、权限级别和用户/所有者密码设置
  • 支持图像、文本和绘图的PDF可选内容概念
  • 可以访问和修改低级PDF结构

PyMuPDF使用

通过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.delete_page()和Document.delete_pages()
  • 复制或移动页面:Document.copy_page()、Document.fullcopy_page()和Document.move_page()
  • 选择页面(只保留选择范围内的页面):Document.select()
  • 插入新页:Document.insert_page()和Document.new_page(),以及Document.insert_pdf()

元数据

Document.metadata是一个具有以下键的Python字典。

KeyValue
producerproducer (producing software)
formatformat: ‘PDF-1.4’, ‘EPUB’, etc.
encryptionencryption method used if any
author作者
modDate最后修改日期
keywords关键字
title标题
creationDate创建日期
creatorcreating application
subjectsubject

页面Page

页面是MuPDF的核心:
• 可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
• 可以提取多种格式的页面文本和图像,并搜索文本字符串。
• 对于PDF文档,可以使用更多的方法向页面添加文本或图像。

从Document中获取页面,页面索引:

  • 第一页为0;
  • 负数表示从末尾倒数:如doc[-1]表示获取最后一页;
# 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可为:
    • “text”:(默认)带换行符的纯文本(无格式、无文字位置详细信息、无图像);
    • “blocks”:生成文本块(段落)的列表;
    • “words”:生成单词列表(不包含空格的字符串);
    • “html”:创建页面的完整视觉版本,包括任何图像;
    • “dict”/“json”:与HTML相同的信息级别,但作为Python字典或JSON字符串。
    • “rawdict”/“rawjson”:“dict”/"json"的超级集合。它还提供诸如XML之类的字符详细信息。
    • “xhtml”:文本信息级别与文本版本相同,但包含图像。
    • “xml”:不包含图像,但包含每个文本字符的完整位置和字体信息,使用XML模块进行解释。
  • page.search_for("txt"):搜索文本

代码示例

PDF转图片

通过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

图片转PDF

把图片插入到新建页中(插入位置使用页面框,即填充整个页面)

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()

PDF转PPT

转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)
### 方法概述 要将 PPTPowerPoint 文件通过 Python 转换为图像格式,可以分为两个主要阶段完成: 1. **将 PPT 转换PDF** 使用工具如 `LibreOffice` 或者 Windows 的 COM 接口调用 Microsoft PowerPoint 实现。 2. **将 PDF 转换为图像** 可以借助第三方库如 `PyMuPDF (fitz)` 完成。 以下是具体实现方法: --- ### 依赖安装 为了运行以下代码,需先安装必要的 Python 库: ```bash pip install python-pptx pywin32 pymupdf libreoffice ``` --- ### 阶段一:PPT PDF #### 使用 LibreOffice 进行转换 如果目标平台支持 LibreOffice,则可以通过命令行接口将其用于文件格式转换。 ```python import subprocess def ppt_to_pdf(input_path, output_path): command = [ "soffice", "--headless", "--convert-to", "pdf", "--outdir", str(output_path.parent), str(input_path) ] try: subprocess.run(command, check=True) print(f"PPT 已成功转换为 {output_path}") except Exception as e: print(f"转换失败: {e}") input_ppt_file = "example.pptx" output_pdf_file = "example.pdf" ppt_to_pdf(input_ppt_file, output_pdf_file) ``` 此部分基于 LibreOffice 提供的功能[^1]。 #### 使用 COM 接口(仅限 Windows) 对于 Windows 用户,可以直接利用 Microsoft Office 的 COM 接口来执行转换操作。 ```python from win32com.client import Dispatch def convert_ppt_to_pdf(ppt_filepath, pdf_filepath): powerpoint = Dispatch("PowerPoint.Application") deck = powerpoint.Presentations.Open(ppt_filepath) try: deck.SaveAs(pdf_filepath, 32) # 32 表示保存为 PDF 格式 print(f"{ppt_filepath} 成功转换为 {pdf_filepath}.") finally: deck.Close() powerpoint.Quit() ppt_input = r"C:\path\to\your\presentation.pptx" pdf_output = r"C:\path\to\save\as\presentation.pdf" convert_ppt_to_pdf(ppt_input, pdf_output) ``` 该方式适用于具有本地安装的 Microsoft PowerPoint 环境下的场景[^2]。 --- ### 阶段二:PDF 图像 一旦获得了 PDF 版本的内容,就可以继续处理并提取其页面作为单独的图像文件。 ```python import fitz # PyMuPDF def pdf_to_images(pdf_path, image_folder="images"): doc = fitz.open(pdf_path) if not os.path.exists(image_folder): os.makedirs(image_folder) for page_num in range(len(doc)): page = doc.load_page(page_num) pix = page.get_pixmap(dpi=300) # 设置分辨率 DPI 值 img_filename = f"{image_folder}/page_{page_num + 1}.png" pix.save(img_filename) print(f"已导出第{page_num + 1}页至 {img_filename}") pdf_to_convert = "example.pdf" target_image_directory = "./converted_pages/" pdf_to_images(pdf_to_convert, target_image_directory) ``` 上述脚本会逐页读取输入 PDF 文档中的数据,并按照指定目录存储对应的 PNG 格式的图片副本。 --- ### 总结说明 整个流程涉及两次独立但紧密相连的操作——首先是文档类型的变;其次是视觉呈现形式的变化。最终结果是一系列静态图形表示原始演示文稿各部分内容的方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
OSZAR »