Как расположить таблицу Reportlab на Python в позиции 10,100 и использовать drawString

Я начинающий любитель питонов и репортер.
Я знаю, как использовать drawString для размещения текста в определенном месте на странице, например: c.drawString(10 100,"Добро пожаловать в Reportlab!")

Но я не могу понять, как разместить таблицу (которая будет состоять всего из нескольких строк), чтобы таблица начиналась с той же позиции, что и c.drawString (10 100,"Welcome to Reportlab!"), Которую я буду место в другом месте, если я узнаю, как поставить стол вместо этого.

Я также не могу понять, как использовать drawString в том же сценарии, поскольку использование canvas - единственный способ, которым я знаю, как использовать функцию drawString. Мои 4 строки кода холста (после этого параграфа) закроют холст / файл и создадут PDF. Код таблицы (ниже) также закрывает файл и создает PDF, и я не вижу, как использовать строку "doc.build(elements)", чтобы закрыть холст, который я использую для операций drawString.

c = canvas.Canvas(r"e:\hellonu.pdf", pagesize=letter)
c.setFont("Courier", 9) #choose your font type and font size
c.drawString(10,60,"Welcome to Reportlab!")
c.save()

Я был бы признателен за любые рекомендации, которые вы могли бы дать мне (1) о том, как разместить таблицу так, чтобы она начиналась с 10 100, и (2) как использовать drawString в том же скрипте. Если какой-то мой код не делает ничего полезного, пожалуйста, не думайте, что я поместил его там намеренно; Я попытался скопировать достаточно примеров, чтобы в моей таблице функционировала перенос по словам.

Вот код, с которым я играл:

# http://zewaren.net/site/node/139
from reportlab.lib import colors
from reportlab.lib.pagesizes import LETTER, inch, portrait
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet


doc = SimpleDocTemplate(r"e:\test_report_lab.pdf", pagesize=LETTER, rightMargin=30,leftMargin=30, topMargin=30,bottomMargin=18)
doc.pagesize = portrait(LETTER)
elements = []


data = [
["Directory"],
["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "],
]


style = TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'),
                       ('TEXTCOLOR',(1,1),(-2,-2),colors.red),
                       ('VALIGN',(0,0),(0,-1),'TOP'),
                       ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                       ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                       ])

#Configure style and word wrap
s = getSampleStyleSheet()
s = s["BodyText"]
s.wordWrap = 'CJK'
data2 = [[Paragraph(cell, s) for cell in row] for row in data]
t=Table(data2)
t.setStyle(style)


#Send the data and build the file
elements.append(t)
doc.build(elements)

1 ответ

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

Я нашел решение благодаря этому замечательному учебнику, написанному Майком Дрисколлом: "Reportlab: Смешивание фиксированного контента и Flowables".

Вот немного адаптированная версия, которая составляет рабочий фрагмент:

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.platypus import Image, Paragraph, Table
from reportlab.lib import colors

c = canvas.Canvas('example.pdf', pagesize=A4)  # alternatively use bottomup=False
width, height = A4

data = [[1, 2, 3], [2, 1, 3], [3, 2, 1]]

table = Table(data, colWidths=10*mm)
table.setStyle([("VALIGN", (0,0), (-1,-1), "MIDDLE"),
                ("ALIGN", (0,0), (-1,-1), "CENTER"),
                ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black)])

table.wrapOn(c, width, height)
table.drawOn(c, 0*mm, 5*mm)

styles = getSampleStyleSheet()    
ptext = "This is an example."
p = Paragraph(ptext, style=styles["Normal"])
p.wrapOn(c, 50*mm, 50*mm)  # size of 'textbox' for linebreaks etc.
p.drawOn(c, 0*mm, 0*mm)    # position of text / where to draw

c.save()

Я также могу порекомендовать еще два урока Майка Дрисколла, которые позволили мне быстро ознакомиться с reportlab.

Большое спасибо, Майк!

Другие вопросы по тегам