[reportlab教程](1) – 第一个Hello, reportlab的例子

本文介绍了使用ReportLab生成PDF的基本步骤,通过一个简单的Hello, ReportLab示例,展示了如何创建和保存PDF文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天都在学习 ReportLab 这个优秀的生成 PDF 的软件包,特别是它的使用手册也都是使用自身的模块生成的,效果很让我满意,因此这段时间也许会把精力放在 PDF 文档生成上面。因此也希望写一个入门的教程方便大家同我一起学习。这就是写本教程的起因。由于有些东西是边学边写很可能会有错误,希望大家帮助我改正。那么学习的目的就是希望可以写出象 ReportLab 的用户手册一样效果的文档,并且希望尽可能的方便。

安装很简单,大家只要下载最新的 1.20 包即可。如果需要处理更多的图像格式还应该下载 PIL 软件包。这块就不细说了。

那么下面开始我们的学习,首先还是从写一个最简单的Hello, World开始,当然这里把Word改为 reportlab 了。

先看代码吧。

from reportlab.pdfgen import canvas
def hello(c):
    c.drawString(100,100,"Hello, ReportLab")
c = canvas.Canvas("hello.pdf")
hello(c)
c.showPage()
c.save()

这段代码是从用户手册改造而来。它的运行结果就是在你的当前目录生成一个hello.pdf的文件,打开它你会看到只有一页的内容,而"Hello, ReportLab"是显示在页面的左下角的。下面解释一下。

使用 ReportLab 来生成 PDF 你可以认为就象是在画图一样,因此第一行从pdfgen中导入了canvas,准备开始绘画。

hello方法是简单地调用Canvas的方法在指定的起始坐标来绘制文本。要注意,在 ReportLab 中坐标的原点缺省是在页面的左下角。因此最后的效果是在页面的左下角。这一点要注意。

第4行生成一个Canvas对象,它指定一个文件名,那么最终的结果将存放在这个文件中。在Canvas的构造方法中还有一些缺省值,比如纸张的大小缺省为A4纸等,现在我们不去关心它,一切从最简单开始。

第6行可以产生一个分页。但由于后面没有更多的输出了,因此它并不起作用。你可以在它的后面再加一个hello(c)的语句,看一看是不是变成两页了。

最后一行很重要,它会将内容保存到文件中。因此如果忘记掉用了,你什么也得不到。

这个例子很简单,但你也许已经注意到了,如果我想生成的是长篇的文档,让我象画画一样来生成不是太难了吗?的确是这样,但这里只是基本的介绍一下使用,ReportLab 已经为了想好了,它有更方便的东西供你使用,可以让你从一个更高的起点开始。但是需要注意,一些相对低层的东西可以实现一些绘图之类的东西,在你的 PDF 上作画也是一个很有趣的事情。

下一篇我将介绍使用文档布局的一个最简单的例子。

转自: http://blog.donews.com/limodou/archive/2005/08/21/520059.aspx
<think>好的,用户遇到了在ReportLab的Paragraph中使用InlineImage图片不显示的问题。我需要仔细分析可能的原因,并提供解决方案。首先,根据用户提供的引用内容,特别是引用[4],里面提到Paragraph支持XML标签和格式设置,可能InlineImage需要特定的标签或语法。 可能的原因有几个:首先,图片路径是否正确,如果路径错误,图片无法加载。其次,图片格式是否受支持。根据引用[1],ReportLab默认支持JPEG,其他格式需要Pillow库。用户可能没有安装Pillow,导致PNG等格式无法显示。第三,InlineImage的语法是否正确,比如是否正确使用了<img>标签,并且指定了正确的src属性,可能还需要指定width和height。引用[5]中提到样式的合并,可能用户没有正确设置图片的样式参数,比如尺寸单位是否正确。 解决方案方面,首先检查路径和格式,确保安装了Pillow。然后,确认在Paragraph文本中正确使用<img>标签,并指定src、width和height属性。同时,需要确保在构建文档时将图像路径添加到搜索路径中,或者使用绝对路径。另外,可能需要调整样式,比如行高,避免图片被截断。引用[2]中提到导出图片的例子,可能用户需要确认图片是否被正确导出或存在。 最后,可能需要代码示例来演示正确的使用方法,比如如何导入InlineImage,设置路径,并在Paragraph中使用标签。同时提醒用户注意单位的使用,比如使用cm或inch,而不是像素,因为ReportLab使用点作为单位。可能还需要检查是否在生成PDF时添加了Paragraph到文档流中,否则内容不会显示。</think>在 ReportLab 的 Paragraph 中使用 `InlineImage` 图片不显示的原因及解决方案如下: --- ### **可能原因分析** 1. **图片路径或格式问题** - ReportLab 默认仅支持 JPEG 格式,若未安装 Pillow 库,则无法解析 PNG、GIF 等格式[^1] - 图片路径未正确传递给 `InlineImage`,或未通过 `doc.build()` 的 `canvasmaker` 参数指定图像搜索路径[^2] 2. **XML 标签语法错误** - 在 Paragraph 文本中未正确使用 `<img>` 标签,或未闭合标签[^4] - 未通过 `src` 属性指定图片名称,或未设置 `width`/`height` 属性[^4] 3. **样式冲突或布局问题** - 段落样式(如 `leading` 行高)过小,导致图片被截断[^5] - 图片尺寸未按点(point)或兼容单位(如 `cm`)定义,导致比例异常[^1] --- ### **解决方案** #### 1. 基础配置检查 ```python # 确保已安装 Pillow 以支持多格式 from reportlab.platypus import Image, InlineImage from reportlab.lib.units import cm # 图片路径需可访问,或在 doc.build() 中指定搜索路径 doc = SimpleDocTemplate("output.pdf", pagesize=letter) story = [] ``` #### 2. 正确使用 InlineImage ```python # 定义图片对象并指定尺寸(单位需明确) img = InlineImage("test.png", width=5*cm, height=3*cm) # 在 Paragraph 中通过 <img> 标签引用 text = ''' <para leading=20> Hello <img src="test.png" width="5cm" height="3cm"/> World </para> ''' paragraph = Paragraph(text, style=stylesheet["Normal"]) story.append(paragraph) doc.build(story) ``` #### 3. 关键注意事项 - **标签闭合**:确保 `<img>` 标签闭合,例如 `<img .../>` - **单位明确**:使用 `cm`、`inch` 或 `pt` 单位,避免纯数字(默认单位为点) - **样式兼容**:通过 `getSampleStyleSheet().clone()` 合并样式时,需保留 `allowWidows=0` 等布局参数 - **路径处理**:若图片位于子目录,需通过 `os.path` 构建绝对路径,或在 `doc.build()` 中添加搜索路径 --- ### **示例完整代码** ```python from reportlab.platypus import SimpleDocTemplate, Paragraph, InlineImage from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.units import cm # 初始化文档 doc = SimpleDocTemplate("output.pdf", pagesize=letter) styles = getSampleStyleSheet() story = [] # 定义带图片的段落 text = ''' <para leading=24> <b>示例文本:</b> <img src="logo.png" width="4cm" height="2cm" valign="middle"/> 图片已嵌入 </para> ''' paragraph = Paragraph(text, style=styles["Normal"]) story.append(paragraph) # 构建文档(指定图像搜索路径) doc.build(story, canvasmaker=lambda *args, **kw: Canvas(*args, imageSearchPath=["images/"], **kw)) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值