reportlab 生成pdf

# -*- 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)

你可能感兴趣的:(reportlab 生成pdf)