Python PyMuPDF实现PDF与图片和PPT相互转换

   2023-02-09 学习力0
核心提示:目录安装与简介MuPDFPyMuPDFPyMuPDF使用元数据页面Page代码示例PDF转图片图片转PDFPDF转PPT文章目录 安装与简介MuPDFPyMuPDF PyMuPDF使用元数据页面Page 代码示例PDF转图片图片转PDFPDF转PPTPyMuPDF提供了PDF及流行图片处理接口。安装与简介安装:pip install

文章目录 安装与简介MuPDFPyMuPDF PyMuPDF使用元数据页面Page 代码示例PDF转图片图片转PDFPDF转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字典。

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

页面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)
原文地址:https://blog.csdn.net/alwaysrun/article/details/127477906
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • SICP:复数的直角和极坐标的表示(Python实现)
    SICP:复数的直角和极坐标的表示(Python实现)
    数据抽象屏障是控制复杂性的强有力工具,然而这种类型的数据抽象还不够强大有力。从一个另一个角度看,对于一个数据对象可能存在多种有用的表示方式,且我们希望所设计的系统能够处理多种表示形式。比如,复数就可以表示为两种几乎等价的形式:直角坐标形式(
    03-16
  • [个人发展] 我做了一个可以永远谈论任何事情的女士对话AI(TypeScript,Python)
    [个人发展] 我做了一个可以永远谈论任何事情的
    在个人发展中对话式人工智能服务 Eveki我做了虚构角色1这是一项以人工智能为特色的服务,可以再现并享受自然对话。这一次,作为第一个艾小姐发表了。请先尝试实物。服务概览与人工智能对话基本上只需输入您的信息是。对话是用女士的语言进行的,就像人类一样
    03-08
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • sf02_选择排序算法Java Python rust 实现
    Java 实现package common;public class SimpleArithmetic {/** * 选择排序 * 输入整形数组:a[n] 【4、5、3、7】 * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i
    02-09
  • Python vs Ruby: 谁是最好的 web 开发语言?
    Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 这两种语言在许多方面有相似之处。它们都是高级的面向对象的编程语言,都是交互式脚本语言、都提供标准库且支持持久化。但是,Python 和 Ruby 的解决方法却
    02-09
  • 详解Python手写数字识别模型的构建与使用
    详解Python手写数字识别模型的构建与使用
    目录一:手写数字模型构建与保存1 加载数据集2 特征数据 标签数据3 训练集 测试集4 数据流图 输入层5 隐藏层6 损失函数7 梯度下降算法8 输出损失值 9 模型 保存与使用10 完整源码分享二:手写数字模型使用与测试一:手写数字模型构建与保存1 加载数据集# 1加
  • Python asyncore socket客户端实现方法详解
    Python asyncore socket客户端实现方法详解
    目录介绍1.定义类并且继承 asyncore.dispatcher2.实现类中的回调代码调用父类方法创建socket对象连接服务器3.创建对象并且执行asyncore.loop进入运行循环服务端示例代码运行结果注意介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的
  • Python+Sklearn实现异常检测
    目录离群检测 与 新奇检测Sklearn 中支持的方法孤立森林 IsolationForestLocal Outlier FactorOneClassSVMElliptic Envelope离群检测 与 新奇检测很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。离群检测(Outlier detectio
  • Python基础教程之while循环用法讲解 Python中的while循环
    Python基础教程之while循环用法讲解 Python中的
    目录1.while 循环2.无限循环3、while 循环使用 else 语句4、简单语句组附小练习:总结1.while 循环Python 中 while 语句的一般形式:while 判断条件(condition):    执行语句(statements)……执行流程图如下:同样需要注意冒号和缩进。另外,在 Python 中
点击排行