2014-10-14 5 views
-2

Я хотел бы создать PDF-файл для печати - карточки что-то вроде:ReportLab PDF макет руководство

  • Page 1 - Название - большой текст по центру по горизонтали, и логотип немного ниже и по центру по горизонтали.
  • Page 2 - Передняя часть карты 1, изображение по центру горизонтально, чуть выше центра по вертикали, небольшой текст под изображением (например, надпись).
  • Страница 3 - Задняя часть карты 1, большой текст по центру по горизонтали и по вертикали на странице
  • Страница 4 (такой же, как страницы 2 с различным содержанием)
  • Page 5 (такой же, как страницы 3 с различным содержанием)
  • и так далее до конца карт.
  • Я также может иметь статическое содержимое колонтитула, который печатает на каждой карточке

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

Что такое питонический подход к этому макету? Или что такое эффективная структура?

EDIT: Как GDDC прокомментировал вопрос слишком широк - это точно мой вопрос - как новичок в отчетах. Я поражен способами приблизиться к тому, что кажется простым макетом. Может ли кто-нибудь предложить хорошую структуру, используя PLATYPUS? Таблицы? Пункты? Рамки? ???

Спасибо.

+0

Я признаю, что это не самый большой вопрос в отношении SO, но мне трудно найти документацию для оказания помощи. – Steve

+1

Есть буквально сотни способов, которыми вы могли бы приблизиться к этому. Класс, который обертывает функциональность reportlab, вспомогательные функции, модуль или даже некоторые плоские функции, вы передаете экземпляр документа, который обрабатывает добавление частей в порядок. Это далеко, слишком широко для значимого ответа в его нынешнем виде. –

ответ

1

Это набросок моего решения, код находится в нижней части:

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/

+1

Рад, что я могу помочь! –

Смежные вопросы