文章目录
本文记录
PyMuPDF
库中有关Image
的使用方法
关于PyMuPDF
库的安装、介绍及基本使用可参考博客:
Python处理PDF——PyMuPDF的安装与使用(1)_ling620的专栏-CSDN博客
1、从文档页面生成图像
这个脚本将获取一个文档文件名,并将每个页面生成一个PNG文件保存在脚本目录中。
文档可以是任何受支持的类型,如PDF
、XPS
等。
该脚本作为命令行工具使用,它希望文件名作为参数提供。生成的图像文件(每页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.PNG
、page-1.PNG
等的PNG图像文件。
当前page.gete_pixmap()
使用的是默认参数,得到的信息如下:
- 图片的页面尺寸将宽度和高度四舍五入为整数,例如,对于A4大小的页面,为
595 x 842
像素 - 在
x
和y
维度的分辨率为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
中找到的相同 - 主要区别在于
- 这是一个 包含二进制图像数据