Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ReportPage(QFrame):
- ''' report rootclass
- create multi-page finance report: dynamic height of the header and footer'''
- def __init__(self):
- super(ReportPage,self).__init__()
- self.printer=QPrinter()
- self.printer.setPaperSize(QPrinter.A4)
- self.printer.setPageMargins(40,30,40,10,QPrinter.Point)
- self.rootEditorTextEdit=QTextEdit()
- self.createReport()
- self.reportGui()
- def reportGui(self):pass # ...create printpreview widget
- def createReport(self):
- self.doc=self.rootEditorTextEdit.document()
- self.doc.setUseDesignMetrics(True)
- self.doc.setPageSize(QSizeF(793,1123)) #(A/4)
- self.doc.setDocumentMargin(0)
- self.rootTextCursor = QTextCursor(self.doc)
- self.pageBreakTextBlockFormat=QTextBlockFormat()
- self.pageBreakTextBlockFormat.setPageBreakPolicy(QTextFormat.PageBreak_AlwaysBefore)
- # document fragments:
- self.firstPageHeader=None
- self.docTitle=None
- self.docPrologText=None
- self.notFirstPageHeader=None
- self.docDetailHeader=None
- self.detailitems=[]
- self.detailSummary=None
- self.docEndText=None
- self.docEndFooter=None
- self.pageFooter=None
- self.reportPartDefinition()
- self.reportCompilation()
- def reportPartDefinition(self):pass #child class create to document fragments
- def reportCompilation(self):
- self.max_page_height=self.printer.pageRect().height()-10 # -10 point repair counting
- try:
- self.page_footer_textHeight=self.pageFooter.textHeight()
- except:
- self.page_footer_textHeight=0
- #print(self.status())
- if self.firstPageHeader:
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.firstPageHeader))
- if self.docTitle:
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docTitle))
- if self.docPrologText:
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docPrologText))
- if self.docDetailHeader:
- if self.currentPageFreeHeightExceptFooter()<self.docDetailHeader.textHeight():
- self.pageBreak()
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))
- while len(self.detailitems):
- self.currentitem=self.detailitems.pop(0)
- if self.currentPageFreeHeightExceptFooter()<self.currentitem.textHeight():
- self.detailPageBreak()
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.currentitem))
- if self.detailSummary:
- if self.currentPageFreeHeightExceptFooter()<self.detailSummary.textHeight():
- self.detailPageBreak()
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.detailSummary))
- if self.docEndText:
- if self.currentPageFreeHeightExceptFooter()<self.docEndText.textHeight():
- self.pageBreak()
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndText))
- if self.docEndFooter:
- if self.currentPageFreeHeight()<self.docEndFooter.textHeight():
- self.pageBreak()
- print(self.currentPage()) # last page number
- self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeight()-self.docEndFooter.textHeight()-18))
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndFooter))
- def pageBreak(self):
- if self.pageFooter:
- self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeightExceptFooter()))
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.pageFooter))
- print(self.currentPage()) # current page number
- self.rootTextCursor.setBlockFormat(self.pageBreakTextBlockFormat)
- if self.notFirstPageHeader:
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.notFirstPageHeader))
- def detailPageBreak(self):
- self.pageBreak()
- if self.docDetailHeader:
- self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))
- def currentPageFreeHeight(self):
- return self.max_page_height-18-self.doc.size().height()%self.max_page_height
- # repair counting -18 point (Qt BUG?) blank QDocument size.height=18 point
- # and fragmentdocuments after insertion Qt don't counting rootdocument into the heights of 18 points
- def currentPageFreeHeightExceptFooter(self):
- return self.currentPageFreeHeight()-self.page_footer_textHeight
- def currentPage(self): #calculating currentpage number
- currentpagecount,fragmentpagesize=divmod(self.doc.size().height(),self.max_page_height)
- if fragmentpagesize>0:
- currentpagecount+=1
- return currentpagecount
- class FragmentTextDocument(QTextDocument):
- '''document fragments rootclass:
- -firstPageHeader
- -docTitle
- -docPrologText
- -notFirstPageHeader
- -docDetailHeader
- -detailitems items
- -detailSummary
- -docEndText
- -docEndFooter
- -pageFooter'''
- def __init__(self,**kwargs):
- super(FragmentTextDocument,self).__init__()
- self.textdict=kwargs
- self.setUseDesignMetrics(True)
- self.setPageSize(QSizeF(793,1123))
- self.setDocumentMargin(0)
- self.fragmentTextEdit=QTextEdit()
- self.fragmentTextCursor = self.fragmentTextEdit.textCursor()
- self.fragmentTextCursor.movePosition(QTextCursor.Start)
- self.createFormats()
- self.detailText()
- self.setHtml(self.fragmentTextEdit.toHtml())
- def createFormats(self): pass #common formats
- def detailText(self):pass #child class create document
- def textHeight(self):
- return self.size().height()+2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement