from reportlab.lib.styles import getSampleStyleSheet
stylesheet=getSampleStyleSheet()
normalStyle = stylesheet['Normal']
而且不光有Normal,还有Title,Heading1, 等等的风格样例。
ParagraphStyle:这是一个包含了许多通用格式化的需求的类,
alignment = 0
allowOrphans = 0
allowWidows = 1
backColor = None
borderColor = None
borderPadding = 0
borderRadius = None
borderWidth = 0
bulletAnchor = start
bulletFontName = Helvetica
bulletFontSize = 10
bulletIndent = 0
embeddedHyphenation = 1
endDots = None
firstLineIndent = 0
fontName = Helvetica
fontSize = 10
hyphenationLang = en_GB
justifyBreaks = 0
justifyLastLine = 0
leading = 16
leftIndent = 0
linkUnderline = 0
rightIndent = 0
spaceAfter = 6
spaceBefore = 6
spaceShrinkage = 0.05
splitLongWords = 1
strikeGap = 1
strikeOffset = 0.25*F
strikeWidth =
textColor = Color(0,0,0,1)
textTransform = None
underlineGap = 1
underlineOffset = -0.125*F
underlineWidth =
uriWasteReduce = 0.3
wordWrap = None
里面包含了这么多的属性,我们可以在定义ParagraphStyle时,指定这些属性,从而生成不同的Paragraph样例。
最后一行就不一一讲解了,platypus简单介绍一下,说白了就是一个个的container,将文本信息放入其中,可以按照reportlab提供的模板来生成各种各种的样例,例如Paragraph:段落,Spacer:空白区间,Table:表格等。
2.主要代码:
doc = BaseDocTemplate(filename, topMargin = 3.5*cm) #声明一个文档模版类,filename就是存放pdf的地址,
frame_footer = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal') #声明一块Frame,存放页码
template = PageTemplate(id='test', frames=frame_footer, onPage=header, onPageEnd=footer) #设置页面模板,在加载页面时先运行herder函数,在加载完页面后运行footer函数
doc.addPageTemplates([template])
现在我们已经声明了页面的类型,默认A4大小的纸,更改了topMargin等属性。
之后再声明一块Frame,之后再设置页面模版,放入文档模版中。
def footer(canvas, doc):
:param canvas:Canvas类型 pdf画布
:param doc:doc类型 整个pdf文件
canvas.saveState() #先保存当前的画布状态
pageNumber = ("%s" %canvas.getPageNumber()) #获取当前的页码
p = Paragraph(pageNumber, styleN)
w, h = p.wrap(1*cm, 1*cm) #申请一块1cm大小的空间,返回值是实际使用的空间
p.drawOn(canvas, foot_coordinate_x, foot_coordinate_y) #将页码放在指示坐标处
canvas.restoreState()
def header(canvas, doc):
:param canvas:Canvas类型 pdf画布
:param doc:doc类型 整个pdf文件
canvas.saveState()
p = Paragraph("<img src='%s' width='%d' height='%d'/>" %(img_address, header_img_width, header_img_height), styleN) #使用一个Paragraph Flowable存放图片
w, h = p.wrap(doc.width, doc.bottomMargin)
p.drawOn(canvas, doc.leftMargin, doc.topMargin + doc.height - 0.5*cm) #放置图片
p = Paragraph("<font size=10 face='STSong-Light'>报告</font>", styleN)
w,h = p.wrap(doc.width, doc.bottomMargin)
p.drawOn(canvas, doc.leftMargin+doc.width-2.2*cm, doc.topMargin+ doc.height-0.3*cm) #放置报告这句话
canvas.line(doc.leftMargin, doc.bottomMargin+doc.height + 0.5*cm, doc.leftMargin+doc.width, doc.bottomMargin+doc.height + 0.5*cm) #画一条横线
canvas.restoreState()
这个是我们在页面加载是,首先加载header函数中,之后描绘完整个页面会加载footer函数,这时我们的页眉和页脚已经设置完毕了。
最后加一句
text = []
doc.build(text)
我们在text中加载你想放置的其他信息。这样就成功了。
Reportlab
有许多文档和报告要求您在首页或每页上都有页眉。 例如,如果您要为律师或法官生成报告,那么几乎可以肯定,所有页面上都需要合伙人信息。 在大多数医疗机构或医院中生成报告时也是如此。 他们的固定器必须以某种方式看起来。
大多数情况下,这些标头将包含以下字段:
一个或多个人的名字(例如诊所中的所有医生)
电话/传真
一些文档还有其他信息。 例如:
页数与总页数
考虑到标题,实际上标题可以具有无限多个字段。 我能想
一个pdfgen引擎本质上是一个将文档"绘制"到页面序列上的指令序列。每个实例都包含一个Frames的列表,并且有一些 方法应该在每个页面的开始和结束时被调用, 可以使用此参数绘制我们的页眉和页脚. 绘制复杂Pdf文件时 我们可以为每页设置单独的页面模板。它带有相当多的内部机制,但没有默认的页面模板. 所以需要添加定制好的页面模板(PageTemplate)。因我们在工作中需要用到pdf文件, 而对于复杂的定制的pdf文件往往不好处理. 所以本文介绍如何使用Reportlab生成定制pdf文件。...
通过整整两天时间的学习。已经基本摸清reportlab生成pdf的方法。下面记录我的学习成果:
reportlab文档:https://www.reportlab.com/docs/reportlab-userguide.pdf
reportlab实例:https://www.programcreek.com/python/index/1920/reportlab.platypus
repo...
teststyle = ParagraphStyle("test", parent=pdf.styles['Normal'], borderWidth=1, borderColor="black")
本博客重点内容:reportlab生成流文件格式、reportlab分页和图片流文件写入reportlab等。我讲一下我这个需求的来源,做的项目是一个地理空间查询和使用的系统,通过在前端调用高德地图api创建了一个查询区域,获取区域内的地理数据(数据库)。
我们经常将DOC/DOCX、PPT文档另存或者转换为PDF文档。但是这个转换过程不可控,结果不一定能够达到我们的版式需求,因此本节介绍如何使用库从零开始制作PDF文档。
8.2.1 用ReportLab库创建PDF文档
ReportLab是一个用于创建PDF文档的Python库,其功能非常强大,安装方法也非常简单,直接用pip命令安装即可。
1.创建简单的PDF文档
下面我们看一下8.1节示例中的PDF文档是如何自动创建的。
首先从reportlab包的pdfgen目录下导入canvas模块。
为了在Reportlab中建立一个包含书签的SimpleDocTemplate类型的PDF文档,您需要执行以下步骤:
导入reportlab库中的必要模块,如SimpleDocTemplate, Paragraph, Spacer等。
创建SimpleDocTemplate实例,并设置文档的页面布局,页眉和页脚等。
创建书签,可以使用reportlab中的Outline类。
在文档中添加文...
在 reportlab 中,PageTemplates 参数可以用来定义一个模板页面的样式和布局。它可以设置页面的背景、页眉、页脚、页边距等信息。使用方法如下:
定义一个 PageTemplate 对象,并设置其属性。
使用 addPageTemplates() 方法将 PageTemplate 对象添加到文档中。
使用 usePageTemplate() 方法将当前页面设置为定义的 Page...
ReportLab有一个简洁的概念,它们称为PLATYPUS,代表“使用脚本的页面布局和版式”。 这是ReportLab提供的高级布局库,它使使用最少的代码以编程方式创建复杂的布局变得更加容易。 您可以认为PLATYPUS类似于SQLALchemy和SQL。 它基本上为您处理分页,布局和样式。 实际上,您可以通过应用模板来使文档“主题化”。
ReportLab工程师将PLATYPUS描述为具有多个层次(从最高层到最低层):
DocTemplates-页
options = {
'--enable-local-file-access': '--enable-local-file-access',
'--header-html': 'http://127.0.0.1:8000/admin/admin-add-logo/', # 该url获取到仅包含logo图片的html页面
下载自己需要的.ttf字体,例如STSONG.ttf
fromreportlab.pdfbaseimportpdfmetrics
fromreportlab.pdfbase.ttfo...