две диаграммы с учетом данных в одном файле PDF в reportlab - PullRequest
0 голосов
/ 16 июня 2011

Я пытаюсь сделать один PDF-файл с 2 диаграммами с учетом данных. Одна - это гистограмма, которая берет данные из таблицы 1, а другая - строка (что-то вроде текстового поля), которая получает данные из другой таблицы. Когда я запускаю эту программу в reportlab, строковая часть (класс, который имеет код для подключения строки к базе данных и ее отображения), которая вызывается позже, перезаписывает диаграмму гистограммы. Я не нахожу способа отобразить их обоих в одном файле PDF. Пожалуйста, предложите.

from rlextra.graphics.guiedit.datacharts import DataAwareDrawing, ODBCDataSource, DataAssociation  
from reportlab.graphics.charts.barcharts import VerticalBarChart3D  
from reportlab.graphics.shapes import _DrawingEditorMixin, Line, String  
from reportlab.lib.colors import red  
from reportlab.lib.pagesizes import letter  
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image  
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle  
from reportlab.lib.enums import TA_JUSTIFY  
from reportlab.lib.pagesizes import letter  
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image  
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle  
from reportlab.lib.units import inch  


class avg_max_min(_DrawingEditorMixin,DataAwareDrawing):  
    def __init__(self,width=1000,height=1000,*args,**kw):  
        DataAwareDrawing.__init__(self,width,height,*args,**kw)  
         self._add(self,Line(750,900,900,900),name='horline1',validate=None,desc=None)  
        self._add(self,Line(750,930,900,930),name='horline2',validate=None,desc=None)  
        self._add(self,Line(750,960,900,960),name='horline3',validate=None,desc=None)  
        self._add(self,Line(750,900,750,960),name='verline1',validate=None,desc=None)  
        self._add(self,Line(800,900,800,960),name='verline2',validate=None,desc=None)  
        self._add(self,Line(850,900,850,960),name='verline3',validate=None,desc=None)  
        self._add(self,Line(900,900,900,960),name='verline4',validate=None,desc=None)  
        self._add(self,String(760,945,'Average'),name='label1',validate=None,desc=None)  
        self.label1.fontSize   = 8  
        self.label1.fillColor  = red  
        self.label1.textAnchor = 'start'  
        self._add(self,String(810,945,'Minimum'),name='label2',validate=None,desc=None)  
        self.label2.fillColor  = red  
        self.label2.fontSize   = 8  
        self.label2.textAnchor = 'start'  
        self._add(self,String(860,945,'Maximum'),name='label3',validate=None,desc=None)  
        self.label3.fillColor  = red  
        self.label3.fontSize   = 8  
        self.label2.textAnchor = 'start'  
         self._add(self,String(760,915,'text'),name='label4',validate=None,desc=None)  
        self._add(self,String(810,915,'text'),name='label5',validate=None,desc=None)  
        self._add(self,String(860,915,'text'),name='label6',validate=None,desc=None)  

        self.dataSource       = ODBCDataSource()  
        self.dataSource.driver                   = 'mysql'  
        self.dataSource.name                     = 'view'  
        self.dataSource.user                     = 'root'  
        self.dataSource.password                 = 'sou'  
        self.dataSource.sql                      = 'select cast(avg(diff) as char(50)), cast(min(diff) as char(50)),cast(max(diff) as char(50)) from new_table'  
        self.dataSource.associations.size       = 3  
        self.dataSource.associations.element00  = DataAssociation(column=0, target='label4.text', assocType='scalar')  
        self.dataSource.associations.element01  = DataAssociation(column=1, target='label5.text', assocType='scalar')  
        self.dataSource.associations.element02  = DataAssociation(column=2, target='label6.text', assocType='scalar')  



class final_logon(_DrawingEditorMixin,DataAwareDrawing):  
    def __init__(self,width=1000,height=1000,*args,**kw):  
        DataAwareDrawing.__init__(self,width,height,*args,**kw)  
        self._add(self,VerticalBarChart3D(),name='vertical',validate=None,desc=None)  
        self.vertical.x              = 150  
        self.vertical.y              = 200  
        self.vertical.width          = 600  
        self.vertical.height         = 600  
        self.dataSource       = ODBCDataSource()  
        self.dataSource.driver                   = 'mysql'  
        self.dataSource.name                     = 'view'  
        self.dataSource.user                     = 'root'  
        self.dataSource.password                 = 'sou'  
        self.dataSource.sql                      = 'select id, range_value, user_number from final_logon'  
        self.dataSource.associations.size       = 3  
        self.dataSource.associations.element00  = DataAssociation(column=0, target='verticalId', assocType='scalar')  
        self.dataSource.associations.element02  = DataAssociation(column=1, target='vertical.categoryAxis.categoryNames', assocType='vector')  
        self.dataSource.associations.element01  = DataAssociation(column=2, target='vertical.data', assocType='tmatrix')  

doc = SimpleDocTemplate("merged.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18)  
Story = []  

Story.append(avg_max_min().go())  
Story.append(final_logon().go())  
doc.build(Story)

Ошибка, которую я получаю:

C:\Python26\to be merged>merged.py  
Traceback (most recent call last):  
  File "C:\Python26\to be merged\merged.py", line 96, in <module>  
    doc.build(Story)  
  File "C:\Python26\lib\site-packages\reportlab\platypus\doctemplate.py", line 1  
117, in build  
    BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker)  
  File "C:\Python26\lib\site-packages\reportlab\platypus\doctemplate.py", line 8  
80, in build  
    self.handle_flowable(flowables)  
  File "C:\Python26\lib\site-packages\reportlab\platypus\doctemplate.py", line 7  
44, in handle_flowable  
    self.handle_keepWithNext(flowables)  
  File "C:\Python26\lib\site-packages\reportlab\platypus\doctemplate.py", line 7  
11, in handle_keepWithNext  
    while i<n and flowables[i].getKeepWithNext(): i += 1  
AttributeError: 'NoneType' object has no attribute 'getKeepWithNext'  

1 Ответ

0 голосов
/ 21 июня 2011

Я раньше не работал с модулем rlextra, но, как мне известно, ни одна из частей ReportLab действительно не предназначена для добавления в существующий файл. Вместо этого вам нужно сгенерировать эти два изображения (если вы не хотите записывать их в реальный файл, рассмотрите возможность использования StringIO), а затем нарисуйте их вместе на одном холсте.

...