热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Python创建交互式PDF表单

Python提供了不同的功能,人们可以执行这些功能来操作PDF文件,在前面的两个教程中,我们已经讨论了很多关于使用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()

输出:

Creating Interactive PDF forms using Python

说明:

从上面的代码片段中我们可以看到,我们已经从 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,
borderC++:')
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()

输出:

Creating Interactive PDF forms using Python

说明:

在上面的代码片段中,我们已经从 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()

输出:

Creating Interactive PDF forms using Python

说明:

在上面的代码片段中,我们已经从 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()

输出:

Creating Interactive PDF forms using Python

说明:

在上面的代码片段中,我们已经从 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()

输出:

Creating Interactive PDF forms using Python

说明:

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



推荐阅读
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 使用jqTransform插件美化表单
    jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 基于 Vue 和 Element UI 实现的简洁登录界面设计
    本文介绍了一种利用 Vue.js 和 Element UI 框架构建的简洁登录界面设计。该设计不仅注重用户体验,还确保了界面的美观性和易用性。通过合理的布局和组件配置,实现了高效、响应式的登录功能,适用于多种前端应用场景。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
author-avatar
黄镇郁皓伟嘉惟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有