我正在尝试找到一种通过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 第一方包来实现这一点?
这可以使用类似文件的对象来完成。首先,我们使用方法
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()