Как расположить таблицу 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.
- Простое пошаговое руководство по Reportlab
- Таблицы Reportlab - Создание таблиц в PDF с помощью Python
Большое спасибо, Майк!