使用 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/zh-hk/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

發表回復

登錄後才能評論