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

Создание интерактивных форм PDF в ReportLab с Python

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

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

Toolkit ReportLab Toolkit позволяет создавать интерактивные заполняемые формы. Стандарт PDF на самом деле имеет довольно богатый набор интерактивных элементов. REPORTLAB не поддерживает все эти элементы, но это охватывает большинство из них. В этом разделе мы рассмотрим следующие виджеты:

  • флажок
  • радио
  • выбор
  • проступок
  • текстовое поле

Все эти виджеты создаются, вызывая различные методы на Canvas.acroform имущество. Обратите внимание, что вы можете иметь только одну форму на документ. Давайте посмотрим на виджеты, которые ReportLab поддерживает!

Флажок

флажок Виджет именно то, что звучит так. Это маленькая коробка, которую вы можете проверить. REPORTLAB поддерживает несколько различных стилей «проверки», поэтому, когда флажок проверяется, он может выглядеть различным в зависимости от стиля, который вы установили.

Теперь давайте напишем простой пример, который демонстрирует, как ведут себя некоторые из этих аргументов:

# simple_checkboxes.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green

def create_simple_checkboxes():
    c = canvas.Canvas('simple_checkboxes.pdf')
    
    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Pets')
    c.setFont("Courier", 14)
    form = c.acroForm
    
    c.drawString(10, 650, 'Dog:')
    form.checkbox(name='cb1', tooltip='Field cb1',
                  x=110, y=645, buttonStyle='check',
                  borderColor=magenta, fillColor=pink, 
                  textColor=blue, forceBorder=True)
    
    c.drawString(10, 600, 'Cat:')
    form.checkbox(name='cb2', tooltip='Field cb2',
                  x=110, y=595, buttonStyle='cross',
                  borderWidth=2, forceBorder=True)
    
    c.drawString(10, 550, 'Pony:')
    form.checkbox(name='cb3', tooltip='Field cb3',
                  x=110, y=545, buttonStyle='star',
                  borderWidth=1, forceBorder=True)
    
    c.drawString(10, 500, 'Python:')
    form.checkbox(name='cb4', tooltip='Field cb4',
                  x=110, y=495, buttonStyle='circle',
                  borderWidth=3, forceBorder=True)
    
    c.drawString(10, 450, 'Hamster:')
    form.checkbox(name='cb5', tooltip='Field cb5',
                  x=110, y=445, buttonStyle='diamond',
                  borderWidth=None,
                  checked=True,
                  forceBorder=True)
    
    c.save()
    
if __name__ == '__main__':
    create_simple_checkboxes()

Как видите, мы создаем имя и установите всплывающую подсказку в основном сопоставить имя виджета. Затем мы устанавливаем его положение и несколько других вещей. Вы можете играть с шириной границы флажков или выключить границу. Если вы отключите его, флажок может стать невидимым, так что вы можете установить свой цвет фона через FillColor, если вы это сделаете. Я установил кнопку на что-то другое для каждого из флажков. Вот что я получаю, когда я бегу код:

Если вы открываете документ и проверьте все флажки, вы окажетесь с ними выглядеть так:

Теперь давайте узнаем о радио виджете!

Радио

Радио Виджеты виднее, например, флажки, за исключением того, что обычно вы помещаете радиопередачу в группу, где можно выбрать только одну переключательную кнопку. Фуловые ящики редко ограничены, просто позволяя одному флажможному в группу. REPORTLAB, по-видимому, не имеет способа четко группировать набор радиосвязи как совместно. Похоже, это произойдет только неявно. Другими словами, если вы создаете серию радиосвязи один за другим, они будут сгруппированы вместе.

Теперь давайте найму минутку и создаем простую демонстрацию радиоджетных устройств:

# simple_radios.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green

def create_simple_radios():
    c = canvas.Canvas('simple_radios.pdf')
    
    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Radio demo')
    c.setFont("Courier", 14)
    form = c.acroForm
    
    c.drawString(10, 650, 'Dog:')
    form.radio(name='radio1', tooltip='Field radio1',
               value='value1', selected=False,
               x=110, y=645, buttonStyle='check',
               borderStyle='solid', shape='square',
               borderColor=magenta, fillColor=pink, 
               textColor=blue, forceBorder=True)
    form.radio(name='radio1', tooltip='Field radio1',
               value='value2', selected=True,
               x=110, y=645, buttonStyle='check',
               borderStyle='solid', shape='square',
               borderColor=magenta, fillColor=pink, 
               textColor=blue, forceBorder=True)    
    
    c.drawString(10, 600, 'Cat:')
    form.radio(name='radio2', tooltip='Field radio2',
               value='value1', selected=True,
               x=110, y=595, buttonStyle='cross',
               borderStyle='solid', shape='circle',
               borderColor=green, fillColor=blue, 
               borderWidth=2,
               textColor=pink, forceBorder=True)
    form.radio(name='radio2', tooltip='Field radio2',
               value='value2', selected=False,
               x=110, y=595, buttonStyle='cross',
               borderStyle='solid', shape='circle',
               borderColor=green, fillColor=blue, 
               borderWidth=2,
               textColor=pink, forceBorder=True)
    
    c.drawString(10, 550, 'Pony:')
    form.radio(name='radio3', tooltip='Field radio3',
               value='value1', selected=False,
               x=110, y=545, buttonStyle='star',
               borderStyle='bevelled', shape='square',
               borderColor=blue, fillColor=green, 
               borderWidth=2,
               textColor=magenta, forceBorder=False)
    form.radio(name='radio3', tooltip='Field radio3',
               value='value2', selected=True,
               x=110, y=545, buttonStyle='star',
               borderStyle='bevelled', shape='circle',
               borderColor=blue, fillColor=green, 
               borderWidth=2,
               textColor=magenta, forceBorder=True)
   
    c.save()
    
if __name__ == '__main__':
    create_simple_radios()

Когда вы запускаете этот код, вы заметите, что вы получаете только 3 радио. Это потому, что вы обязаны создать два экземпляра каждой кнопки радио с тем же именем, но с разными значениями и разделами. Документация не говорит, почему, но я предполагаю, что это сделано, чтобы помочь ReportLab отслеживать «Выбранное» состояние виджета. Это также позволяет изменить внешний вид радио, когда он выбран или изменен.

Теперь давайте узнаем, как создать виджет выбора!

Выбор

выбор Виджет в основном является Combobox, который отображает выпадку, когда пользователь нажимает на него. Это позволяет пользователю выбрать один или несколько вариантов из раскрывающегося списка, в зависимости от fieldflags Вы установили. Если вы добавите редактировать к fieldflags Затем пользователь может редактировать элемент в виджете выбора.

Давайте найдя момент, чтобы создать пару виджетов выбора в документе PDF:

# simple_choices.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green, red

def create_simple_choices():
    c = canvas.Canvas('simple_choices.pdf')
    
    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Choices')
    c.setFont("Courier", 14)
    form = c.acroForm
    
    c.drawString(10, 650, 'Choose a letter:')
    options = [('A','Av'),'B',('C','Cv'),('D','Dv'),'E',('F',),('G','Gv')]
    form.choice(name='choice1', tooltip='Field choice1',
                value='A',
                x=165, y=645, width=72, height=20,
                borderColor=magenta, fillColor=pink, 
                textColor=blue, forceBorder=True, options=options)
  
    c.drawString(10, 600, 'Choose an animal:')
    options = [('Cat', 'cat'), ('Dog', 'dog'), ('Pig', 'pig')]
    form.choice(name='choice2', tooltip='Field choice2',
                value='Cat',
                options=options, 
                x=165, y=595, width=72, height=20,
                borderStyle='solid', borderWidth=1,
                forceBorder=True)
    
    c.save()
    
if __name__ == '__main__':
    create_simple_choices()

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

Теперь давайте узнаем о списке!

Проступок

listbox Виджет вроде как виджет выбора, за исключением того, что список прокрутки является прокручиваемой коробкой вместо Combobox. Вы можете использовать fieldflags Аргумент, чтобы позволить пользователю выбрать один или несколько элементов из списка.

Теперь давайте напишем быстрое демо, чтобы мы могли видеть, как вы можете создать одну из этих виджетов:

# simple_listboxes.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green, red

def create_simple_listboxes():
    c = canvas.Canvas('simple_listboxes.pdf')
    
    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Listboxes')
    c.setFont("Courier", 14)
    form = c.acroForm
    
    c.drawString(10, 650, 'Choose a letter:')
    options = [('A','Av'),'B',('C','Cv'),('D','Dv'),'E',('F',),('G','Gv')]
    form.listbox(name='listbox1', value='A',
                x=165, y=590, width=72, height=72,
                borderColor=magenta, fillColor=pink, 
                textColor=blue, forceBorder=True, options=options,
                fieldFlags='multiSelect')
  
    c.drawString(10, 500, 'Choose an animal:')
    options = [('Cat', 'cat'), ('Dog', 'dog'), ('Pig', 'pig')]
    form.listbox(name='choice2', tooltip='Field choice2',
                value='Cat',
                options=options, 
                x=165, y=440, width=72, height=72,
                borderStyle='solid', borderWidth=1,
                forceBorder=True)
    
    c.save()
    
if __name__ == '__main__':
    create_simple_listboxes()

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

Теперь давайте узнаем о виджете текстового поля!

Текстовое поле

Текстовое поле это виджет ввода текста. Вы увидите их в формах для ввода вашего имени и адреса. Большинство аргументов для текстового поля, такие же, как те, которые вы видели в предыдущих виджетах.

# simple_form.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green

def create_simple_form():
    c = canvas.Canvas('simple_form.pdf')
    
    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Employment Form')
    c.setFont("Courier", 14)
    form = c.acroForm
    
    c.drawString(10, 650, 'First Name:')
    form.textfield(name='fname', tooltip='First Name',
                   x=110, y=635, borderStyle='inset',
                   borderColor=magenta, fillColor=pink, 
                   width=300,
                   textColor=blue, forceBorder=True)
    
    c.drawString(10, 600, 'Last Name:')
    form.textfield(name='lname', tooltip='Last Name',
                   x=110, y=585, borderStyle='inset',
                   borderColor=green, fillColor=magenta, 
                   width=300,
                   textColor=blue, forceBorder=True)
    
    c.drawString(10, 550, 'Address:')
    form.textfield(name='address', tooltip='Address',
                   x=110, y=535, borderStyle='inset',
                   width=400, forceBorder=True)
    
    c.drawString(10, 500, 'City:')
    form.textfield(name='city', tooltip='City',
                   x=110, y=485, borderStyle='inset',
                   forceBorder=True)
    
    c.drawString(250, 500, 'State:')
    form.textfield(name='state', tooltip='State',
                   x=350, y=485, borderStyle='inset',
                   forceBorder=True)
    
    c.drawString(10, 450, 'Zip Code:')
    form.textfield(name='zip_code', tooltip='Zip Code',
                   x=110, y=435, borderStyle='inset',
                   forceBorder=True)
    
    c.save()
    
if __name__ == '__main__':
    create_simple_form()

Здесь мы создаем серию текстовых полей с различными настройками, применяемыми к ним. Как видите, мы изменили границу и цвет фона на несколько полей. Тогда мы только что добавили несколько довольно стандартных. Мы также использовали ширина Параметр для изменения того, насколько широко текстовое поле.

Вот что этот код закончился для меня:

Обертывание

В этой статье мы узнали, как создавать различные виджеты, которые ReportLab поддерживает создание интерактивных форм PDF. Вы захотите пойти с копией руководства пользователя REPORTLAB, чтобы узнать о различных формах виджета, типов границы, полевых флагов и флаги аннотации, которые поддерживают виджеты, хотя, как это не легко воспроизвести здесь. Как видите, ReportLab предоставляет всему, что вам нужно создавать довольно надежные формы.

Связанное чтение

  • ReportLab Форум пост о интерактивных формах
  • Исходный код ReportLab для интерактивных форм на Битбукет
  • Источник реализации формы ReportLab на Битбукет
  • Fi Формы PDF Lling с Python