Как изменить цвет текста/шрифта в reportlab.pdfgen

Я хочу использовать другой цвет текста в моем автогенерированном PDF файле.

Согласно документу reportlab, все, что мне нужно сделать, это:

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

Но это ничего не делает. Текст черный, несмотря ни на что.

Ответ 1

Если вы скопируете и вставьте код в раздел "Руководство пользователя раздела 2.", вы получите привлекательный цветной прямоугольник с цветным текстом внутри него. Вероятно, подход не так понятен в руководстве пользователя, я провел некоторое время, играя с ним, и я, наконец, знаю, как это работает.

Вам нужно представить себе рисунок холста. Перед тем, как рисовать, вам нужно выполнить все настройки. Ниже приведен пример, который я хотел бы лучше показать, как стилизовать текст, нарисовать линию и нарисовать прямоугольник, все с возможностью нанести на них цвет.

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()

Ответ 2

from reportlab.lib.colors import HexColor
...

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

...

Ответ 3

Я не могу проверить это на данный момент, но если вы посмотрите в связанном примере, когда они устанавливают цвет перед вызовом drawCenteredString они всегда делают это с помощью setFillColor, никогда не setFillColorRGB, только используя последнее, чтобы установить цвет прямоугольников. Попробуйте вместо этого изменить его на

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

Я не знаю, говорит ли он об этом в этом документе или нет, но переменная red определяется как константа в одном из модулей ReportLab, поэтому, если у вас есть какие-либо ошибки, просто включите соответствующий модуль ( точное имя ускользает от меня в данный момент).