相关文章推荐
爱跑步的凉面  ·  Android 10 ...·  6 月前    · 
逆袭的移动电源  ·  shell ...·  1 年前    · 

reportlab 制作pdf

最近需要使用python制作一个pdf,这是苦于没有好的库,就在github上面找,找来找去,觉得没有很合适的,就想着死马当活马医随便用一个吧,就找到了一个可以使用markdown语法来生成pdf的工程,但是clone下来之后,看手册,发现需要reportlab的版本>3.0以上,瞬间感觉是不是reportlab是我的救星,然后就去了reportlab的官网,发现真的是救星级别的库了,于是就看reportlab的文档,用一天时间看文档,但是reportlab的文档我觉得做得太简单了,功能这么强大的库,给的例子太简单。当然在本文的最后我会放上从官网上down下来的例子的文档,大家可以看一看,我觉得看一遍手册,然后再看一遍例子,还有官网的Code Snippets可以更好地了解这个库的使用。

-------------------------------上面都是废话------------------

from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph, Spacer, Table, LongTable, TableStyle, tableofcontents, PageBreak

当时我引入了这么些库,其中有很多都是我下面要使用,简单介绍一下:

canvas:reportlab将一个pdf看成是一个画布,这个就是那个画布类型,就相当于在画上画画的感觉,如果你们有什么图要画,可以使用reportlab的画画工具,挺强大的,画布是一个坐标轴,页面的左下角为原点。

cm:引入cm,方便以后的坐标标记,不懂英尺,就low一点用厘米吧,页面大小默认是A4大小,也就是宽21cm, 高29.7cm

pdfmetrics:为了后面的中文字体使用而饮用的,当我们使用其他的非标准字体时,可以使用这个库

UnicodeCIDFont:这个库中包含STSong-Light这个Font,所以我们引入

下一句就是registerFont,一遍之后我们使用这个字体,构建pdf时认识这种字体

getSampleStyleSheet:一个样例风格卡片,翻译水平有限,里面放了很多的风格样例供我们使用,使用方式

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...