python与reportlab类库技术用例-pdf报表1

来源:互联网 发布:查询数据库密码 编辑:程序博客网 时间:2024/05/29 18:21

#coding=utf-8
from reportlab.platypus import *
from reportlab.lib.styles import *  
from reportlab.rl_config import *  
from reportlab.lib.units import *
from reportlab.lib import pagesizes,colors
from reportlab.pdfbase import ttfonts,pdfmetrics
import copy
FONT_PATH=('D:/python_workspace/python_pdf_demo/MSYH.TTF',)
class ReportConfig:
    #字体初始化
    def init_stylesheet(self):
        warnOnMissingFontGlyphs = 0
        pdfmetrics.registerFont(ttfonts.TTFont('wenquan',FONT_PATH[0]))
        stylesheet= getSampleStyleSheet()
        return stylesheet
    #初始化普通内容字体样式
    def init_body_font(self,stylesheet):
        body_style=copy.deepcopy(stylesheet["BodyText"])
        body_style.fontName="wenquan"
        body_style.fontSzie=12
        return body_style
    def getSplitStr(self,type):
        if(type==1):
            return "/n"
        else:
            return "<br/>"
    def getSplitParagraph(self,content,width=0,styles=None):
        if(width is None or width<=0):
            return Paragraph(content,styles)
        param=Paragraph(content,styles)
        res=None
        try:
            res=param.breakLinesCJK(width)
        except:
            res=param.breakLines(width)
        lsttmp=[]
        for row in res.lines:
            lsttmp.append(row[1][0])
        #定义换行符
        splitstr=self.getSplitStr(2)
        tmpstr=splitstr.join(lsttmp)
        return Paragraph(tmpstr,styles)
def firstPages(canvas,doc):
    TITLE=u"订单信息列表"
    canvas.saveState()  
    canvas.setFont('wenquan',18)
    canvas.drawImage("logo.jpg",20,doc.pagesize[1]-35,33,30,[254,255, 254,255, 254,255])
    canvas.drawCentredString(doc.pagesize[0]/2-30,doc.pagesize[1]-30,TITLE)  
    canvas.setFont('wenquan',8)  
    canvas.drawString((doc.pagesize[0]/2)-20,20,u"第1页")  
    canvas.restoreState()
def laterPages(canvas,doc):
    TITLE=u"订单信息列表"
    canvas.saveState()
    canvas.setFont('wenquan',18)
    canvas.drawImage("logo.jpg",20,doc.pagesize[1]-35,33,30,[254,255, 254,255, 254,255])
    canvas.drawCentredString(doc.pagesize[0]/2-30,doc.pagesize[1]-30,TITLE)
    canvas.setFont('wenquan',8)  
    canvas.drawString((doc.pagesize[0]/2)-20,20,u"第%d页" % (doc.page))  
    canvas.restoreState()
def init_table_data(config,widths,styles):
    import MySQLdb
    hosts='192.168.1.32'
    users='root'
    passwds='12345'
    dbs='sjpoto'
    charsets='utf8'
    conn=MySQLdb.connect(host=hosts,user=users,passwd=passwds,db=dbs,charset=charsets)
    cursor=conn.cursor()
    cursor.execute("SELECT PRD_ID,PRD_CODE,PRD_LOCALNAME,PRD_MARKET_PRICE,PRD_COLOR FROM BPRODUCT")
    lst=[]
    for row in cursor.fetchall():
        lines=[]
        i=0
        for field in row:
            if(field is not None):
                lines.append(config.getSplitParagraph(unicode(field),widths[i],styles))
            else:
                lines.append("")
            i=i+1
        lst.append(lines)
    cursor.close()
    conn.close()
    return lst
def init_content():
    doc=SimpleDocTemplate("demo5.pdf",pagesize=pagesizes.A4)
    #doc.rotation=180
    config=ReportConfig()
    elements=[]
    stylesheet=config.init_stylesheet()
    content_style=config.init_body_font(stylesheet)
    #p=config.getSplitParagraph(u"测试werqwerwe细3421341234234234心你",20,content_style)
    #elements.append(p)
    #将页面总宽度分成1000份,取其中1份
    pwidth=(doc.pagesize[0]-20)/1000
    #表格每列宽度,总共5列
    colwidths = (pwidth*50,pwidth*200,pwidth*400,pwidth*200,pwidth*150)
    table_data=init_table_data(config,colwidths,content_style)
    table1=Table(table_data,colwidths)
    table1.setStyle(TableStyle([('GRID',(0,0),(4,len(table_data)),0.25,colors.black)]))
    elements.append(table1)
    #强制分页
    #elements.append(PageBreak())
    #再添加一个table
    data2=[["aaaa","bbbbbbbbbbbb","cccccccccccccc","ddddddddddddd"],]
    colwidths = (pwidth*250,pwidth*250,pwidth*250,pwidth*250)
    table2=Table(data2,colwidths)
    table2.setStyle(TableStyle([('GRID',(0,0),(4,len(data2)),0.25,colors.black)]))
    elements.append(table2)
    #生称报表最终内容
    #doc.build(elements,onFirstPage=firstPages)
    doc.build(elements,onFirstPage=firstPages, onLaterPages=laterPages)
if __name__=="__main__":
    init_content()
   
   

原创粉丝点击