使用 Python 创建交互式 PDF 表单

Python 提供了不同的功能,人们可以执行这些功能来操作 PDF 文件,在前面的两个教程中,我们已经讨论了很多关于使用 Python 处理 PDF 文件的事情。在本教程中,我们将了解如何使用 Python 编程语言在 PDF 文件中创建交互式表单。

但是在开始之前,我们还将讨论一个 Python 工具包,它为我们创建一个名为 ReportLab 工具包的交互式表单提供了可访问性。

理解 Python 中的报告实验室工具包

Python ReportLab 工具包允许程序员创建交互式的可填充表单。PDF 标准通常由一组丰富的交互元素组成。报告实验室工具包不支持所有这些元素;然而,它确实涵盖了其中的大部分。在下一节中,我们将查看以下小部件:

  1. 检验盒
  2. 收音机
  3. 选择
  4. 列表框
  5. Textfield 对象

所有陈述的小部件都是通过在画布上调用不同的方法来开发的。请注意,每个文档只能有一个表单。让我们了解一下报告实验室工具包中的这些小部件。

了解复选框小部件

复选框小部件正是它听起来的样子。这是一个小框,我们可以用它来检查表单中显示的实体。 Reportlab 支持不同风格的复选框,所以当复选框被选中时,它可以根据我们设置的风格看起来与众不同。

现在,让我们来理解一个简单的例子,它说明了这些参数是如何表现的:

示例:


from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green
def createSimpleCheckboxes():
    my_Canvas = canvas.Canvas('checkboxes.pdf')    
    my_Canvas.setFont("Courier", 24)
    my_Canvas.drawCentredString(300, 700, 'Programming Languages')
    my_Canvas.setFont("Courier", 16)
    form = my_Canvas.acroForm    
    my_Canvas.drawString(10, 650, 'Python:')
    form.checkbox(
        name = 'cb1',
        tooltip = 'Field cb1',
        x = 110,
        y = 645,
        buttonStyle = 'check',
        borderColor = magenta,
        fillColor = pink, 
        textColor = blue,
        forceBorder = True
        )    
    my_Canvas.drawString(10, 600, 'Java:')
    form.checkbox(
        name = 'cb2',
        tooltip = 'Field cb2',
        x = 110,
        y = 595,
        buttonStyle = 'cross',
        borderWidth = 2,
        forceBorder = True
        )    
    my_Canvas.drawString(10, 550, 'C++:')
    form.checkbox(
        name = 'cb3',
        tooltip = 'Field cb3',
        x = 110,
        y = 545,
        buttonStyle = 'star',
        borderWidth = 1,
        forceBorder = True
        )    
    my_Canvas.drawString(10, 500, 'C:')
    form.checkbox(
        name = 'cb4',
        tooltip = 'Field cb4',
        x = 110,
        y = 495,
        buttonStyle = 'circle',
        borderWidth = 3,
        forceBorder = True
        )   
    my_Canvas.drawString(10, 450, 'JavaScript:')
    form.checkbox(
        name = 'cb5',
        tooltip = 'Field cb5',
        x = 110,
        y = 445,
        buttonStyle = 'diamond',
        borderWidth = None,
        checked = True,
        forceBorder = True
        )    
    my_Canvas.save()    
if __name__ == '__main__':
    createSimpleCheckboxes()

输出:

说明:

从上面的代码片段中我们可以看到,我们已经从 ReportLab 库的不同模块中导入了不同的函数。然后,我们设置了名称和工具提示,以便与小部件的名称相匹配。我们已经确定了它的位置和其他一些事情。我们可以随意调整复选框边框的宽度或关闭边框。但是,如果我们将其关闭,复选框可能会变得不可见,因此我们可能希望通过填充颜色来设置其背景颜色。我们已经为每个复选框设置了按钮样式的独特之处。

了解收音机部件

单选小部件类似于复选框,尽管单选按钮位于我们一次只能选择一个单选按钮的组中。复选框很少被限制为每个组允许一个复选框。报告实验室工具包没有提供一种方法来明确地将一组无线电盒组合在一起。工具包只提供了分组的隐式方式。这种说法意味着,如果我们一个接一个地创建一系列广播,它们将被组合在一起。

现在,让我们使用如下所示的简单示例来理解这一点:

示例:


from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green
def createSimpleRadios():
    my_canvas = canvas.Canvas('radiosFile.pdf')    
    my_canvas.setFont("Courier", 22)
    my_canvas.drawCentredString(300, 700, 'Radio demo')
    my_canvas.setFont("Courier", 16)
    form = my_canvas.acroForm    
    my_canvas.drawString(10, 650, 'Python:')
    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)        
    my_canvas.drawString(10, 600, 'Java:')
    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
        )    
    my_canvas.drawString(10, 550, 'C++:')
    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
        )  
    my_canvas.save()   
if __name__ == '__main__':
    createSimpleRadios()

输出:

说明:

在上面的代码片段中,我们已经从 ReportLab 工具包的不同模块中导入了所需的函数。然后我们定义了一个函数,并创建了一个新的 PDF 文件。然后,我们为 PDF 文件定义了不同的单选按钮,并保存了该文件。最后,我们调用了函数。

一旦我们执行了上面的代码片段,我们可以观察到程序只返回了三个无线电。这是因为我们需要为每个单选按钮创建两个名称相同但值和部分不同的对象。文档没有说明背后的原因,但是我们可以假设这样做是为了支持 ReportLab 工具包跟踪小部件的“选定”状态。这也允许我们在选择或取消选择收音机时改变其外观。

理解选择小部件

选项小部件基本上是一个组合框,当用户点击它时会显示一个下拉列表。这使用户能够根据我们设置的字段标志从下拉列表中选择一个或多个选项。如果我们在字段标志中插入编辑,那么用户可以在选择部件中编辑元素。

让我们理解以下示例,演示在 PDF 文档中使用选择小部件:

示例:


from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green, red
def createSimpleChoices():
    my_canvas = canvas.Canvas('choicesFile.pdf')    
    my_canvas.setFont("Courier", 24)
    my_canvas.drawCentredString(300, 700, 'Sample Choices')
    my_canvas.setFont("Courier", 16)
    form = my_canvas.acroForm   
    my_canvas.drawString(10, 650, 'Choose a Letter:')
    my_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 = my_options)  
    my_canvas.drawString(10, 600, 'Choose a Programming language:')
    my_options = [('Python', 'python'), ('Java', 'java'), ('C++', 'C++')]
    form.choice(
        name = 'choice2',
        tooltip = 'Field choice2',
        value = 'Python',
        options = my_options, 
        x = 305,
        y = 595,
        width = 72,
        height = 20,
        borderStyle = 'solid',
        borderWidth = 1,
        forceBorder = True
        )   
    my_canvas.save()    
if __name__ == '__main__':
    createSimpleChoices()

输出:

说明:

在上面的代码片段中,我们已经从 ReportLab 工具包的不同模块中导入了所需的函数。然后我们定义了一个函数,并创建了一个新的 PDF 文件。然后,我们创建了两个应用了稍微不同风格的选择小部件,并保存了文件。请记住将 value 参数包含到函数中;否则,程序将返回一个奇怪的错误,并没有说任何与参数丢失相关的内容。最后,我们调用了函数。

理解列表框小部件

列表框小部件与选择小部件有些相似,只是列表框被认为是一个可滚动的框,而不是组合框。我们可以使用字段标志参数,该参数支持用户从列表框中选择一个或多个元素。

现在,让我们考虑以下示例,说明如何使用列表框小部件制作交互式 PDF 表单:

示例:


from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green, red
def createSimpleListboxes():
    my_canvas = canvas.Canvas('listboxesFile.pdf')   
    my_canvas.setFont("Courier", 24)
    my_canvas.drawCentredString(300, 700, 'Sample Listboxes')
    my_canvas.setFont("Courier", 16)
    form = my_canvas.acroForm    
    my_canvas.drawString(10, 650, 'Choose a letter:')
    my_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 = my_options,
        fieldFlags = 'multiSelect'
        ) 
    my_canvas.drawString(10, 500, 'Choose a Programming language:')
    my_options = [('Python', 'python'), ('Java', 'java'), ('C++', 'C++')]
    form.listbox(
        name = 'choice2',
        tooltip = 'Field choice2',
        value = 'Python',
        options = my_options, 
        x = 165,
        y = 440,
        width = 72,
        height = 72,
        borderStyle = 'solid',
        borderWidth = 1,
        forceBorder = True
        )    
    my_canvas.save()   
if __name__ == '__main__':
    createSimpleListboxes()

输出:

说明:

在上面的代码片段中,我们已经从 ReportLab 工具包的不同模块中导入了所需的函数。然后我们定义了一个函数,并创建了一个新的 PDF 文件。然后,我们创建了应用了略微不同样式的列表框小部件,并保存了文件。上面的例子与我们创建 choice 小部件的前一个非常相似。这里的主要区别是列表框小部件和选择小部件的外观;否则,这两个小部件几乎是一样的。

了解文本字段小部件

文本字段是一个文本输入小部件。我们可以在表单中看到这些文本字段小部件来填充姓名、地址等条目。文本字段的大多数参数与我们在早期小部件中观察到的参数相同。

让我们考虑下面的例子来理解这一点:

示例:


from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green
def createSimpleForm():
    my_canvas = canvas.Canvas('PDFform.pdf')    
    my_canvas.setFont("Courier", 24)
    my_canvas.drawCentredString(300, 700, 'Application Form')
    my_canvas.setFont("Courier", 16)
    form = my_canvas.acroForm    
    my_canvas.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
        )    
    my_canvas.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
        )   
    my_canvas.drawString(10, 550, 'Address:')
    form.textfield(
        name = 'address',
        tooltip = 'Address',
        x = 110,
        y = 535,
        borderStyle = 'inset',
        width = 400,
        forceBorder = True
        )    
    my_canvas.drawString(10, 500, 'City:')
    form.textfield(
        name = 'city',
        tooltip = 'City',
        x = 110,
        y = 485,
        borderStyle = 'inset',
        forceBorder = True
        )    
    my_canvas.drawString(250, 500, 'State:')
    form.textfield(
        name = 'state',
        tooltip = 'State',
        x = 350,
        y = 485,
        borderStyle = 'inset',
        forceBorder = True
        )    
    my_canvas.drawString(10, 450, 'Zip Code:')
    form.textfield(
        name = 'zip_code',
        tooltip = 'Zip Code',
        x = 110,
        y = 435,
        borderStyle = 'inset',
        forceBorder = True
        )    
    my_canvas.save()   
if __name__ == '__main__':
    createSimpleForm()

输出:

说明:

在上面的代码片段中,我们已经从 ReportLab 工具包的不同模块中导入了所需的函数。然后我们定义了一个函数,并创建了一个新的 PDF 文件。然后,我们创建了应用了略微不同样式的文本字段小部件,并保存了文件。正如我们所观察到的,我们已经创建了一系列应用了不同设置的文本字段。此外,我们还更改了几个字段的边框和背景颜色。然后我们包括了一些非常标准的。我们还使用了宽度参数来改变文本字段的宽度。


原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/312916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-06 15:17
下一篇 2025-01-06 15:17

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29

发表回复

登录后才能评论