需求描述:
某网站与其用户达成一致的协议,每份协议中都有用户相关的独特信息,且还需要生成PDF并存档。PDF文件中需要有企业LOGO、文字描述等信息。其展现形式跟word文件类似,要求排版精美,图文并茂,在接下来的几篇博文中,我将记录整个PDF生成的过程。
技术调研:
首先是通过Django的官方文档找有木有相关的模块,很兴奋又有点失落(模块地址:https://docs.djangoproject.com/en/1.4/howto/outputting-pdf/)。兴奋的是Django考虑周到,为用户提供了生成PDF的模块,失落的是它所提供的不能满足现有的需求。顺藤摸瓜,于是找到了reportlab,发现的确是一个很强大的库,几乎能实现你想要的结果。
项目准备:
通过调研,有三种方式实现PDF的文件生成和保存:
方法一:使用reportlab相关包,用canvas直接画图并保存。这种方法最原始,使用比较麻烦,真对不同的PDF文档需要单独画。另外,还需要详细了解reportlab所提供的API,对于PDF文件中需要画的每一个元素,无论是文字、直线还是图片,都需要自己手动调色、精确定位,操作比较繁琐,且其代码不能够重用,增加了开发成本和维护成本。
方法二:仍然使用reportlab相关包,通过RML(Report Markup Language)来编写需要生成PDF的文件模板(类似于HTML页面),针对不同的报表需求,我们只需要提供不同的报表模板即可,实现好了工具类,直接调用即可,这样比较方便,方便维护。但是前提条件是必须要熟悉并了解RML语言。
方法三:通过HTML直接生成PDF,类似于方法二,都是通过样式,数据,先渲染好模板,再生成PDF文件。
个人感觉RML比较专业一点,因为它是专门用来生成报表需求的,且其展现形式比较丰富,小到文本、图片,大到流程图、饼状图、柱状图、曲线图都能展现。
(未完待续,节日快乐)