【问题标题】:Make a ReportLab PDF interactive - Unable to reference widgets on PDF使 ReportLab PDF 具有交互性 - 无法引用 PDF 上的小部件
【发布时间】:2021-07-30 15:02:38
【问题描述】:

我目前正在构建一个我想要交互的 ReportLab PDF 表单。我希望第二选择小部件上显示的选项取决于第一选择小部件的选择。 (例如:如果第一个选择是“意大利”,则在第二个小部件“披萨”和“意大利面”上显示为食物选项。

目前我正在尝试使用 if 来控制这种情况,但是我无法正确引用第一个小部件。 (因为我称它为 name='choice1',所以我认为这将是调用此类小部件的方式)。我收到一个错误:

if choice1 == 'Italy':
NameError: name 'choice1' is not defined

是否有正确的方法来执行所需的操作?我正在查看Reportlab documentation,但是我没有找到答案。

我当前的 Python 代码如下:

from reportlab.pdfgen.canvas import Canvas
from datetime import datetime, timedelta
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colors
from reportlab.pdfbase import pdfform
import win32com.client as win32
import pathlib

file_name = 'Example.pdf'
document_title = 'Example'
title = 'Example File'
instrucciones_1 = 'INSTRUCCIONES: Llenar toda la solicitud con la información que se pide.'
instrucciones_2 = 'Al finalizar, este PDF se enviará automáticamente al encargado de su área para aprobación.'
instrucciones_3 = 'La aprobación queda sujeta al criterio de dicho encargado. '

canvas = Canvas(file_name)
canvas.setTitle(document_title)

canvas.setFont("Helvetica-Bold", 24)
canvas.drawCentredString(385, 795, title)

now = datetime.now()
full_date = f'{now.day}/{now.month}/{now.year}'
canvas.setFont('Helvetica', 16)
canvas.drawCentredString(350, 790-20, 'Fecha solicitud: ')
canvas.setFont('Helvetica-Bold', 16)
canvas.drawCentredString(450, 790-20, full_date)

canvas.line(35, 755, 565, 755)
canvas.setFont("Helvetica", 12)
canvas.drawString(40, 740, instrucciones_1)
canvas.drawString(40, 740-15, instrucciones_2)
canvas.drawString(40, 740-30, instrucciones_3)
canvas.line(35, 740 - 35, 565, 740 - 35)


form = canvas.acroForm
canvas.setFont('Helvetica', 14)
canvas.drawString(70, 675, 'Origin of Food: ')
options = ['Select origin', 'Italy', 'Mexico', 'US']
form.choice(name='choice1', tooltip='Select origin of food',
            value='Select origin',
            x=165, y=670, width=200, height=25,
            borderColor=colors.blue, fillColor=colors.lightblue,
            textColor=colors.black, forceBorder=True, options=options)


origin = ''
food_italy = ['Select food', 'Spaghetti', 'Pizza']
food_mexico = ['Select food', 'Chiles en Nogada', 'Tacos]
food_us = ['Select food', 'Burgers', 'Buffalo Wings']


if choice1.value == 'Italy':
    sucursal = food_italy
elif choice1.value == 'Mexico':
    sucursal = food_mexico
elif choice1.value == 'US':
    sucursal = food_us

canvas.drawString(70, 645, 'Food: ')
form.choice(name='choice2', tooltip='Select food',
            value='Select food',
            x=165, y=670, width=200, height=25,
            borderColor=colors.blue, fillColor=colors.lightblue,
            textColor=colors.black, forceBorder=True, options=sucursal)

canvas.save()

有什么建议吗? 提前非常感谢!

编辑

如果 PDF 和 Reportlab 不可行,有什么方法可以制作可执行文件/表单来执行此类任务?非常感谢。

【问题讨论】:

    标签: python user-interface pdf interactive reportlab


    【解决方案1】:

    这不能以您处理此问题的方式完成,即在 Python 代码中。原因是选择例如“意大利”仅在用户打开 PDF 文件并选择它时发生。因此,您需要为此创建一个(已弃用的)XFA 表单。

    【讨论】:

    • 有没有办法做到这一点?也许不是在 PDF 中,而是在 Python 中的某种可执行文件中?在我在 VBA 中执行此操作并将文件转换为 PDF 之前,我想在 Python 上尝试一下,这在我看来是很多不必要的工作。
    • 正如我所说,这种可以工作的唯一方法是使用 XFA 表单。标准 PDF AcroForm 不支持此功能。您使用哪种编程语言来创建 PDF 并不重要,因为您希望 PDF 具有该功能。这是不可能的。
    猜你喜欢
    • 2018-08-19
    • 2016-03-14
    • 2017-03-24
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多