<p>如果我理解得对的话,您不需要对整个文档模板进行子类化,您只需要一个可以放入SimpleDocTemplate的流。你可以通过Flowable本身的一个非常简单的子类来实现这一点。</p>
<p>->;特别是因为人们经常询问如何将matplotlib对象放入reportlab,我将演示如何使用matplotlib生成一个绘图,然后使用修改后的flowable将该绘图放入SimpleDocTemplate(不将文件保存到磁盘)。这个概念适用于任何文件或任何可以输入cStringIO的内容</p>
<p>->;下面允许您将图形放在文本上(将高度从负值更改为正值,将其推到绘图所进入部分顶部的虚线上方)</p>
<p>关键的概念是,每个Flowable本身也包含一个我们可以绘制的画布。</p>
<p/><div class="snippet" data-lang="js" data-hide="false">&13;
<div class="snippet-code">&13;
<pre class="snippet-code-html lang-html prettyprint-override"><code>import matplotlib.pyplot as plt
import cStringIO
from reportlab.lib.units import inch, cm
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
import reportlab.lib, reportlab.platypus
class flowable_fig(reportlab.platypus.Flowable):
def __init__(self, imgdata):
reportlab.platypus.Flowable.__init__(self)
self.img = reportlab.lib.utils.ImageReader(imgdata)
def draw(self):
self.canv.drawImage(self.img, 0, 0, height = -2*inch, width=4*inch)
# http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html
doc = SimpleDocTemplate(("report.pdf"),pagesize=letter,
rightMargin=72,leftMargin=72,
topMargin=72,bottomMargin=18)
Story=[]
styles=getSampleStyleSheet()
ptext = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi massa dolor, vulputate quis elit sed, sagittis consectetur erat. Sed lobortis nisi eros, eu maximus enim iaculis ac. Vestibulum sagittis urna nec interdum aliquam. Pellentesque ornare velit ut ante ullamcorper, vulputate accumsan nisi vulputate. Fusce consectetur dolor quam. Phasellus hendrerit, ligula vel consectetur pretium, lorem neque dapibus eros, ornare suscipit ipsum dolor id nisl. Sed vel orci id leo efficitur lobortis sit amet id risus. Nullam euismod, ipsum a posuere scelerisque, ante lorem ultrices nibh, ut feugiat metus ex congue enim. Nam lobortis, metus id pellentesque feugiat, arcu orci rutrum felis, quis luctus urna nisl at nulla. Donec eu eros pharetra dolor congue facilisis at ac magna. Nullam eu ultricies metus. Sed sodales, libero viverra pellentesque tempus, magna purus convallis nibh, eu condimentum tortor erat tincidunt turpis. Vestibulum scelerisque tincidunt egestas. Nullam commodo diam nisl, sed consequat ex sagittis eu.'
Story.append(Paragraph(ptext, styles["Normal"]))
fig = plt.figure(figsize=(10, 3))
plt.plot([1,2,3,4])
plt.ylabel('This is a boring plot')
imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
pic = flowable_fig(imgdata)
Story.append(pic)
doc.build(Story)</code></pre>
;
</div>
;
</div>
;
<p>您可以扩展这个被截取的最小代码来完成您喜欢的任何事情,并且可以向Story变量添加尽可能多的片段(实际上,Story变量只是一个可流动的列表)。神奇的是,我们给doc builder一个Flowable,它使用Flowable自己的画布来绘制图形。</p>
<p>编辑:我差点忘了,因为这让我们可以完全访问DrawImages,我们还可以使该图片或绘图具有透明度,以便通过它可以看到其他东西。drawImage上的文档有详细信息。</p>