当前位置: 首页 > article >正文

【python】PyMuPDF操作pdf

PyMuPDF,也被称为fitz(这是其导入时的常用别名),是一个功能强大的Python库,用于处理PDF和其他文档格式。与 PyPDF2相比,PyMuPDF提供了更多的功能和更好的性能,特别是在处理复杂的PDF文件时。

安装PyMuPDF

首先,你需要安装PyMuPDF库。你可以使用pip来安装它:

pip install pymupdf

读取PDF文件

读取PDF文件并打印其页数:

import fitz

# 使用pymupdf读取pdf文件
if __name__ == '__main__':
    # 打开 PDF 文件
    doc = fitz.open('example.pdf')

    print(doc.page_count)

提取文本

从PDF文件中提取文本:

import fitz

# 使用Pymupdf读取pdf文本
if __name__ == '__main__':
    # 打开 PDF 文件
    doc = fitz.open('example1.pdf')

    print(doc.load_page(0).get_text())

拆分PDF文件

将PDF文件拆分为两个文件,一个文件包含奇数页,一个文件包含偶数页:

import fitz

# 使用pymupdf将PDF文件拆分为两个文件,一个文件包含奇数页,一个文件包含偶数页:
if __name__ == '__main__':
    # 创建一个 PDF 写入器对象
    odd_writer = fitz.open()
    even_writer = fitz.open()

    doc = fitz.open('example.pdf')

    for page_num in range(doc.page_count):
        if page_num % 2 == 0:
            odd_writer.insert_pdf(doc, from_page=page_num, to_page=page_num)
        else:
            even_writer.insert_pdf(doc, from_page=page_num, to_page=page_num)

    odd_writer.save('example1.pdf')
    even_writer.save('example2.pdf')

合并PDF文件

你可以将多个PDF文件合并为一个:

import fitz

# 使用PymuPDF合并两个pdf文件
if __name__ == '__main__':
    # 打开要合并的 PDF 文件
    pdf_files = ['example1.pdf', 'example2.pdf']

    # 创建一个新的 PDF 文档对象
    merged_doc = fitz.open()

    # 遍历每个要合并的 PDF 文件
    for pdf_file in pdf_files:
        # 打开当前的 PDF 文件
        temp_doc = fitz.open(pdf_file)
        # 将当前 PDF 文件的所有页面添加到合并后的文档中
        for page_num in range(len(temp_doc)):
            merged_doc.insert_pdf(temp_doc, from_page=page_num, to_page=page_num)
        # 关闭当前的 PDF 文件(不需要保存,因为我们只是读取它)
        temp_doc.close()

    # 保存合并后的 PDF 文件
    merged_doc.save("merged.pdf")

裁剪PDF页面

PyPDF2并不直接支持裁剪页面,但你可以通过提取页面的部分内容并创建一个新的页面来实现这一功能。以下是一个简单的示例,演示如何裁剪页面的上半部分:

import fitz

# 使用pymupdf裁剪PDF页面
if __name__ == '__main__':

    # 打开 PDF 文件
    doc = fitz.open("example.pdf")

    # 选择要裁剪的页面(例如第一页)
    page = doc.load_page(0)

    # 定义裁剪区域(矩形,格式为 [x0, y0, x1, y1])
    # 这里我们裁剪页面的上半部分
    rect = [page.rect.x0, page.rect.y0, page.rect.x1, page.rect.y0 + (page.rect.height / 2)]

    # 裁剪页面(这会改变原始页面)
    page.set_cropbox(rect)
    page.clean_contents()  # 清理页面内容(可选,但推荐)

    # 保存修改后的 PDF 文件
    doc.save("cropped_example.pdf")

加密PDF

import fitz

# 使用PyPDF2加密pdf
if __name__ == '__main__':
    doc = fitz.open("example.pdf")

    # 设置加密参数
    doc.save(
        "encrypted.pdf",
        encryption=fitz.PDF_ENCRYPT_AES_256,  # 加密算法
        user_pw="password123",  # 用户密码(打开密码)
        owner_pw="password123",  # 所有者密码
        permissions=0b1111000000,  # 权限标志
        garbage=3,  # 清理冗余数据
        deflate=True,  # 压缩内容
    )

与pypdf2的比较

PyPDF2:

  • 基础操作:专注于PDF的合并、拆分、页面旋转、加密/解密、添加水印等基础功能。

  • 文本提取:支持简单文本提取,但对复杂布局(如双栏排版、表格)的支持较弱,可能破坏文本顺序。

  • 轻量级:适合轻量级任务,如快速合并多个文档或添加密码保护。

  • 大文件处理:处理大文件(如7000页以上)时速度较慢(需数百秒),内存占用较高。

  • 复杂文档兼容性:对含复杂图形、表单或加密文件的处理可能失败,文本提取易出现乱码。

PyMuPDF:

  • 全能处理:支持PDF的读取、编辑、合并、拆分,同时能提取文本、图像、表格,甚至支持OCR识别和PDF转图像。

  • 高级功能:可解析表格(保留列表结构)、处理注释和表单、生成PDF/A格式文档,以及通过Tesseract集成实现OCR。

  • 多格式支持:兼容PDF、XPS、CBZ等格式,适用场景更广泛。

  • 大文件处理:基于MuPDF引擎,采用优化算法,处理同样文件仅需几秒,支持多线程加速,渲染图像效率更高。

  • 复杂文档兼容性:在处理扫描件、加密文档时表现更稳定,且能保留双栏文本的原始顺序


http://www.kler.cn/a/565971.html

相关文章:

  • DeepSeek-R1 Ollama部署+Cherry Studio,实现本地大模型知识库
  • 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
  • 【重磅发布】AllData数据中台核心功能:湖仓一体化平台
  • 数据结构与算法-图论-最短路和其他的结合
  • OpenAI发布GPT-4.5:功能非常特殊,推理很贵
  • HOW POWERFUL ARE GRAPH NEURAL NETWORKS?(GIN)
  • L2-043 龙龙送外卖(dfs)
  • 《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战
  • HTML+CSS基础知识
  • 本地安装多个JDK版本自由切换【详解 附有图文步骤】
  • springboot使用redis
  • 【现代前端框架中本地图片资源的处理方案】
  • 学Java第二十九天-----继承中的构造方法和this、super关键字
  • PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()
  • 天佐.崆峒印 异常崩溃检测分析
  • 【和鲸社区获奖作品】内容平台数据分析报告
  • 力扣-动态规划-198 打家劫舍
  • Kettle 连接 Oracle 数据库全流程指南
  • 【leetcode hot 100 438】找到字符串中所有字母异位词
  • JavaScript 垃圾回收与内存泄漏:原理与应对策略