亲宝软件园·资讯

展开

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

alwaysrun 人气:0

文章目录 安装与简介MuPDFPyMuPDF PyMuPDF使用元数据页面Page 代码示例PDF转图片图片转PDFPDF转PPT

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

安装与简介

安装:pip install PyMuPDF

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

MuPDF

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

PyMuPDF

PyMuPDF是MuPDF的Python接口库:

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

解密文件

访问元信息、链接和书签

以栅格格式(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.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可为:

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

使用文档:http://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)

加载全部内容

相关教程
猜你喜欢
用户评论