sav*_*tas 13 python reportlab matplotlib
我想使用drawImage方法将使用matplotlib生成的图形添加到reportlab画布中,而不必先将图形保存到硬盘驱动器中.
我的问题与以下内容有关: ReportLab是否有可流动的matplotlib?,很好地解决了.但是,我不想使用DocTemplates,Stories,Flowables等.如上所述,我想使用drawImage将它放在画布中的某个位置.
我尝试使用以下方法将matplotlib图转换为PIL图像:
2)http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server
例如,一些无法工作的代码是:
import Image
import matplotlib.pyplot as plt
import cStringIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
im = Image.open(imgdata)
c = canvas.Canvas('test.pdf')
#c.drawImage(imgdata, cm, cm, inch, inch)
c.drawImage(im, cm, cm, inch, inch)
c.save()
Run Code Online (Sandbox Code Playgroud)
试图imgdata
在错误中绘制结果:
AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'
Run Code Online (Sandbox Code Playgroud)
虽然绘图im
给出:
AttributeError: rfind
Run Code Online (Sandbox Code Playgroud)
现在有人如何解决这个问题?任何帮助将不胜感激.
Geo*_*rge 11
问题是drawImage需要ImageReader对象或文件路径,而不是文件句柄.
以下应该有效:
import Image
import matplotlib.pyplot as plt
import cStringIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
from reportlab.lib.utils import ImageReader
fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
Image = ImageReader(imgdata)
c = canvas.Canvas('test.pdf')
c.drawImage(Image, cm, cm, inch, inch)
c.save()
Run Code Online (Sandbox Code Playgroud)
Python 3 的解决方案,并将 matplotlib 图嵌入为矢量图像(无光栅化)。在这里重新发布,因为我搜索了很长时间。
import matplotlib.pyplot as plt
from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
from svglib.svglib import svg2rlg
fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
imgdata = BytesIO()
fig.savefig(imgdata, format='svg')
imgdata.seek(0) # rewind the data
drawing=svg2rlg(imgdata)
c = canvas.Canvas('test2.pdf')
renderPDF.draw(drawing,c, 10, 40)
c.drawString(10, 300, "So nice it works")
c.showPage()
c.save()
Run Code Online (Sandbox Code Playgroud)
svglib 可从 conda-forge 获得。
归档时间: |
|
查看次数: |
9619 次 |
最近记录: |