# -*- coding=utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf8') from reportlab.lib import colors from reportlab.lib.pagesizes import A4 from reportlab.platypus import Table, TableStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.platypus import SimpleDocTemplate from reportlab.pdfgen import canvas class FooterCanvas(canvas.Canvas): def __init__(self, *args, **kwargs): canvas.Canvas.__init__(self, *args, **kwargs) self.pages = [] def showPage(self): self.pages.append(dict(self.__dict__)) self._startPage() def save(self): page_count = len(self.pages) for page in self.pages: self.__dict__.update(page) self.draw_canvas(page_count) canvas.Canvas.showPage(self) canvas.Canvas.save(self) def draw_canvas(self, page_count): page = "Page %s of %s" % (self._pageNumber, page_count) x = 128 self.saveState() self.setStrokeColorRGB(0, 0, 0) self.setLineWidth(0.5) #self.line(66, 78, A4[0] - 66, 78) self.setFont('Times-Roman', 10) self.drawString(A4[0]-x, 65, page) self.restoreState() doc = SimpleDocTemplate("report_lab.pdf", pagesize=A4) pdfmetrics.registerFont(TTFont('hei', 'simhei.ttf')) elements = [] data = [["Title:","","","",""], ["Letter", "Number", "Stuff", "Long stuff that should be wrapped", u"备注"], ["A", "01", "ABCD", "AAAAAAAAAAAAAAAAAAAAAAAAA", ""], ["B", "02", "CDEF", "BBBBBBBBBBBBBBBBBBBBBBBBB", ""], ["C", "03", "SDFSDF", "CCCCCCCCCCCCCCCCCCCCCC", ""], ["D", "04", "SDFSDF", "DDDDDDDDDDDDDDDDDDDDDDDD", ""], ["E", "05", "GHJGHJGHJ", "EEEEEEEEEEEEEEE", ""], ] def addRow(): r = ["A", "01", "ABCD", "AAAAAAAAAAAAAAAAAAAAA", ""] return r for x in range(100): data.append(addRow()) # SPAN, (sc,sr), (ec,er) # style : style name, start column,start row,end column,end row,(style value) style = TableStyle([('SPAN',(0,0),(-1,0)), # 合并第一行 ('ALIGN', (0,0), (-1, 0), 'CENTER'), # 第一行左右居中, ('VALIGN', (0,0), (-1, 0), 'MIDDLE'), # 第一行上下居中 ('FACE',(0,0),(-1,-1),'hei'), # 字体 也可用FONTNAME ('FONTSIZE',(1,1),(-1,-1),12), ('ALIGN', (1, 1), (-2, 0), 'RIGHT'), ('TEXTCOLOR', (1, 1), (-2, -2), colors.red), # 字体颜色 ('VALIGN', (0, 0), (0, -1), 'TOP'), ('TEXTCOLOR', (0, 0), (0, -1), colors.blue), ('ALIGN', (0, -1), (-1, -1), 'CENTER'), ('VALIGN', (0, -1), (-1, -1), 'MIDDLE'), ('TEXTCOLOR', (0, -1), (-1, -1), colors.green), ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ]) table = Table(data) table.setStyle(style) # Send the data and build the file elements.append(table) # doc.build(elements) doc.build(elements, canvasmaker=FooterCanvas)