将 PDF 图像粘贴到 Pyplot 图中

che*_*ate 9 python pdf matplotlib

如何将 PDF 文件中的图像绘制成 Pyplot 图(例如,使用plt.imshow,或在我可以添加的某个容器内ax.add_artist)?


不起作用的方法:

import matplotlib.pyplot as plt
im = plt.imread('file.pdf')
Run Code Online (Sandbox Code Playgroud)

(来源:this question,它适用于 PNG 文件。)

from PIL import Image
im = Image.open('file.pdf')
Run Code Online (Sandbox Code Playgroud)

(来源:this doc,但同样,它不适用于 PDF 文件;该问题链接了一个库以读取 PDF,但该文档没有显示将它们添加到 Pyplot 图的明显方法。)

此外,此问题存在,但答案无需实际加载 PDF 文件即可解决问题。

lan*_*ane 1

有一个名为 PyMuPDF 的模块可以使这项工作变得更加容易。

将 PDF 图像抓取到 PIL 图像中

  1. 要从每个页面中抓取单个图像,可以在此处此处找到有关如何将它们转换为 PIL 格式的教程。

  2. 如果目的是抓取整个 PDF 页面或页面,此处page.get_pixmap()记录的内容可以做到这一点。

下面的代码片段展示了如何迭代并抓取 PDF 的每一页作为PIL.Image

import io
import fitz
from PIL import Image

file = 'myfile.pdf'
pdf_file = fitz.open(file)

# in case there is a need to loop through multiple PDF pages
for page_number in range(len(pdf_file)):
    page = pdf_file[page_number]
    rgb = page.get_pixmap()
    pil_image = Image.open(io.BytesIO(rgb.tobytes()))

    # display code or image manipulation here for each page #
Run Code Online (Sandbox Code Playgroud)

显示抓取的 PDF 图像

在任何一种情况下,一旦存在PIL.Image对象(例如pil_image上面的变量),show()函数就可以显示它(并且根据操作系统的不同,显示方式也不同)。但是,如果首选使用,matplotlib.pyplot.imshowPIL.Image必须先转换为 RGB。

PIL.Image显示的片段pyplot.imshow

import matplotlib.pyplot as plt

plt.imshow(pil_image.convert('RGB'))
Run Code Online (Sandbox Code Playgroud)