Рубрики
Без рубрики

Простой пошаговый учебник ReportLab

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Субтитры для этой статьи могут быть легко «как создавать PDFS с Python», но WordPress не поддерживает это. В любом случае, премьер-министика PDF в Python является ReportLab Отказ Он не распространяется с этой стандартной библиотекой, поэтому вам нужно будет загрузить ее, если вы хотите запустить примеры в этом руководстве. Также будет как минимум один пример того, как поставить изображение в PDF, что означает, что вам также понадобится Пакет подушек (Pil).

Хотите узнать больше о работе с PDFS в Python? Затем проверьте мою книгу: REPORTLAB: PDF Обработка с покупкой Python Now на ScenPub

Монтаж

REPORTLAB поддерживает большую часть нормальных методов установки Python. Для старого ReportLab 2.x Версии У вас есть возможность загрузки источника и запустить «Установить Python Setup.py» или запустить двоичный установщик (в Windows).

Для нового ReportLab 3.x Теперь вы можете использовать PIP на всех платформах:

PIP Установить ReportLab.

Обратите внимание, что ReportLab 3.x поддерживает только Python 2.7 и Python 3.3+ Отказ Если вы находитесь на более старой версии Python 2, то вам нужно использовать ReportLab 2.x.

Создание простого PDF

ReportLab имеет достойную документацию. То, что я подразумеваю в том, что документация дает вам достаточно, чтобы начать, но когда вы найдете что-то слегка сложное, вы получаете его самостоятельно. Совсем недавно они добавили Кодовые фрагменты Раздел на их веб-сайт, который надеюсь, станет книгой рецептуры крутых советов и хитростей, а также поможет улучшить эту проблему. Но достаточно об этом. Давайте посмотрим, как на самом деле что-то создать!

В ReportLab, самый низкий уровень компонента, который используется регулярно, является холст объект из pdfgen упаковка. Функции в этом пакете позволяют вам «покрасить» документ с вашим текстом, изображениями, линиями или тому, что. Я слышал, что некоторые люди описывают это как писать в PostScript. Я сомневаюсь, что это действительно плохо. По моему опыту, это на самом деле очень похоже на использование инструментария GUI к классам виджетов в определенных местах. Давайте посмотрим, как работает объект Canvas:

from reportlab.pdfgen import canvas

c = canvas.Canvas("hello.pdf")
c.drawString(100,750,"Welcome to Reportlab!")
c.save()

Вы должны в конечном итоге с PDF, который выглядит что-то подобное:

Первое, что можно заметить об этом коде, заключается в том, что если мы хотим сохранить PDF, нам нужно предоставить имя файла в объект Canvas. Это может быть абсолютный путь или относительный путь. В этом примере он должен создать PDF в том же месте, от которого вы запускаете скрипт. Следующий кусок головоломки – это Drawstring метод. Это будет рисовать текст, куда бы вы ни говорили. При использовании объекта Canvas он начинается в левом нижнем углу страницы, поэтому для этого примера мы сказали это, чтобы нарисовать строку 100 баллов с левого поля и 750 баллов со дна страницы (1/72 дюйма). Вы можете изменить по умолчанию по умолчанию в конструкторе Canvas, передав ноль к снизу вверх Ключевое слово аргумент. Тем не менее, я не совсем уверен, что произойдет, если вы сделаете это, поскольку руководство пользователя ReportLab не ясно в этой теме. Я думаю, что это изменит начальную точку наверху, хотя. Последняя часть в коде выше состоит в том, чтобы сохранить свой PDF.

Это было просто! Вы только что создали действительно простые PDF! Обратите внимание, что размер холста по умолчанию является A4, поэтому, если вы должны быть американскими, вы, вероятно, захотите изменить это на размер буквы. Это легко сделать в ReportLab. Все, что вам нужно сделать, это следующее:

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

canvas = canvas.Canvas('myfile.pdf', pagesize=letter)
width, height = letter

Основная причина взять на себя ширину и высоту состоит в том, что вы можете использовать их для расчетов, чтобы решить, когда добавить разрыв страницы или помочь определить маржу. Давайте посмотрим на конструктор для объекта Canvas, чтобы увидеть, какие еще есть другие варианты:

def __init__(self,filename,
    pagesize=letter,
    bottomup = 1,
    pageCompression=0,
    encoding=rl_config.defaultEncoding,
    verbosity=0
    encrypt=None):

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

Теперь давайте сделаем что-то немного более сложное и полезное.

Немного формы, маленькая функция

В этом примере мы создадим частичную форму печати. Насколько я могу сказать, ReportLab не поддерживает заполняемые формы, которые были добавлены в Adobe Products несколько лет назад. Во всяком случае, давайте посмотрим на какой-нибудь код!

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

canvas = canvas.Canvas("form.pdf", pagesize=letter)
canvas.setLineWidth(.3)
canvas.setFont('Helvetica', 12)

canvas.drawString(30,750,'OFFICIAL COMMUNIQUE')
canvas.drawString(30,735,'OF ACME INDUSTRIES')
canvas.drawString(500,750,"12/12/2010")
canvas.line(480,747,580,747)

canvas.drawString(275,725,'AMOUNT OWED:')
canvas.drawString(500,725,"$1,000.00")
canvas.line(378,723,580,723)

canvas.drawString(30,703,'RECEIVED BY:')
canvas.line(120,700,580,700)
canvas.drawString(120,703,"JOHN DOE")

canvas.save()

Это основано на фактической квитанции, которую я создал на работе. Основное отличие между этим и предыдущим примером является Canvas.line код. Вы можете использовать его, чтобы нарисовать строки в ваших документах, передав два пара X/Y. Я использовал эту функциональность для создания решеток, хотя это довольно утомительно. Другие достопримечательности в этом коде включают команду setlinewidth (.3), которая сообщает ReportLab, насколько толстые или тонкие линии должны быть; И команда SetFont (Helvetica ‘, 12), которая позволяет указывать определенный шрифт и размер точки.

Наш следующий пример построит на то, что мы узнали до сих пор, но также представим нас концепции «Flowables».

Идти с потоком

Если вы в рекламе или сделаете любую работу с формой букв, то REPORTLAB делает отличное дополнение к вашему арсеналу. Мы используем его для создания форм писем для людей, которые имеют просроченные парковки. Следующий пример основан на некоторых коде, который я написал для этого приложения, хотя буква довольно разное. (Обратите внимание, что код ниже не будет работать без библиотеки Python Imaging)

import time
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

doc = SimpleDocTemplate("form_letter.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18)
Story=[]
logo = "python_logo.png"
magName = "Pythonista"
issueNum = 12
subPrice = "99.00"
limitedDate = "03/05/2010"
freeGift = "tin foil hat"

formatted_time = time.ctime()
full_name = "Mike Driscoll"
address_parts = ["411 State St.", "Marshalltown, IA 50158"]

im = Image(logo, 2*inch, 2*inch)
Story.append(im)

styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
ptext = '%s' % formatted_time

Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))

# Create return address
ptext = '%s' % full_name
Story.append(Paragraph(ptext, styles["Normal"]))       
for part in address_parts:
    ptext = '%s' % part.strip()
    Story.append(Paragraph(ptext, styles["Normal"]))   

Story.append(Spacer(1, 12))
ptext = 'Dear %s:' % full_name.split()[0].strip()
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))

ptext = 'We would like to welcome you to our subscriber base for %s Magazine! \
        You will receive %s issues at the excellent introductory price of $%s. Please respond by\
        %s to start receiving your subscription and get the following free gift: %s.' % (magName, 
                                                                                                issueNum,
                                                                                                subPrice,
                                                                                                limitedDate,
                                                                                                freeGift)
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))


ptext = 'Thank you very much and we look forward to serving you.'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
ptext = 'Sincerely,'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 48))
ptext = 'Ima Sucker'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
doc.build(Story)

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

Первая часть, на которой нам нужно посмотреть, являются новый импорт:

from reportlab.lib.enums import TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

От enums, мы импортируем «ta_justify», что позволяет нашим строкам иметь оправдано формат. Есть несколько других констант, которые мы могли бы импортировать, что позволит нам правильно или оставить оправдать наш текст и делать другие забавные вещи. Далее является утконос (который обозначает макет страницы и типографии, используя сценарии) модуль. Он содержит много модулей, но, вероятно, наиболее важными из них являются стойки, такие как пункт. Flowbable обычно имеет следующие способности: обернуть , рисовать И иногда Сплит Отказ Они используются, чтобы сделать письменные пункты, таблицы и другие конструкции на нескольких страницах легче сделать.

Класс SimpledoCteMate позволяет нам настроить поля, размер страницы, имени файла и кучу других настроек для нашего документа все в одном месте. Spacer хорош для добавления линейки пустого пространства, как нарушение абзаца. Класс Image использует библиотеку изображений Python, чтобы обеспечить легкую вставку и манипулирование изображений в вашем PDF.

GetsamplestyLesHeet получает набор стилей по умолчанию, которые мы можем использовать в нашем PDF. Параграф используется для установки текстового выравнивания нашего абзаца в этом примере, но он может сделать гораздо больше, чем (см. Page 67 Руководства пользователя). Наконец, дюйма это единица измерения, чтобы помочь в позиционировании элементов на вашем PDF. Вы можете увидеть это в действии, где мы позиционируем логотип: изображение (логотип, 2 * дюйм, 2 * дюйма). Это означает, что логотип будет два дюйма сверху и два дюйма слева.

Я не вспоминаю причину, почему примеры ReportLab используют список историй, но вот как мы также сделаем это здесь. В основном вы создаете линию текста, таблицу и изображения или что-то еще и добавьте его в список историй. Вы увидите это на протяжении всего примера. Первый раз, когда мы используем это, когда мы добавляем изображение. Прежде чем мы посмотрим на следующий экземпляр, нам нужно будет посмотреть, как мы добавляем стиль к нашему объекту стилей:

styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))

Причина, по которой это важно, заключается в том, что вы можете использовать список стилей для применения различных параметров выравнивания абзаца (и более) для текста в вашем документе. В вышеуказанном коде мы создаем абзатический стиль под названием «Оправдание». Все это оправдывает наш текст. Вы увидите пример этого позже в тексте. На данный момент давайте посмотрим на быстрый пример:

ptext = '%s' % formatted_time
Story.append(Paragraph(ptext, styles["Normal"]))

Для нашей первой строки текста мы используем класс абзаца. Как видите, класс абзаца принимает некоторые HTML-похожие на теги. В этом случае мы устанавливаем размер точки шрифта до 12 и используйте нормальный стиль (который выровнен, среди прочего). Остальная часть примера в значительной степени то же самое, просто с проставками, брошенными здесь и там. В конце мы называем doc.build создать документ.

Обертывание

Теперь вы знаете основы для создания PDFS в Python с помощью REPORTLAB. Мы даже не поцарапали поверхность того, что все, что вы можете сделать с ReportLab, хотя. Некоторые примеры включают в себя таблицы, графики, пагинальные, цветные поверхности, гиперссылки, графика и многое другое. Я настоятельно рекомендую вам загружать модуль вместе с его руководством пользователя и попробовать!

Дальнейшее чтение