Правильно ли использовать мой подход для репликации этой формы с помощью Reportlab? - PullRequest
1 голос
/ 29 апреля 2010

Мне нужно сгенерировать форму, показанную здесь, используя Python / reportlab.

http://www.flickr.com/photos/49740282@N06/4563137758/sizes/o/

Я пытаюсь сделать это путем создания настраиваемого потока для заголовка вверху (с нарисованными прямоугольниками), а затем создания таблицы для таблицы украшений ниже. То, что показано как таблица JEWELRY для этого примера, может быть несколькими таблицами. У меня возникли проблемы с получением моего нарисованного заголовка в "потоке". Он рисуется, но затем мои данные таблицы накладываются на него, а не появляются под ним.

Это мой первый проект с reportlab. Прежде чем я действительно начну отлаживать это, я хотел бы узнать от кого-то с опытом reportlab, является ли мой подход правильным здесь. Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 июня 2010

Я не вижу необходимости в нестандартной текучести здесь.

Вы можете просто использовать таблицы (и стили таблиц) для создания "заголовка".

Другое простое решение, если вам нужен какой-то необычный фон, - это нарисовать изображение (например, JPG), а затем нарисовать переменные строки поверх него.

0 голосов
/ 23 апреля 2012

Я согласен с Дугрес, что вам не требуется никакой пригодной для текучести для этой конкретной формы, показанной на flickr. Вы можете просто использовать Table и TableStyle, чтобы выполнить свою работу.

Что нужно учесть, прежде чем вы начнете углубляться в reportlab, это то, что ваша таблица не будет слишком длинной, чтобы перейти на следующую страницу. Тогда табличный стиль потребует ручного редактирования. Ячейки SPAN в таблице на следующей странице вернут ошибку. Но для одностраничного решения хорошим вариантом является reportpdf.

Для фантастического вывода, хороший графический эффект. Вам нужно будет делать то, что предложил Дугрес.

Для кода кикстарта при разработке таблицы:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
from reportlab.lib import colors

width, height = A4
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER

def coord(x, y, unit=1):
    x, y = x * unit, height -  y * unit
    return x, y

# Headers
hdescrpcion = Paragraph('''<b>descrpcion</b>''', styleBH)
hpartida = Paragraph('''<b>partida</b>''', styleBH)
hcandidad = Paragraph('''<b>candidad</b>''', styleBH)
hprecio_unitario = Paragraph('''<b>precio_unitario</b>''', styleBH)
hprecio_total = Paragraph('''<b>precio_total</b>''', styleBH)

# Texts
descrpcion = Paragraph('long paragraph', styleBH)
partida = Paragraph('1', styleN)
candidad = Paragraph('120', styleN)
precio_unitario = Paragraph('$52.00', styleN)
precio_total = Paragraph('$6240.00', styleN)

data= [[hdescrpcion, hcandidad,hcandidad, hprecio_unitario, hprecio_total],
       [partida, candidad, descrpcion, precio_unitario, precio_total]]

table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm,
                               3* cm, 3 * cm])

table.setStyle(TableStyle([
                       ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                       ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                       ]))

c = canvas.Canvas("a.pdf", pagesize=A4)
table.wrapOn(c, width, height)
table.drawOn(c, *coord(1.8, 9.6, cm))
c.save()
0 голосов
/ 25 июня 2010

Я не могу помочь вам с reportlab, потому что я не очень опытный пользователь (я оставил идею использовать его после некоторых проблем, которые сводили меня с ума :)). Но если вы решите использовать какой-то другой инструмент для генерации вашего pdf в python, я бы посоветовал вам взглянуть на xhtml2pdf - это может быть хорошим вариантом, если вы не заходите слишком далеко с reportlab. Если вы знакомы с HTML, это может быть проще для вас. Идея здесь проста: он преобразует HTML, который вы предоставляете в PDF-файл. Конечно, вам нужно как-то сгенерировать html-код (для этого я использую шаблоны django).

...