将 matplotlib 图形写入 ReportLab PDF 文件,而不将图像保存到磁盘

问题描述 投票:0回答:1

我正在尝试找到一种通过reportlab(4.0.6开源版本)将matplotlib图形写入PDF的方法。根据其 doc,它应该接受 PIL Image 对象,但我尝试了以下操作,它返回了

TypeError: expected str, bytes or os.PathLike object, not Image

from reportlab.pdfgen import canvas
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvas

c = canvas.Canvas('test-pdf.pdf')

fig, ax = plt.subplots()
ax.plot([1, 2, 4], [3, 4, 6], '-o')
fig_canvas = FigureCanvas(fig)
fig_canvas.draw()
img = Image.fromarray(np.asarray(fig_canvas.buffer_rgba()))

c.drawImage(img, 0, 0)

c.showPage()
c.save()

我已经看过这个解决方案,但它很旧并且使用其他依赖项。有没有办法仅使用 PIL 或 numpy 或任何 python3 第一方包来实现这一点?

python matplotlib python-imaging-library reportlab
1个回答
0
投票

这可以使用类似文件的对象来完成。首先,我们使用方法

plt.savefig
进行写入,使用方法
reportlab
ImageReader
进行读取。

import io
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvas

c = canvas.Canvas('test-pdf.pdf')

fig, ax = plt.subplots()
ax.plot([1, 2, 4], [3, 4, 6], '-o')
fig_canvas = FigureCanvas(fig)
fig_canvas.draw()

b = io.BytesIO()
plt.savefig(b, format='png')
plt.close()

image = ImageReader(b)
c.drawImage(image, 0, 0)

c.showPage()
c.save()
© www.soinside.com 2019 - 2024. All rights reserved.