我正在编写一份报告,其中包括表格和图像的混合。图像图,实际上是以.png格式保存到文件系统中。
实际呈现PDF的方法是:
def _render_report(report_data):
file_name = get_file_name() # generate random filename for report
rpt = Report(settings.MEDIA_ROOT + os.sep + file_name)
Story = []
for (an, sam, event), props in report_data.iteritems():
Story.append(Paragraph("%s - sample %s results for %s" % (an.name, sam.name, event.name), styles["Heading2"]))
data_list = [['Lab', 'Method', 'Instrument', 'Unit', 'Raw Result', 'Converted Result', 'Outlier']]
for (index, series) in props['frame'].iterrows():
data_list.append(_format([
Paragraph(Lab.objects.get(pk=series['labs']).name, styles['BodyText']),
Paragraph(Method.objects.get(pk=series['methods']).name, styles['BodyText']),
Paragraph(Instrument.objects.get(pk=series['instruments']).name, styles['BodyText']),
Paragraph(Unit.objects.get(pk=series['units']).name, styles['BodyText']),
series['raw_results'],
series['results'],
series['outlier']
]))
table = Table(data_list, colWidths=[45 * mm, 35 * mm, 35 * mm, 25 * mm, 35 * mm, 35 * mm, 35 * mm], repeatRows=1)
Story.append(table)
Story.append(PageBreak())
if props['graph'] is not None:
Story.append(Image("/tmp/%s" % props['graph'], width=10 * inch, height=6 * inch))
Story.append(PageBreak())
rpt.draw(Story, onFirstPage=setup_header_and_footer, onLaterPages=setup_header_and_footer)
return file_name背景信息
SimpleDocTemplate的一个薄包装器,它设置了一些缺省值,但委托给SimpleDocTemplate的build实现。它的代码是:
类报告(对象):def __init__(self,filename,doctitle="Report",docauthor=“,docsubject=”,doccreator=“,orientation=”doccreator=“,size=A4):默认值={ 'leftMargin‘:10 * mm,'rightMargin’:10 * mm,'bottomMargin‘:15 * mm,'topMargin’:36 * mm,‘页面大小’:景观(大小),如果定向==“景观”其他肖像(大小),‘标题’:博士标题,‘作者’:文档作者,‘主题’:博士主体,‘创建者’:文档创建者} self.doc =SimpleDocTemplate(文件名,**默认值) def绘图(自,流动,onFirstPage=setup_header_and_footer,onLaterPages=setup_header_and_footer):self.doc.build(流动材料,onFirstPage=setup_header_and_footer,onLaterPages=setup_header_and_footer,canvasmaker=NumberedCanvas)我已经看过的
问题
表格、标题和页面模板呈现OK,但图像为空白。今天早些时候,我在设置此报告使用的模板时遇到了本期。解决办法是使用canvas.drawInlineImage(...代替canvas.DrawImage(...。因此,我的设置似乎有问题;我可以使用一些关于如何调试它的提示。
更新
我能够应用这个相互关联的问题中使用的相同解决方案的一个变体(使用canvas.drawInlineImage代替canvas.drawImage )。我将“图像”细分如下:
class CustomImage(Image):
"""
Override - to use inline image instead; inexplicable bug with non inline images
"""
def draw(self):
lazy = self._lazy
if lazy>=2: self._lazy = 1
self.canv.drawInlineImage(self.filename,
getattr(self,'_offs_x',0),
getattr(self,'_offs_y',0),
self.drawWidth,
self.drawHeight
)
if lazy>=2:
self._img = None
self._lazy = lazy与“股票”图像类相比,唯一的变化是在一行中使用self.canv.drawInlineImage,而以前有self.canvas.drawImage。这个“工作”的意思是,图像最终在我的PDF中可见。drawImage不起作用的原因仍然是个谜。
我已经尝试了@PedroRomano的建议(以确保图像RGBA ),甚至尝试JPEG图像而不是PNG。这些并没有什么区别。
发布于 2012-10-29 09:19:29
通过使用自定义的Image子类,我最终结束了这一问题:
class CustomImage(Image):
"""
Override - to use inline image instead; inexplicable bug with non inline images
"""
def draw(self):
lazy = self._lazy
if lazy>=2: self._lazy = 1
self.canv.drawInlineImage(self.filename,
getattr(self,'_offs_x',0),
getattr(self,'_offs_y',0),
self.drawWidth,
self.drawHeight
)
if lazy>=2:
self._img = None
self._lazy = lazy保存图形的矢量图形格式,如EPS,保存为JPEG,保存为PNG与和没有alpha通道似乎没有什么区别。
发布于 2012-10-22 21:28:12
最佳解决方案是通过reportlab生成向量格式的图形,如postscript,即支持。很多UNIX软件都可以开箱即用,在windows上您可以使用优秀的PDFCreator。
如果您必须使用光栅图像为您的图形,尝试将您的图像转换成JPEG格式。使用DCTDecode过滤器,这些可以很容易地嵌入到PDF文件中。(这就是jpeg2pdf 有吗?.)
https://stackoverflow.com/questions/13018786
复制相似问题