如何在reportlab.pdfgen中更改文本/字体颜色

34

我想在自动生成的PDF中使用不同颜色的文本。

根据reportlab文档,我只需要:

self.canvas.setFillColorRGB(255,0,0)
self.canvas.drawCentredString(...)

但是那样并没有起到作用。无论如何,文本的颜色都是黑色。

4个回答

55

如果你复制并粘贴用户指南第二部分中的代码,你将获得一个彩色的矩形,并带有彩色文本。可能在用户指南中这种方法不是那么清晰,我花了一些时间去尝试它,最终我知道它是如何工作的。

你需要想象自己在画一个画布。你需要在开始画之前完成所有的设置。下面是我准备的一个示例,以更好地展示如何样式化文本、绘制线条和矩形,并具有对它们进行着色的功能。

from reportlab.pdfgen import canvas

def hello(c):
    from reportlab.lib.units import inch

    #First Example
    c.setFillColorRGB(1,0,0) #choose your font colour
    c.setFont("Helvetica", 30) #choose your font type and font size
    c.drawString(100,100,"Hello World") # write your text

    #Second Example
    c.setStrokeColorRGB(0,1,0.3) #choose your line color
    c.line(2,2,2*inch,2*inch)

    #Third Example
    c.setFillColorRGB(1,1,0) #choose fill colour
    c.rect(4*inch,4*inch,2*inch,3*inch, fill=1) #draw rectangle

c = canvas.Canvas("hello.pdf")

hello(c)
c.showPage()
c.save()

25
据我所知,使用256色空间是不可行的。手册指出使用1表示"所有灯都全亮"。因此,创建256、256、256实际上是使用(1,1,1)完成的。因此,要想得到中间值,就必须使用小数。对于我来说,我想要RGB:(75,116,156),所以我必须写成:setFillColorRGB(0.29296875,0.453125,0.609375)。这相当于75/256, 116/256, 156/256。在我看来,这有点荒谬,但结果完美无缺。 - Garfonzo
1
这确实有效!但是当我设置一些不同的颜色时,文本似乎变得透明了... - gbrennon
1
@gbrennon,这只是全白。您必须将RGB作为三个浮点数传递到范围[0,1]中。当您传递超过1的数字时,它们不会引发任何错误,只会使用1(min(1,passed_color_value))。 - Ctrl-C
1
注意:registerFont需要在Windows 7 + Python 2.7中使用,才能使此答案起作用。 - Basj

23
from reportlab.lib.colors import HexColor
...

# sets fill color like orange
c.setFillColor(HexColor(0xff8100))
# or 
c.setFillColor(HexColor('#ff8100'))

...

0

目前我无法验证这一点,但如果您查看链接的示例,每当他们在调用drawCenteredString之前设置颜色时,他们总是使用setFillColor而不是setFillColorRGB,只使用后者来设置矩形的颜色。因此,请尝试改为

self.canvas.setFillColor(red)
self.canvas.drawCenteredString(...)

我不知道那个文档里是否有这样说,但变量red在ReportLab模块中被定义为常量,所以如果你遇到任何错误,请确保包含适当的模块(目前我不记得具体名称)。

setFillColor() 对于文本也无法起到作用。 - Goro
那么我猜测这个例子是不正确的。在文档中查看,在用户指南第2.11节中给出了设置文本颜色的示例。您能否设置除文本以外的其他内容的颜色?如果不能,也许这是一个更普遍的问题,无法输出颜色。 - Gordon Seidoh Worley

0

虽然这个问题有点老了(!),但我相信我对于像我一样有同样问题的人有积极的贡献。

除了setFillColorRGB()函数外,您还可以使用setFillColor(),它将颜色名称作为参数(作为Python变量,而不是字符串)。

我想用红色写一个字符串。然后我做了:

setFillColor(red)

它起作用了。

reportlab.lib.colors模块有一个巨大的颜色名称列表可供使用。请参见532至681行。因此,在这种情况下,我在脚本开头放置了

from reportlab.lib.colors import red

希望这可以帮助到您。

此答案是从我的母语葡萄牙语机器翻译成英语的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接