Это набросок моего решения, код находится в нижней части:
Page 1 - Название - большой текст горизонтально по центру, и логотип чуть ниже и по центру по горизонтали: (Примечание: в коде перепутаны позиции - логотип является первым.)
- Пункт для текста.
- Объект изображения для логотипа.
- Вставьте оба элемента в объект таблицы с двумя строками и одним столбцом.
- нарисовать таблицу на странице 1
- использовать SHOWPAGE(), чтобы перейти на 2-й странице
Страница 2 - Передняя часть карты 1, изображение по центру в горизонтальном направлении, немного выше центра по вертикали, мелкий текст ниже изображения (как надпись).
- То же, что и на странице 1, используя соответствующий контент.
Страница 3 - Задняя часть карты 1, большой текст по центру по горизонтали и по вертикали на странице
- Пункт для текста
- Вставка пункт в таблицу с 1 строки и 1 столбца
- Вставка таблицы в кадр
Page 4 (такой же, как страницы 2 с различным содержанием)
Page 5 (аналогично странице 3 с различным контентом) - повторите по мере необходимости.
В проекте Django было использовано следующее: вид внизу.
class fcMaker(object):
""""""
def __init__(self, response):
self.PAGE_SIZE = (2.75*inch, 3.75*inch)
self.c = canvas.Canvas(response, pagesize=self.PAGE_SIZE)
self.styles = style
self.width, self.height = self.PAGE_SIZE
def createDocument(self):
""""""
# Title Page
title = """Title goes here"""
p = Paragraph(title, styleH)
logo = Image("my_cool_logo.jpg")
logo.drawHeight = 99
logo.drawWidth = 99
data = [[logo], [p]]
table = Table(data, colWidths=2.25*inch)
table.setStyle([("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("TOPPADDING", (0, 0), (-1, -1), 20)])
table.wrapOn(self.c, self.width, self.height)
table.drawOn(self.c, *self.coord(.25, 2.75, inch))
self.c.showPage()
#Page Two
side1_text = """Text goes here"""
p = Paragraph(side1_text, styleF)
side1_image = Image("first_image.jpg")
side1_image.drawHeight = 99
side1_image.drawWidth = 99
data = [[side1_image], [p]]
table = Table(data, colWidths=2.25*inch)
table.setStyle([("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("TOPPADDING", (0, 0), (-1, -1), 3)])
table.wrapOn(self.c, self.width, self.height)
table.drawOn(self.c, *self.coord(.25, 2.75, inch))
self.c.showPage()
#Page Three
side2_text = """<font size = '14'>This is where and how the main text will appear on the rear of this card.
</font>"""
p_side2 = Paragraph(side2_text, styleH)
data = [[p_side2]]
table_side2 = Table(data, colWidths=2.25*inch, rowHeights=2.55*inch)
table_side2.setStyle([("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOX", (0, 0), (-1,-1), 0.25, colors.red)])
front_page = []
front_page.append(table_side2)
f = Frame(inch*.25, inch*.5, self.width-.5*inch, self.height-1*inch, showBoundary=1)
f.addFromList(front_page, self.c)
def coord(self, x, y, unit=1):
"""
Helper class to help position flowables in Canvas objects
"""
x, y = x * unit, self.height - y * unit
return x, y
def savePDF(self):
""""""
self.c.save()
def fc_maker_view(request):
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="pdf1.pdf"'
doc = fcMaker(response)
doc.createDocument()
doc.savePDF()
return response
Шляпы к Майку Дрисколу, его сообщение в блоге, в котором я начал, и некоторые советы, которые он поделил со мной. http://www.blog.pythonlibrary.org/2012/06/27/reportlab-mixing-fixed-content-and-flowables/
Я признаю, что это не самый большой вопрос в отношении SO, но мне трудно найти документацию для оказания помощи. – Steve
Есть буквально сотни способов, которыми вы могли бы приблизиться к этому. Класс, который обертывает функциональность reportlab, вспомогательные функции, модуль или даже некоторые плоские функции, вы передаете экземпляр документа, который обрабатывает добавление частей в порядок. Это далеко, слишком широко для значимого ответа в его нынешнем виде. –