PyMuPDF 1.24.4 中文文档(三)(1)

简介: PyMuPDF 1.24.4 中文文档(三)


原文:https://pymupdf.readthedocs.io/en/latest/

图像

原文:pymupdf.readthedocs.io/en/latest/recipes-images.html

如何从文档页面创建图像

这个小脚本将获取一个文档文件名并生成每页的 PNG 文件。

文档可以是任何 支持的类型。

脚本作为一个命令行工具运行,需要将文件名作为参数提供。生成的图像文件(每页一个)存储在脚本所在的目录中:

import sys, pymupdf  # import the bindings
fname = sys.argv[1]  # get filename from command line
doc = pymupdf.open(fname)  # open document
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 图像文件。图片的尺寸是其页面的宽度和高度取整,例如 A4 纵向页面的尺寸为 595 x 842 像素。它们的 x 和 y 维度分辨率为 96 dpi,并且没有透明度。您可以更改所有这些内容 - 要了解如何执行此操作,请阅读以下各节。

  • 如何增加图像分辨率

文档页面的图像由一个 Pixmap 表示,创建 Pixmap 的最简单方法是通过方法 Page.get_pixmap()

此方法有许多选项可以影响结果。其中最重要的是 Matrix,它允许您缩放、旋转、扭曲或镜像结果。

Page.get_pixmap() 默认将使用 Identity 矩阵,不起任何作用。

在以下示例中,我们对每个维度应用了 2 倍的缩放因子,这将为我们生成一个四倍更好分辨率的图像(并且大约增加了 4 倍的大小):

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

自从版本 1.19.2 开始,有一种更直接的设置分辨率的方法:可以使用参数 "dpi"(每英寸点数)代替 "matrix"。要创建一个 300 dpi 分辨率的页面图像,请指定 pix = page.get_pixmap(dpi=300)。除了简洁的标记法之外,这种方法的额外优势在于 dpi 值保存在图像文件中,而在使用矩阵标记时不会自动发生这种情况。

  • 如何创建部分图像(剪辑)

并不总是需要或希望获取页面的完整图像。例如,在您将图像显示在 GUI 中并希望填充页面的缩放部分时,就是这种情况。

假设您的 GUI 窗口可以显示完整的文档页面,但现在您希望将页面的右下角四分之一填充到这个区域,从而使用四倍更好的分辨率。

要实现这一点,请定义一个与 GUI 中要显示的区域相等的矩形并称其为“clip”。在 PyMuPDF 中构造矩形的一种方法是提供两个对角相对的角,这就是我们在这里做的。


mat = pymupdf.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 = pymupdf.Rect(mp, rect.br)  # the area we want
pix = page.get_pixmap(matrix=mat, clip=clip) 

在上述过程中,我们通过指定两个对角点构造clip:页面矩形的中点mp和其右下角rect.br

  • 如何将剪辑缩放到 GUI 窗口

请还要阅读前面的部分。这次我们想要计算一个剪辑的缩放因子,使其图像最适合给定的 GUI 窗口。这意味着图像的宽度或高度(或两者)将等于窗口尺寸。对于下面的代码段,您需要提供 GUI 窗口的 WIDTH 和 HEIGHT,以接收页面的剪辑矩形。

# WIDTH: width of the GUI window
# HEIGHT: height of the GUI window
# clip: a subrectangle of the document page
# compare width/height ratios of image and window
if clip.width / clip.height < WIDTH / HEIGHT:
    # clip is narrower: zoom to window HEIGHT
    zoom = HEIGHT / clip.height
else:  # clip is broader: zoom to window WIDTH
    zoom = WIDTH / clip.width
mat = pymupdf.Matrix(zoom, zoom)
pix = page.get_pixmap(matrix=mat, clip=clip) 

对于另一种方式,现在假设你缩放因子,并且需要计算适合的剪辑

在这种情况下,我们有zoom = HEIGHT/clip.height = WIDTH/clip.width,因此我们必须设置clip.height = HEIGHT/zoomclip.width = WIDTH/zoom。选择页面上剪辑的左上点tl来计算正确的像素图:

width = WIDTH / zoom
height = HEIGHT / zoom
clip = pymupdf.Rect(tl, tl.x + width, tl.y + height)
# ensure we still are inside the page
clip &= page.rect
mat = pymupdf.Matrix(zoom, zoom)
pix = pymupdf.Pixmap(matrix=mat, clip=clip) 
  • 如何创建或禁止注释图像

通常,页面的像素图还显示页面的注释。偶尔,这可能不是理想的。

要在渲染页面上禁止注释图像,只需在Page.get_pixmap()中指定annots=False

你也可以单独渲染注释:它们有自己的Annot.get_pixmap()方法。生成的像素图的尺寸与注释矩形相同。

  • 如何提取图像:非 PDF 文档

与前面的部分相比,本节处理从文档中提取包含的图像,以便它们可以作为一个或多个页面的一部分显示。

如果你想要将原始图像重新创建为文件形式或内存区域,基本上有两个选择:

  1. 将文档转换为 PDF,然后使用 PDF-only 提取方法之一。此片段将文档转换为 PDF:
>>> pdfbytes = doc.convert_to_pdf()  # this a bytes object
>>> pdf = pymupdf.open("pdf", pdfbytes)  # open it as a PDF document
>>> # now use 'pdf' like any PDF document 
  1. 使用带有“dict”参数的Page.get_text()。这适用于所有文档类型。它将提取页面上显示的所有文本和图像,格式化为 Python 字典。每个图像将出现在一个图像块中,包含元信息和二进制图像数据。有关字典结构的详细信息,请参阅 TextPage。该方法同样适用于 PDF 文件。这将创建一个显示在页面上所有图像的列表:
>>> d = page.get_text("dict")
>>> blocks = d["blocks"]  # the list of block dictionaries
>>> imgblocks = [b for b in blocks if b["type"] == 1]
>>> pprint(imgblocks[0])
{'bbox': (100.0, 135.8769989013672, 300.0, 364.1230163574219),
 'bpc': 8,
 'colorspace': 3,
 'ext': 'jpeg',
 'height': 501,
 'image': b'\xff\xd8\xff\xe0\x00\x10JFIF\...',  # CAUTION: LARGE!
 'size': 80518,
 'transform': (200.0, 0.0, -0.0, 228.2460174560547, 100.0, 135.8769989013672),
 'type': 1,
 'width': 439,
 'xres': 96,
 'yres': 96} 
  • 如何提取图像:PDF 文档

就像 PDF 中的任何其他“对象”一样,图像由交叉引用号(xref,一个整数)标识。如果你知道这个号码,你有两种方式访问图像的数据:

  1. 使用指令*pix = pymupdf.Pixmap(doc, xref)*创建 Pixmap 图像。此方法非常快(单个数字微秒)。像素图的属性(宽度、高度等)将反映图像的属性。在这种情况下,无法确定嵌入原始图像的格式。
  2. 提取图像使用img = doc.extract_image(xref)。 这是一个包含二进制图像数据的字典,如img[“image”]所示。还提供了许多元数据,大多数与图像的像素图中的内容相同。主要区别在于字符串img[“ext”],它指定图像格式:除了“png”外,还可能出现像“jpeg”、“bmp”、“tiff”等。如果要存储到磁盘,请使用此字符串作为文件扩展名。与*pix  = pymupdf.Pixmap(doc,  xref);pix.tobytes()*语句的组合速度相比,此方法的执行速度应该要快。如果嵌入的图像是 PNG 格式,则Document.extract_image()的速度大致相同(且二进制图像数据相同)。否则,此方法快几千倍,而且图像数据要小得多

问题是:“我怎么知道这些‘xref’图像的编号呢?” 这有两个答案:

  1. “检查页面对象:” 遍历Page.get_images()的项目。它是一个列表的列表,其项目看起来像*[xref,  smask, …]*,包含一个图像的  xref。然后可以使用其中一种以上的方法。对于**有效(未损坏)**的文档,请使用此方法。但请注意,同一图像可能被多个页面引用,因此可能需要提供一个机制以避免多次提取。
  2. “不需要知道:” 遍历文档的所有 xrefs 列表,并对每个执行Document.extract_image()。如果返回的字典为空,则继续 – 此 xref 不是图像。如果 PDF 文件损坏(不可用页面),请使用此方法。请注意,PDF 文件通常包含“伪图像”(“模板掩码”),用于定义其他图像的透明度。您可能希望提供逻辑以排除这些内容的提取。还可以查看下一节。

对于这两种提取方法,都存在可用的通用脚本:

extract-from-pages.py 逐页提取图像:


extract-from-xref.py通过 xref 表提取图像:


  • 如何处理图像蒙版

PDF 中的一些图像附带图像蒙版。在最简单的形式中,蒙版表示为单独存储的 alpha(透明度)字节图像。为了重建具有蒙版的图像的原始图像,必须使用蒙版中的透明度字节对其进行“丰富”。

在 PyMuPDF 中,判断图像是否具有蒙版可以通过以下两种方式之一进行识别:

  1. Document.get_page_images()的一项具有一般格式(xref, smask, ...), 其中xref是图像的xref,如果smask为正,则是蒙版的xref
  2. Document.extract_image()的结果(字典)具有一个键*“smask”*,该键还包含任何蒙版的xref(如果为正)。

如果smask == 0,那么通过xref遇到的图像可以按原样处理。

使用 PyMuPDF 恢复原始图像,必须执行以下所示的过程:


>>> pix1 = pymupdf.Pixmap(doc.extract_image(xref)["image"])    # (1) pixmap of image w/o alpha
>>> mask = pymupdf.Pixmap(doc.extract_image(smask)["image"])   # (2) mask pixmap
>>> pix = pymupdf.Pixmap(pix1, mask)                           # (3) copy of pix1, image mask added 

第一步创建基本图像的位图。第二步对图像蒙版执行相同操作。第三步添加一个 alpha 通道并填充透明度信息。

上面的脚本extract-from-pages.pyextract-from-xref.py也包含此逻辑。

  • 如何制作所有图片(或文件)的一个 PDF

我们在这里展示三个脚本,它们接受一个(图像和其他)文件列表,并将它们全部放入一个 PDF 中。

方法 1: 将图像插入为页面

第一个方法将每个图像转换为具有相同尺寸的 PDF 页面。结果将是一个 PDF,每个图像占一页。它仅适用于支持的图像文件格式:

import os, pymupdf
import PySimpleGUI as psg  # for showing a progress bar
doc = pymupdf.open()  # PDF with the pictures
imgdir = "D:/2012_10_05"  # where the pics are
imglist = os.listdir(imgdir)  # list of them
imgcount = len(imglist)  # pic count
for i, f in enumerate(imglist):
    img = pymupdf.open(os.path.join(imgdir, f))  # open pic as document
    rect = img[0].rect  # pic dimension
    pdfbytes = img.convert_to_pdf()  # make a PDF stream
    img.close()  # no longer needed
    imgPDF = pymupdf.open("pdf", pdfbytes)  # open stream as PDF
    page = doc.new_page(width = rect.width,  # new page with ...
                       height = rect.height)  # pic dimension
    page.show_pdf_page(rect, imgPDF, 0)  # image fills the page
    psg.EasyProgressMeter("Import Images",  # show our progress
        i+1, imgcount)
doc.save("all-my-pics.pdf") 

这将生成一个 PDF,大小仅比合并的图片总大小略大。一些性能数据:

上述脚本在我的机器上对 149 张总大小为 514 MB 的图片需要大约 1 分钟时间(生成的 PDF 大小大致相同)。


查看这里获取更完整的源代码:它提供了一个目录选择对话框,并跳过不支持的文件和非文件条目。

注意

我们本可以使用Page.insert_image()而不是Page.show_pdf_page()来创建一个外观类似的文件。然而,根据图像类型的不同,可能会存储未压缩的图像。因此,必须使用保存选项deflate = True以获得合理的文件大小,这会大大增加处理大量图像的运行时间。因此,在此不推荐使用这种替代方法。

方法 2:嵌入文件

第二个脚本嵌入任意文件 - 不仅仅是图片。由于技术原因,生成的 PDF 将只有一页(空白页)。要稍后再次访问嵌入的文件,您需要一个能够显示和/或提取嵌入文件的合适 PDF 查看器:

import os, pymupdf
import PySimpleGUI as psg  # for showing progress bar
doc = pymupdf.open()  # PDF with the pictures
imgdir = "D:/2012_10_05"  # where my files are
imglist = os.listdir(imgdir)  # list of pictures
imgcount = len(imglist)  # pic count
imglist.sort()  # nicely sort them
for i, f in enumerate(imglist):
    img = open(os.path.join(imgdir,f), "rb").read()  # make pic stream
    doc.embfile_add(img, f, filename=f,  # and embed it
                        ufilename=f, desc=f)
    psg.EasyProgressMeter("Embedding Files",  # show our progress
        i+1, imgcount)
page = doc.new_page()  # at least 1 page is needed
doc.save("all-my-pics-embedded.pdf") 


这绝对是最快的方法,同时也能生成最小可能的输出文件大小。上述图片在我的设备上花了 20 秒,并生成了一个大小为 510 MB 的 PDF 文件。查看这里获取更完整的源代码:它提供了一个目录选择对话框,并跳过非文件条目。

方法 3:附加文件

第三种完成此任务的方法是通过页面注释附加文件,请参见此处获取完整的源代码。

这与前一个脚本具有类似的性能,并且还会产生类似的文件大小。它将为每个附加文件生成显示“文件附件”图标的 PDF 页面。


注意

嵌入附加方法都可以用于任意文件 - 不只是图片。

注意

我们强烈推荐使用令人惊叹的包PySimpleGUI来显示任务可能运行时间较长的进度条。它纯粹使用 Python,使用 Tkinter(无需额外的 GUI 包),并且只需要增加一行代码!

  • 如何创建矢量图像

创建文档页面图像的常规方法是Page.get_pixmap()。像素图表示栅格图像,因此您必须在创建时决定其质量(即分辨率)。以后不能更改。

PyMuPDF 还提供了一种方法来创建页面的矢量图像,以 SVG 格式(可伸缩矢量图形,以 XML 语法定义)。SVG 图像在缩放级别上保持精确(当然,其中嵌入的任何栅格图形元素除外)。

指令 svg = page.get_svg_image(matrix=pymupdf.Identity) 提供了一个 UTF-8 字符串 svg,可以使用扩展名“.svg”存储。

  • 如何转换图像

作为一个特性,PyMuPDF 的图像转换很简单。在许多情况下,可以避免使用其他图形包如 PIL/Pillow。

尽管与 Pillow 的交互几乎是微不足道的。

输入格式 输出格式 描述
BMP . Windows 位图
JPEG JPEG 联合图像专家组
JXR . JPEG 扩展范围
JPX/JP2 . JPEG 2000
GIF . 图形互换格式
TIFF . 标记图像文件格式
PNG PNG 便携网络图形
PNM PNM 便携任意映射
PGM PGM 便携灰度图
PBM PBM 便携位图
PPM PPM 便携像素图
PAM PAM 便携任意映射
. PSD Adobe Photoshop 文档
. PS Adobe Postscript

一般方案仅为以下两行:

pix = pymupdf.Pixmap("input.xxx")  # any supported input format
pix.save("output.yyy")  # any supported output format 

备注

  1. pymupdf.Pixmap(arg)input 参数可以是包含图像的文件或 bytes / io.BytesIO 对象。
  2. 不仅仅可以创建输出 文件,还可以通过 pix.tobytes(“yyy”) 创建一个 bytes 对象并传递它。
  3. 当然,输入和输出格式在颜色空间和透明度方面必须兼容。如果需要调整,Pixmap 类已经内置了电池。

注意

将 JPEG 转换为 Photoshop

pix = pymupdf.Pixmap("myfamily.jpg")
pix.save("myfamily.psd") 

注意

JPEG 转换为 Tkinter 的 PhotoImage。任何 RGB / 无 alpha 图像效果相同。将其转换为一个 便携任意映射 格式(如 PPM、PGM 等)即可,因为所有的 Tkinter 版本都支持它们:

import tkinter as tk
pix = pymupdf.Pixmap("input.jpg")  # or any RGB / no-alpha image
tkimg = tk.PhotoImage(data=pix.tobytes("ppm")) 

注意

带 alpha 通道的 PNG 转换为 Tkinter 的 PhotoImage,这需要在进行 PPM 转换之前 移除 alpha 字节

import tkinter as tk
pix = pymupdf.Pixmap("input.png")  # may have an alpha channel
if pix.alpha:  # we have an alpha channel!
    pix = pymupdf.Pixmap(pix, 0)  # remove it
tkimg = tk.PhotoImage(data=pix.tobytes("ppm")) 
  • 如何使用 Pixmaps: 粘贴图像

这显示了如何仅用于图形、非文档目的的 pixmap。脚本读取一个图像文件并创建一个新图像,该图像由原始图像的 3 * 4 个瓦片组成:

import pymupdf
src = pymupdf.Pixmap("img-7edges.png")      # create pixmap from a picture
col = 3                                  # tiles per row
lin = 4                                  # tiles per column
tar_w = src.width * col                  # width of target
tar_h = src.height * lin                 # height of target
# create target pixmap
tar_pix = pymupdf.Pixmap(src.colorspace, (0, 0, tar_w, tar_h), src.alpha)
# now fill target with the tiles
for i in range(col):
    for j in range(lin):
        src.set_origin(src.width * i, src.height * j)
        tar_pix.copy(src, src.irect) # copy input to new loc
tar_pix.save("tar.png") 

这是输入图片:


这是输出:


  • 如何使用 Pixmaps: 制作分形

这是另一个 Pixmap 的示例,创建了 谢尔宾斯基地毯 —— 一种将 康托集 广义化到二维的分形。给定一个正方形地毯,标记其 9 个子方块(3 * 3),并切掉中心的一个。以相同方式处理每个剩余的八个子方块,并继续 ad infinitum。最终结果是一个面积为零且分形维度为 1.8928… 的集合。

此脚本以 PNG 的形式创建其近似图像,通过一像素粒度下降。要增加图像精度,改变 n 的值(精度):

import pymupdf, time
if not list(map(int, pymupdf.VersionBind.split("."))) >= [1, 14, 8]:
    raise SystemExit("need PyMuPDF v1.14.8 for this script")
n = 6                             # depth (precision)
d = 3**n                          # edge length
t0 = time.perf_counter()
ir = (0, 0, d, d)                 # the pixmap rectangle
pm = pymupdf.Pixmap(pymupdf.csRGB, ir, False)
pm.set_rect(pm.irect, (255,255,0)) # fill it with some background color
color = (0, 0, 255)               # color to fill the punch holes
# alternatively, define a 'fill' pixmap for the punch holes
# this could be anything, e.g. some photo image ...
fill = pymupdf.Pixmap(pymupdf.csRGB, ir, False) # same size as 'pm'
fill.set_rect(fill.irect, (0, 255, 255))   # put some color in
def punch(x, y, step):
  """Recursively "punch a hole" in the central square of a pixmap.
 Arguments are top-left coords and the step width.
 Some alternative punching methods are commented out.
 """
    s = step // 3                 # the new step
    # iterate through the 9 sub-squares
    # the central one will be filled with the color
    for i in range(3):
        for j in range(3):
            if i != j or i != 1:  # this is not the central cube
                if s >= 3:        # recursing needed?
                    punch(x+i*s, y+j*s, s)       # recurse
            else:                 # punching alternatives are:
                pm.set_rect((x+s, y+s, x+2*s, y+2*s), color)     # fill with a color
                #pm.copy(fill, (x+s, y+s, x+2*s, y+2*s))  # copy from fill
                #pm.invert_irect((x+s, y+s, x+2*s, y+2*s))       # invert colors
    return
#==============================================================================
# main program
#==============================================================================
# now start punching holes into the pixmap
punch(0, 0, d)
t1 = time.perf_counter()
pm.save("sierpinski-punch.png")
t2 = time.perf_counter()
print ("%g sec to create / fill the pixmap" % round(t1-t0,3))
print ("%g sec to save the image" % round(t2-t1,3)) 

结果应该看起来像这样:


  • 如何与 NumPy 接口

这显示了如何从 NumPy 数组创建 PNG 文件(比大多数其他方法快几倍):

import numpy as np
import pymupdf
#==============================================================================
# create a fun-colored width * height PNG with pymupdf and numpy
#==============================================================================
height = 150
width  = 100
bild = np.ndarray((height, width, 3), dtype=np.uint8)
for i in range(height):
    for j in range(width):
        # one pixel (some fun coloring)
        bild[i, j] = [(i+j)%256, i%256, j%256]
samples = bytearray(bild.tostring())    # get plain pixel data from numpy array
pix = pymupdf.Pixmap(pymupdf.csRGB, width, height, samples, alpha=False)
pix.save("test.png") 
  • 如何向 PDF 页面添加图像

向 PDF 页面添加图像有两种方法:Page.insert_image()Page.show_pdf_page()。这两种方法有共同之处,但也有不同之处。

标准 Page.insert_image() Page.show_pdf_page()
可显示内容 图像文件,内存中的图像,像素图 PDF 页面
显示分辨率 图像分辨率 矢量化(除了位图页面内容)
旋转 0、90、180 或 270 度 任意角度
裁剪 否(仅完整图像)
保持长宽比 是(默认选项) 是(默认选项)
透明度(水印) 取决于图像 取决于页面
位置 / 放置 缩放以适应目标矩形 缩放以适应目标矩形
性能 自动防止重复; 自动防止重复;
多页图像支持
使用简便性 简单,直观; 简单,直观; 转换为 PDF 后适用于所有文档类型(包括图像!)通过 Document.convert_to_pdf()

Page.insert_image() 的基本代码模式。如果不是重新插入现有图像,则必须给出 文件名 / 流 / 像素图 参数中的一个

page.insert_image(
    rect,                  # where to place the image (rect-like)
    filename=None,         # image in a file
    stream=None,           # image in memory (bytes)
    pixmap=None,           # image from pixmap
    mask=None,             # specify alpha channel separately
    rotate=0,              # rotate (int, multiple of 90)
    xref=0,                # re-use existing image
    oc=0,                  # control visibility via OCG / OCMD
    keep_proportion=True,  # keep aspect ratio
    overlay=True,          # put in foreground
) 

Page.show_pdf_page() 的基本代码模式。源 PDF 和目标 PDF 必须是不同的 Document 对象(但可以从同一文件打开):

page.show_pdf_page(
    rect,                  # where to place the image (rect-like)
    src,                   # source PDF
    pno=0,                 # page number in source PDF
    clip=None,             # only display this area (rect-like)
    rotate=0,              # rotate (float, any value)
    oc=0,                  # control visibility via OCG / OCMD
    keep_proportion=True,  # keep aspect ratio
    overlay=True,          # put in foreground
) 
```## 如何使用像素图:检查文本可见性
文本是否实际可见取决于多个因素:
1.  文本没有被其他对象覆盖,但可能与背景色相同,例如白色字体在白色背景上等。
1.  文本可能被图像或矢量图覆盖。检测这一点是一项重要的功能,例如用于揭示不当匿名化的法律文件。
1.  文本是隐藏创建的。这种技术通常由 OCR 工具使用,将识别的文本存储在页面上的不可见层中。
下面展示了如何检测情况 1\. 或者情况 2\. 如果遮盖物是单色的话:
```py
pix = page.get_pixmap(dpi=150)  # make page image with a decent resolution
# the following matrix transforms page to pixmap coordinates
mat = page.rect.torect(pix.irect)
# search for some string "needle"
rlist = page.search_for("needle")
# check the visibility for each hit rectangle
for rect in rlist:
    if pix.color_topusage(clip=rect * mat)[0] > 0.95:
        print("'needle' is invisible here:", rect) 

方法 Pixmap.color_topusage() 返回一个元组 (ratio, pixel),其中 0 < ratio <= 1,pixel 是颜色的像素值。请注意,我们仅创建一次像素图。如果有多个命中矩形,这可以节省大量处理时间。

上述代码的逻辑是:如果针的矩形是“几乎”单色的(> 95%),则文本不可见。对于可见文本的典型结果返回背景色(通常是白色)和约为 0.7 到 0.8 的比率,例如 (0.685, b'xffxffxff')

你对这个页面有什么反馈吗?


本软件按原样提供,不提供任何明示或暗示的担保。本软件在许可下分发,并且除非在该许可条款明确授权下,否则不得复制、修改或分发。请参考 artifex.com 获取许可信息或联系 Artifex Software Inc.,39 Mesa Street,Suite 108A,San Francisco CA 94129,美国,以获取进一步的信息。

本文档覆盖所有版本,直至 1.24.4。

## 如何从文档页面创建图像

这个小脚本将接受文档文件名,并为每一页生成一个 PNG 文件。

文档可以是任何 支持的类型。

该脚本作为一个命令行工具运行,需要将文件名作为参数提供。生成的图像文件(每页一个)存储在脚本的目录中:

import sys, pymupdf  # import the bindings
fname = sys.argv[1]  # get filename from command line
doc = pymupdf.open(fname)  # open document
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 图像文件。图片的尺寸与其页面的宽度和高度四舍五入为整数,例如 A4 纵向页面的尺寸为 595 x 842 像素。它们在 x 和 y 维度上具有 96 dpi 的分辨率,并且没有透明度。您可以更改所有这些内容-有关如何操作,请阅读下面的部分。


如何增加图像分辨率

文档页面的图像由 Pixmap 表示,创建像素图的最简单方法是通过方法 Page.get_pixmap()

此方法有许多选项可以影响结果。其中最重要的是 Matrix,它允许您缩放、旋转、扭曲或镜像结果。

Page.get_pixmap() 默认将使用 Identity 矩阵,即不进行任何操作。

在以下示例中,我们对每个维度应用了 2 倍的缩放因子,这将为我们生成具有四倍更好分辨率的图像(大约也是四倍的大小):

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

自 1.19.2 版本起,有一种更直接的设置分辨率的方法:参数 "dpi"(每英寸点数)可以用于替换 "matrix"。要创建页面的 300 dpi 图像,请指定 pix = page.get_pixmap(dpi=300)。除了表示简洁外,这种方法的另一个优点是 dpi 值将与图像文件一起保存 —— 使用矩阵表示时不会自动发生这种情况。


PyMuPDF 1.24.4 中文文档(三)(2)https://developer.aliyun.com/article/1559530

相关文章
|
4月前
PyMuPDF 1.24.4 中文文档(五)(1)
PyMuPDF 1.24.4 中文文档(五)
65 3
|
4月前
|
存储 XML 编解码
PyMuPDF 1.24.4 中文文档(三)(2)
PyMuPDF 1.24.4 中文文档(三)
97 0
PyMuPDF 1.24.4 中文文档(三)(2)
|
4月前
|
JSON API 数据格式
PyMuPDF 1.24.4 中文文档(四)(5)
PyMuPDF 1.24.4 中文文档(四)
41 0
|
4月前
|
安全 API 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(一)(5)
PyMuPDF 1.24.4 中文文档(一)
97 3
PyMuPDF 1.24.4 中文文档(一)(5)
|
4月前
|
文字识别 API 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(一)(4)
PyMuPDF 1.24.4 中文文档(一)
155 3
|
4月前
|
存储 XML 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(八)(2)
PyMuPDF 1.24.4 中文文档(八)
396 1
|
4月前
|
存储 XML 编解码
PyMuPDF 1.24.4 中文文档(八)(3)
PyMuPDF 1.24.4 中文文档(八)
171 1
|
4月前
|
Python
PyMuPDF 1.24.4 中文文档(三)(5)
PyMuPDF 1.24.4 中文文档(三)
54 0
PyMuPDF 1.24.4 中文文档(三)(5)
|
4月前
|
存储 资源调度 JavaScript
PyMuPDF 1.24.4 中文文档(八)(1)
PyMuPDF 1.24.4 中文文档(八)
145 0
PyMuPDF 1.24.4 中文文档(八)(1)
|
4月前
|
编解码 API 图形学
PyMuPDF 1.24.4 中文文档(九)(2)
PyMuPDF 1.24.4 中文文档(九)
58 0
PyMuPDF 1.24.4 中文文档(九)(2)