zfoxatis

Pyside: multi-page finance report (pagecounting)

Oct 6th, 2012
107
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class ReportPage(QFrame):
  2.     ''' report rootclass
  3.        create multi-page finance report: dynamic height of the header and footer'''
  4.     def __init__(self):
  5.         super(ReportPage,self).__init__()
  6.  
  7.         self.printer=QPrinter()
  8.         self.printer.setPaperSize(QPrinter.A4)
  9.         self.printer.setPageMargins(40,30,40,10,QPrinter.Point)
  10.         self.rootEditorTextEdit=QTextEdit()  
  11.        
  12.         self.createReport()
  13.         self.reportGui()
  14.  
  15.     def reportGui(self):pass # ...create printpreview widget
  16.  
  17.     def createReport(self):
  18.  
  19.         self.doc=self.rootEditorTextEdit.document()
  20.         self.doc.setUseDesignMetrics(True)
  21.         self.doc.setPageSize(QSizeF(793,1123)) #(A/4)
  22.         self.doc.setDocumentMargin(0)
  23.        
  24.         self.rootTextCursor = QTextCursor(self.doc)
  25.  
  26.         self.pageBreakTextBlockFormat=QTextBlockFormat()
  27.         self.pageBreakTextBlockFormat.setPageBreakPolicy(QTextFormat.PageBreak_AlwaysBefore)
  28.  
  29.         # document fragments:
  30.         self.firstPageHeader=None
  31.         self.docTitle=None
  32.         self.docPrologText=None
  33.         self.notFirstPageHeader=None
  34.         self.docDetailHeader=None
  35.         self.detailitems=[]
  36.         self.detailSummary=None
  37.         self.docEndText=None
  38.         self.docEndFooter=None
  39.         self.pageFooter=None
  40.        
  41.         self.reportPartDefinition()
  42.         self.reportCompilation()
  43.        
  44.     def reportPartDefinition(self):pass #child class create to document fragments
  45.    
  46.        
  47.     def reportCompilation(self):
  48.         self.max_page_height=self.printer.pageRect().height()-10 # -10 point repair counting
  49.         try:
  50.             self.page_footer_textHeight=self.pageFooter.textHeight()
  51.         except:
  52.             self.page_footer_textHeight=0
  53.        
  54.         #print(self.status())
  55.        
  56.         if self.firstPageHeader:
  57.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.firstPageHeader))
  58.  
  59.         if self.docTitle:
  60.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docTitle))
  61.  
  62.         if self.docPrologText:
  63.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docPrologText))
  64.            
  65.         if self.docDetailHeader:
  66.             if self.currentPageFreeHeightExceptFooter()<self.docDetailHeader.textHeight():
  67.                 self.pageBreak()
  68.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))
  69.        
  70.         while len(self.detailitems):
  71.             self.currentitem=self.detailitems.pop(0)
  72.             if self.currentPageFreeHeightExceptFooter()<self.currentitem.textHeight():
  73.                 self.detailPageBreak()
  74.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.currentitem))
  75.  
  76.         if self.detailSummary:
  77.             if self.currentPageFreeHeightExceptFooter()<self.detailSummary.textHeight():
  78.                 self.detailPageBreak()
  79.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.detailSummary))
  80.  
  81.         if self.docEndText:
  82.             if self.currentPageFreeHeightExceptFooter()<self.docEndText.textHeight():
  83.                 self.pageBreak()
  84.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndText))
  85.  
  86.         if self.docEndFooter:
  87.             if  self.currentPageFreeHeight()<self.docEndFooter.textHeight():
  88.                 self.pageBreak()
  89.             print(self.currentPage())  # last page number
  90.             self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeight()-self.docEndFooter.textHeight()-18))
  91.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndFooter))
  92.  
  93.     def pageBreak(self):
  94.         if self.pageFooter:
  95.             self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeightExceptFooter()))
  96.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.pageFooter))
  97.         print(self.currentPage()) # current page number
  98.         self.rootTextCursor.setBlockFormat(self.pageBreakTextBlockFormat)
  99.         if self.notFirstPageHeader:
  100.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.notFirstPageHeader))
  101.    
  102.     def detailPageBreak(self):
  103.         self.pageBreak()
  104.         if self.docDetailHeader:
  105.             self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))
  106.    
  107.     def currentPageFreeHeight(self):
  108.         return self.max_page_height-18-self.doc.size().height()%self.max_page_height
  109.     # repair counting -18 point (Qt BUG?) blank QDocument size.height=18 point
  110.     # and fragmentdocuments after insertion Qt don't counting rootdocument into the heights of 18 points
  111.    
  112.     def currentPageFreeHeightExceptFooter(self):
  113.         return self.currentPageFreeHeight()-self.page_footer_textHeight
  114.    
  115.     def currentPage(self): #calculating currentpage number
  116.         currentpagecount,fragmentpagesize=divmod(self.doc.size().height(),self.max_page_height)
  117.         if fragmentpagesize>0:
  118.             currentpagecount+=1
  119.         return currentpagecount
  120.  
  121. class FragmentTextDocument(QTextDocument):
  122.     '''document fragments rootclass:
  123.        -firstPageHeader
  124.        -docTitle
  125.        -docPrologText
  126.        -notFirstPageHeader
  127.        -docDetailHeader
  128.        -detailitems items
  129.        -detailSummary
  130.        -docEndText
  131.        -docEndFooter
  132.        -pageFooter'''
  133.    
  134.     def __init__(self,**kwargs):
  135.         super(FragmentTextDocument,self).__init__()
  136.         self.textdict=kwargs
  137.  
  138.         self.setUseDesignMetrics(True)
  139.         self.setPageSize(QSizeF(793,1123))
  140.         self.setDocumentMargin(0)
  141.        
  142.         self.fragmentTextEdit=QTextEdit()
  143.         self.fragmentTextCursor = self.fragmentTextEdit.textCursor()
  144.         self.fragmentTextCursor.movePosition(QTextCursor.Start)
  145.        
  146.         self.createFormats()
  147.         self.detailText()
  148.         self.setHtml(self.fragmentTextEdit.toHtml())
  149.  
  150.     def createFormats(self): pass #common formats
  151.        
  152.        
  153.     def detailText(self):pass #child class create document
  154.    
  155.    
  156.     def textHeight(self):
  157.         return self.size().height()+2
RAW Paste Data