Python处理PDF——PyMuPDF中图像的使用(2)

本文记录PyMuPDF库中有关Image的使用方法

关于PyMuPDF库的安装、介绍及基本使用可参考博客:
Python处理PDF——PyMuPDF的安装与使用(1)_ling620的专栏-CSDN博客

1、从文档页面生成图像

这个脚本将获取一个文档文件名,并将每个页面生成一个PNG文件保存在脚本目录中。
文档可以是任何受支持的类型,如PDFXPS等。
该脚本作为命令行工具使用,它希望文件名作为参数提供。生成的图像文件(每页1个)存储在脚本的目录中:

import sys, fitz # import the binding

fname = sys.argv[1] # 从命令行获取文件名
doc = fitz.open(fname) # 打开文件
for page in doc: # iterate through the pages
    pix = page.get_pixmap() # render page to an image
    pix.save("page-%i.png" % page.number) # store image as a PNG

脚本目录现在将包含名为page-0.PNGpage-1.PNG等的PNG图像文件。

当前page.gete_pixmap()使用的是默认参数,得到的信息如下:

  • 图片的页面尺寸将宽度和高度四舍五入为整数,例如,对于A4大小的页面,为595 x 842像素
  • xy维度的分辨率为96 dpi
  • 没有透明度

page.get_pixmap()参数

def get_pixmap(
        self,
        matrix: AnyType = None,
        colorspace: "Colorspace" = None,
        alpha: False,
        clip: rect_like = None,
        annots: (bool)
    ) -> "Pixmap":

参数:

  • matrix:矩阵,可以控制缩放、旋转、镜像等结果
  • colorsapce:颜色空间,cmyk, rgb, gray 忽略大小写,默认是csRGB
  • alpha:是否包含alpha通道,默认不包含
  • clip:只渲染此矩形区域
  • annots:是否同时渲染注释,为False表示不渲染注释

2、提升图像分辨率

文档页面的图像由一个Pixmap表示,创建Pixmap的最简单方法是通过方法page.get_Pixmap()
此方法有许多影响结果的选项。其中最重要的是矩阵,它允许您缩放、旋转、扭曲或镜像结果。

默认情况下,Page.get_pixmap()将使用不起任何作用的标识矩阵。
在下面的例子中,我们对每个维度应用2的缩放因子,这将生成一幅分辨率提高四倍(也是大小的四倍)的图像:

zoom_x = 2.0 # horizontal zoom
zomm_y = 2.0 # vertical zoom
mat = fitz.Matrix(zoom_x, zomm_y) # zoom factor 2 in each dimension
pix = page.get_pixmap(matrix=mat) # use 'mat' instead of the identity matrix

由上面的例子可以看出,通过参数matrix可以实现结果矩阵的缩放。

3、创建部分像素贴图(Clips

该部分应用于当只需要部分页面区域的图像,而不是整个页面的完整图像时。

使用示例:假设我们需要整个页面的右下角1/4处,且将其扩大4倍。
为了实现这一点,我们定义了一个矩形,该矩形等于我们希望在GUI中显示的区域,并将其称为“clip”。在PyMuPDF中构造矩形的一种方法是提供两个对角
在这里插入图片描述

mat = fitz.Matrix(2, 2) # zoom factor 2 in each direction
rect = page.rect # the page rectangle
mp = (rect.tl + rect.br) / 2 # its middle point, becomes top-left of clip
clip = fitz.Rect(mp, rect.br) # 想要的区域
pix = page.get_pixmap(matrix=mat, clip=clip)

上面例子中,rect表示页面的矩形区域,rect.tl表示矩形区域的左上角,rect.br表示矩形区域的右下角。
参数clip使用fitz.Rect()类型表示。

4、PDF文档提取图像

与PDF中的任何其他“object”一样,图像由交叉参考号(xref,整数)标识。如果您知道此号码,则有两种方法可以访问图像数据:

  • 使用pix = fitz.Pixmap(doc, xref)创建一个Pixmap图像
    • 这种方法非常快。pixmap的属性(宽度、高度等)将反应图像的内容。在这种情况下,无法判断嵌入的原始图像具有哪种图像格式。
  • 使用img = doc.extract_image(xref)提取图像
    • 这是一个 包含二进制图像数据img["image"]的字典。还提供了大量元数据,大部分与图片的pixmap中找到的相同
    • 主要区别在于
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值