python根据模板生成pdf文件_python之reportlab生成PDF文件

from reportlab.platypus importSimpleDocTemplate, Paragraph, Spacer, Image, PageBreak, Table, TableStylefrom reportlab.lib.styles importParagraphStyle, getSampleStyleSheetfrom reportlab.lib.units importmmfrom reportlab.lib importcolorsfrom reportlab.lib.enums importTA_CENTER, TA_LEFTfrom reportlab.pdfbase importpdfmetricsfrom reportlab.pdfbase.ttfonts importTTFont

pdfmetrics.registerFont(TTFont('pingbold', 'PingBold.ttf'))

pdfmetrics.registerFont(TTFont('ping', 'ping.ttf'))

pdfmetrics.registerFont(TTFont('hv', 'Helvetica.ttf'))#生成PDF文件

classPDFGenerator:def __init__(self, filename):

self.filename=filename

self.file_path= '/xxx/xxx/xxx/xxx/'self.title_style= ParagraphStyle(name="TitleStyle", fontName="pingbold", fontSize=48, alignment=TA_LEFT,)

self.sub_title_style= ParagraphStyle(name="SubTitleStyle", fontName="hv", fontSize=32,

textColor=colors.HexColor(0x666666), alignment=TA_LEFT, )

self.content_style= ParagraphStyle(name="ContentStyle", fontName="ping", fontSize=18, leading=25, spaceAfter=20,

underlineWidth=1, alignment=TA_LEFT, )

self.foot_style= ParagraphStyle(name="FootStyle", fontName="ping", fontSize=14, textColor=colors.HexColor(0xB4B4B4),

leading=25, spaceAfter=20, alignment=TA_CENTER, )

self.table_title_style= ParagraphStyle(name="TableTitleStyle", fontName="pingbold", fontSize=20, leading=25,

spaceAfter=10, alignment=TA_LEFT, )

self.sub_table_style= ParagraphStyle(name="SubTableTitleStyle", fontName="ping", fontSize=16, leading=25,

spaceAfter=10, alignment=TA_LEFT, )

self.basic_style= TableStyle([('FONTNAME', (0, 0), (-1, -1), 'ping'),

('FONTSIZE', (0, 0), (-1, -1), 12),

('ALIGN', (0, 0), (-1, -1), 'LEFT'),

('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),

('BOTTOMPADDING', (0, 0), (-1, -1), 6),#'SPAN' (列,行)坐标

('SPAN', (1, 0), (3, 0)),

('SPAN', (1, 1), (3, 1)),

('SPAN', (1, 2), (3, 2)),

('SPAN', (1, 5), (3, 5)),

('SPAN', (1, 6), (3, 6)),

('SPAN', (1, 7), (3, 7)),

('GRID', (0, 0), (-1, -1), 0.5, colors.black),

])

self.common_style= TableStyle([('FONTNAME', (0, 0), (-1, -1), 'ping'),

('FONTSIZE', (0, 0), (-1, -1), 12),

('ALIGN', (0, 0), (-1, -1), 'LEFT'),

('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),

('BOTTOMPADDING', (0, 0), (-1, -1), 6),

('GRID', (0, 0), (-1, -1), 0.5, colors.black),

])defgenTaskPDF(self, home_data, task_data, basic_data, case_set_data, fail_case_data, p0_case_data):

story=[]#首页内容

story.append(Spacer(1, 20 *mm))

img= Image('/xxx/xxx.png')

img.drawHeight= 20 *mm

img.drawWidth= 40 *mm

img.hAlign=TA_LEFT

story.append(img)

story.append(Spacer(1, 10 *mm))

story.append(Paragraph("测试报告", self.title_style))

story.append(Spacer(1, 20 *mm))

story.append(Paragraph("Test Report of XXX", self.sub_title_style))

story.append(Spacer(1, 45 *mm))

story.append(Paragraph("报告编号:" + home_data['report_code'], self.content_style))

story.append(Paragraph("计划名称:" + home_data['task_name'], self.content_style))

story.append(Paragraph("报告日期:" + home_data['report_date'], self.content_style))

story.append(Paragraph("负责人:" + home_data['report_creator'], self.content_style))

story.append(Spacer(1, 55 *mm))

story.append(Paragraph("内部文档,请勿外传", self.foot_style))

story.append(PageBreak())#表格允许单元格内容自动换行格式设置

stylesheet =getSampleStyleSheet()

body_style= stylesheet["BodyText"]

body_style.wordWrap= 'CJK'body_style.fontName= 'ping'body_style.fontSize= 12

#测试计划

story.append(Paragraph("测试计划", self.table_title_style))

story.append(Spacer(1, 3 *mm))

task_table= Table(task_data, colWidths=[25 * mm, 141 * mm], rowHeights=12 * mm, style=self.common_style)

story.append(task_table)

story.append(Spacer(1, 10 *mm))#基础参数

story.append(Paragraph("基础参数", self.sub_table_style))

basic_table= Table(basic_data, colWidths=[25*mm, 61*mm, 25*mm, 55*mm], rowHeights=12 * mm, style=self.basic_style)

story.append(basic_table)

story.append(Spacer(1, 10 *mm))#测试用例集

story.append(Paragraph("用例集参数", self.sub_table_style))

case_set_table= Table(case_set_data, colWidths=[25 * mm, 141 * mm], rowHeights=12 * mm, style=self.common_style)

story.append(case_set_table)#story.append(PageBreak())

story.append(Spacer(1, 15 *mm))#失败用例--使用可以自动换行的方式需要data里都是str类型的才OK

story.append(Paragraph("失败用例", self.table_title_style))

story.append(Spacer(1, 3 *mm))

para_fail_case_data= [[Paragraph(cell, body_style) for cell in row] for row infail_case_data]

fail_case_table= Table(para_fail_case_data, colWidths=[20 * mm, 35 * mm, 91 * mm, 20 *mm])

fail_case_table.setStyle(self.common_style)

story.append(fail_case_table)

story.append(Spacer(1, 15 *mm))#基础用例(P0)

story.append(Paragraph("基础用例(P0)", self.table_title_style))

story.append(Spacer(1, 3 *mm))

para_p0_case_data= [[Paragraph(cell, body_style) for cell in row] for row inp0_case_data]

p0_case_table= Table(para_p0_case_data, colWidths=[20 * mm, 35 * mm, 91 * mm, 20 *mm])

p0_case_table.setStyle(self.common_style)

story.append(p0_case_table)

doc= SimpleDocTemplate(self.file_path + self.filename + ".pdf",

leftMargin=20 * mm, rightMargin=20 * mm, topMargin=20 * mm, bottomMargin=20 *mm)

doc.build(story)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值