如何在Python中用borb在PDF文档中创建一个表单

454 阅读4分钟

这 ***可移植文件格式(PDF)***并不是一种 ***所见即所得(WYSIWYG)***格式。它被开发成与平台无关,与底层操作系统和渲染引擎无关。

为了实现这一点,PDF的构造是通过更像编程语言的东西进行交互,并依靠一系列的指令和操作来实现一个结果。事实上,PDF是基于一种脚本语言--PostScript,它是第一个独立于设备的页面描述语言

在本指南中,我们将使用 borb- 一个专门用于阅读、操作和生成 PDF 文档的 Python 库。它提供了一个低级别的模型(如果你选择使用精确的坐标和布局,允许你访问这些)和一个高级别的模型(你可以将边距、位置等的精确计算委托给一个布局管理器)。

在本指南中,我们将看看如何生成一个带有可填写表格的PDF。

安装borb

borb可以从GitHub上的源代码下载,或者通过pip

$ pip install borb

用borb生成一个PDF文档

现在,borb 已经安装完毕,我们可以导入构件并构建一个简单的 PDF 页面。

from borb.pdf.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF
from borb.pdf.canvas.layout.page_layout.multi_column_layout import SingleColumnLayout
from borb.pdf.canvas.layout.page_layout.page_layout import PageLayout

下面的代码代表了使用borb 创建一个PDF文档的基本步骤。

  • 创建一个空文档
  • 创建一个空的页面
  • 将该页添加到文档中
  • 创建一个负责处理内容流的PageLayout(这里我们将使用SingleColumnLayout)。
  • 将内容添加到PageLayout中
  • 将文档持久化到磁盘

说到这里,让我们继续创建一个Document

# Create empty Document
pdf = Document()

# Create empty Page
page = Page()

# Add Page to Document
pdf.append_page(page)

# Create PageLayout
layout: PageLayout = SingleColumnLayout(page)

随着初始步骤的完成,我们可以添加内容了。在这个例子中,它将是一个可填充的表单。我们将创建一个带有一些基本用户信息问题的表单,如姓名等。

  • 姓名
  • 姓氏
  • 性别
  • 居住地
  • 国籍

为了确保一切都布置得恰到好处,我们将把这些内容添加到一个Table 。左栏将包含字段名(如 "姓名"、"姓氏"),右栏将包含要填写的字段。

我们将另外在表格的正上方添加另一个Paragraph ,对其进行注释。

# New import(s)
from borb.pdf.canvas.layout.table.fixed_column_width_table import FixedColumnWidthTable
from borb.pdf.canvas.layout.text.paragraph import Paragraph
from borb.pdf.canvas.layout.forms.text_field import TextField
from borb.pdf.canvas.color.color import HexColor
from decimal import Decimal
from borb.pdf.canvas.layout.layout_element import Alignment
from borb.pdf.canvas.layout.forms.drop_down_list import DropDownList

# Let's start by adding a heading
layout.add(Paragraph("Patient Information:", font="Helvetica-Bold"))

# Use a table to lay out the form
table: FixedColumnWidthTable = FixedColumnWidthTable(number_of_rows=5, number_of_columns=2)

# Name
table.add(Paragraph("Name : ", horizontal_alignment=Alignment.RIGHT, font_color=HexColor("56cbf9")))
table.add(TextField(value="Doe", font_color=HexColor("56cbf9"), font_size=Decimal(20)))

# Surname
table.add(Paragraph("Surname : ", horizontal_alignment=Alignment.RIGHT, font_color=HexColor("56cbf9")))
table.add(TextField(value="John", font_color=HexColor("56cbf9"), font_size=Decimal(20)))

这些inpt字段是TextFields,它接受传入的一个字符串。我们将把性别字段建模为一个下拉列表,读者可以从四个选项中选择一个

  • 其他
  • 倾向于不透露

让我们看看如何将其转化为borb

# Gender
table.add(Paragraph("Gender : ", horizontal_alignment=Alignment.RIGHT))
table.add(DropDownList(
    possible_values=[
                    "Female",
                    "Male",
                    "Other",
                    "Prefer not to disclose",
                    ]
))

我们可以为居住国和国籍做一个类似的事情,但这将涉及到必须找到一个世界上所有国家的列表,并传递给DropDownList 的构造器。

这代表了任何足够长的列表。

因为这个特殊的字段(所有国家的列表)是一个很常见的要求,borb 预先加载了CountryDropDownList 这个类。

# New import(s)
from borb.pdf.canvas.layout.forms.country_drop_down_list import CountryDropDownList

# Country of Residence
table.add(Paragraph("Country of Residence : ", horizontal_alignment=Alignment.RIGHT))
table.add(CountryDropDownList(value="Belgium"))

# Nationality
table.add(Paragraph("Nationality : ", horizontal_alignment=Alignment.RIGHT))
table.add(CountryDropDownList(value="Belgium"))

现在我们终于可以把Table 添加到我们的PageLayout

# Set some properties on the table to make the layout prettier
table.set_padding_on_all_cells(Decimal(5), Decimal(5), Decimal(5), Decimal(5))
table.no_borders()

# Adding Table to PageLayout
layout.add(table)

现在让我们添加一个(无意义的)数据保护政策。

# Data protection policy
layout.add(Paragraph("Data Protection Policy", 
                     font="Helvetica-Bold"))

# Dummy text
layout.add(Paragraph(
    """
    ** Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    """,
    font="Helvetica-Oblique"
))

让我们通过添加一个页脚来收尾。现在,我们只是在页面底部添加一个填充了重点颜色的矩形。没有什么太花哨的。

# New import(s)
import typing
from borb.pdf.canvas.geometry.rectangle import Rectangle
from borb.pdf.page.page_size import PageSize
from borb.pdf.canvas.line_art.line_art_factory import LineArtFactory
from borb.pdf.canvas.layout.image.shape import Shape

ps: typing.Tuple[Decimal, Decimal] = PageSize.A4_PORTRAIT.value
r: Rectangle = Rectangle(Decimal(0), Decimal(32), ps[0], Decimal(8))
Shape(points=LineArtFactory.rectangle(r), stroke_color=HexColor("56cbf9"), fill_color=HexColor("56cbf9")).layout(page, r)

最后,我们可以使用PDF 类来存储我们创建的Document

# New import(s)
from borb.pdf.pdf import PDF

# Store
with open("output.pdf", "wb") as out_file_handle:
    PDF.dumps(out_file_handle, pdf)

这最后看起来如何呢?当我们运行代码并产生PDF文件时--它将有几个空字段。

Fillable form in pdf created in python with borb

通过选择这些字段,你可以使用你的键盘来输入细节。

filled pdf form python borb

结论

在本指南中,你已经学会了如何在你的PDF中包含表单元素,允许读者与PDF互动。