首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reportlab [ Platypus ]-图像不呈现

Reportlab [ Platypus ]-图像不呈现
EN

Stack Overflow用户
提问于 2012-10-22 19:54:04
回答 2查看 2.4K关注 0票数 3

我正在编写一份报告,其中包括表格和图像的混合。图像图,实际上是以.png格式保存到文件系统中。

实际呈现PDF的方法是:

代码语言:javascript
复制
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

背景信息

  • 该页面设置为A4,面向景观。
  • 我的开发环境是一个虚拟环境;PIL 1.1.7和reportlab 2.6都已安装并具有功能
  • 上面使用的"Report“类只是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)

我已经看过的

  • 我已经确认这些图像存在于磁盘上。这些路径是完全限定的路径。
  • 安装了PIL,并且能够正确地读取图像。
  • 分配给图像的空间是足够的;我已经通过计算证实了这一点。另外,如果我增加图像大小,ReportLab会抱怨图像流太大。当前的维度应该适合。
  • 我已经测试过有和没有分页,它们似乎没有任何区别。

问题

表格、标题和页面模板呈现OK,但图像为空白。今天早些时候,我在设置此报告使用的模板时遇到了本期。解决办法是使用canvas.drawInlineImage(...代替canvas.DrawImage(...。因此,我的设置似乎有问题;我可以使用一些关于如何调试它的提示。

更新

我能够应用这个相互关联的问题中使用的相同解决方案的一个变体(使用canvas.drawInlineImage代替canvas.drawImage )。我将“图像”细分如下:

代码语言:javascript
复制
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。这些并没有什么区别。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-29 09:19:29

通过使用自定义的Image子类,我最终结束了这一问题:

代码语言:javascript
复制
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通道似乎没有什么区别。

票数 1
EN

Stack Overflow用户

发布于 2012-10-22 21:28:12

最佳解决方案是通过reportlab生成向量格式的图形,如postscript,即支持。很多UNIX软件都可以开箱即用,在windows上您可以使用优秀的PDFCreator

如果您必须使用光栅图像为您的图形,尝试将您的图像转换成JPEG格式。使用DCTDecode过滤器,这些可以很容易地嵌入到PDF文件中。(这就是jpeg2pdf 有吗?.)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13018786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档