Python3操作pdf文件之ReportLab的居中与换行

昨天,就在昨天,咱用了用ReportLab,那效果真的好得不得了,可惜因为篇幅问题,只是小刀牛试了一把,在解决了它的中文问题后,就戛然而止了,甚是寡淡无味。

为了让Python3处理pdf的口味更重一些,咱就来给ReportLab添点料。

这次要实现的功能,主要是标题和一段文字的描述,这么有用的功能就问你惊不惊喜,意不意外。有关标题的功能,你可千万别小瞧了,单是居中,就有很多人不知道怎么实现才好。好了,别只顾兴奋了,咱开始搬砖吧。

from reportlab.pdfbase import pdfmetrics

from reportlab.pdfbase.ttfonts import TTFont

from reportlab.platypus import SimpleDocTemplate, Paragraph

from reportlab.lib.pagesizes import letter

from reportlab.lib.styles import getSampleStyleSheet

from reportlab.lib import colors

# 注册字体

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

class Graphs:

def __init__(self):

# 绘制标题

@staticmethod

def draw_title():

style = getSampleStyleSheet()

ct = style['Normal']

ct.fontName = 'SimSun'

ct.fontSize = 18

# 设置行距

ct.leading = 50

ct.textColor = colors.green

ct.alignment = 1

# 添加标题并居中

title = Paragraph('程序员的兴趣调查报告', ct)

return title

if __name__ == "__main__":

content = list()

# 添加标题

content.append(Graphs.draw_title())

# 生成pdf文件

doc = SimpleDocTemplate('report.pdf', pagesize=letter)

doc.build(content)

如果只是有个标题,总感觉很沙雕似的。行,那咱就再来一段内容,让内容更炫实,更丰富一些。这里的段落内容换行,也是大家经常寻找的答案,我写好了,拿走不谢。好了,别只顾兴奋了,咱还得继续搬砖。

from reportlab.pdfbase import pdfmetrics

from reportlab.pdfbase.ttfonts import TTFont

from reportlab.platypus import SimpleDocTemplate, Paragraph

from reportlab.lib.pagesizes import letter

from reportlab.lib.styles import getSampleStyleSheet

from reportlab.lib import colors

# 注册字体

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

class Graphs:

def __init__(self):

# 绘制标题

@staticmethod

def draw_title():

style = getSampleStyleSheet()

ct = style['Normal']

ct.fontName = 'SimSun'

ct.fontSize = 18

# 设置行距

ct.leading = 50

ct.textColor = colors.green

ct.alignment = 1

# 添加标题并居中

title = Paragraph('程序员的兴趣调查报告', ct)

return title

# 绘制内容

@staticmethod

def draw_text():

style = getSampleStyleSheet()

# 常规字体(非粗体或斜体)

ct = style['Normal']

# 使用的字体s

ct.fontName = 'SimSun'

ct.fontSize = 14

# 设置自动换行

ct.wordWrap = 'CJK'

# 居左对齐

ct.alignment = 0

# 第一行开头空格

ct.firstLineIndent = 32

# 设置行距

ct.leading = 30

text = Paragraph('程序员,是互联网、移动互联网和即将到来的物联网时期的弄潮儿。这群特立独行的人才,不知平时最喜欢什么?他们的兴趣真想让人一探究竟。经过七七49天的调研,终于形成了一份不具备权威性的统计报告,现公布给大家。', ct)

return text

if __name__ == "__main__":

content = list()

# 添加标题

content.append(Graphs.draw_title())

# 添加段落

content.append(Graphs. draw_text ())

# 生成pdf文件

doc = SimpleDocTemplate('report.pdf', pagesize=letter)

doc.build(content)

本文档是 ReportLab PDF 库的简介。 这是一个软件库,可让您直接使用Python编程语言创建Adobe的可移植文档格式(Portable DocumentFormat)( PDF )文档。它同样支持创建图表和数据图形各种位图和矢量格式。 ReportLab 库根据您的图形命令直接创建 PDF 。 没有干预步骤。 预期 ReportLab 库至少在以下情况下有用: • 网络上动态生成 PDF . • 大批量公司报告和数据库发布. • 用于其他应用程序的可嵌入打印引擎,包括“报告语言”,以便用户可以自定义自己的报告。 这尤其适用于跨平台应用程序,这些应用程序不能依赖每个 操作 系统上一致的打印或预览API。 • 具有图表,表格的复杂文档的“构建系统” 和文字,例如管理帐户,统计报告和科学论文 • 从XML到 PDF 的一步 Django 利用 reportlab 生成中文 PDF Django 可以通过 reportlab 生成 pdf ,并以附件的形式返回给客户端,但是 reportlab 生成中文的 pdf 还需要字体和 换行 的设置。具体例子如下: #!/usr/bin/python # -*- coding:utf-8 -*- from django.http import HttpResponse ReportLab 有一个简洁的概念,它们称为PLATYPUS,代表“使用脚本的页面布局和版式”。 这是 ReportLab 提供的高级布局库,它使使用最少的代码以编程方式创建复杂的布局变得更加容易。 您可以认为PLATYPUS类似于SQLALchemy和SQL。 它基本上为您处理分页,布局和样式。 实际上,您可以通过应用模板来使文档“主题化”。 ReportLab 工程师将PLATYPUS描述为具有多个层次(从最高层到最低层): DocTemplates-页 ReportLab 工具包支持向 PDF 文件 中添加许多不同的图表。事实上,我在前一篇文章中已经介绍了其中的一些。然而,我所见过的大多数示例,包括我自己的文章中的示例,都没有显示如何将图表插入为一个Flowable(工作流)。这意味着大多数示例都向您展示了如何创建一个包含图表的单页 PDF 。大多数开发人员都希望能够创建一些文本,也许是一个表,并将图表和这些元素一起插入其中。您通常也会在图表后面添加额外的文... 单栏页面对象frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')# 双栏页面对象frame1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width / 2 - 6, doc.height - doc.bottomMargin, id='col1')pie.strokeColor = colors.white # 整体饼图边界的颜色。 诀窍是先缩放 reportlab 的画布,然后再将图像绘制到画布上。它似乎无法正确地从 文件 中获取DPI信息。在下面的示例代码对于我的激光打印机非常适用:from PIL import Image, ImageDraw, ImageFontimport reportlab . pdf gen.canvasfrom reportlab .lib.units import mm# Create an image w... Generating PDF s from Wall Street to Wikipedia We build solutions to generate rich, attrac