【问题标题】:Python: PDF: How to read from a form with radio buttonsPython:PDF:如何读取带有单选按钮的表单
【发布时间】:2019-04-23 13:37:18
【问题描述】:

按照Creating Interactive PDF Forms in ReportLab with Python 中的示例,我创建了一个带有一些单选按钮的表单

这是代码示例,尤其是。对于收音机:

simple_radios.py

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import magenta, pink, blue, green

def create_simple_radios():
    c = canvas.Canvas('simple_radios.pdf')

    c.setFont("Courier", 20)
    c.drawCentredString(300, 700, 'Radio demo')
    c.setFont("Courier", 14)
    form = c.acroForm

    c.drawString(10, 650, 'Dog:')
    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)    

    c.drawString(10, 600, 'Cat:')
    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)

    c.drawString(10, 550, 'Pony:')
    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)

    c.save()

if __name__ == '__main__':
    create_simple_radios()

我对该代码的问题/疑问是: 1.) 收音机始终处于“推送”状态。我怎样才能解除它们? 2.) 可以分组,以便根据组只按下一 (1) 个单选按钮 3.)我以后如何以编程方式读取按钮的状态,例如通过 PyPDF2?

版本:

Python:3.7.3
报告实验室:3.5.19
枕头:6.0.0
PyPDF2:1.26.0

操作系统:

Windows10 v1809

【问题讨论】:

    标签: python pdf reportlab


    【解决方案1】:

    1.) 无线电始终处于“推送”状态。我怎样才能取消它们?

    如果form.radio(... selected=True),则按下按钮

    2.) 可以分组,以便根据组只按下一 (1) 个单选按钮吗?

    name 属性与组名有关。

    所以form.radio(... name="group1") 是一组form.radio(... name="group2") 第二组。 每个组只能选择一个收音机。

    所以对于前两个问题,我创建了一个包含两个不同组的简单示例。
    第一个group 包含Fruits,第二组包含Cars

    from reportlab.pdfgen import canvas
    from reportlab.pdfbase import pdfform
    from reportlab.lib.colors import magenta, pink, blue, green, orange, yellow
    
    def create_radios():
        c = canvas.Canvas('radios.pdf')
    
        c.setFont("Courier", 20)
        c.drawCentredString(300, 800, 'Radio demo')
        form = c.acroForm
    
        #GROUP ONE, name='group1'
        c.setFont("Courier", 16)
        c.drawString(10, 680, 'Fruits:')
        c.setFont("Courier", 12)
        c.drawString(10, 650, 'Apple:')
        form.radio(name='group1', tooltip='Apple',
                   value='apple', selected=False,
                   x=110, y=650, buttonStyle='check',
                   borderStyle='solid', shape='square',
                   borderColor=blue, fillColor=magenta, 
                   textColor=blue, forceBorder=True)
    
        c.drawString(10, 600, 'Banana:')
        form.radio(name='group1', tooltip='Banana',
                   value='banana', selected=False,
                   x=110, y=600, buttonStyle='check',
                   borderStyle='solid', shape='square',
                   borderColor=blue, fillColor=yellow, 
                   textColor=blue, forceBorder=True)
    
        c.drawString(10, 550, 'Orange:')
        form.radio(name='group1', tooltip='Orange',
                   value='orange', selected=False,
                   x=110, y=550, buttonStyle='check',
                   borderStyle='solid', shape='square',
                   borderColor=blue, fillColor=orange, 
                   textColor=blue, forceBorder=True)
    
        #GROUP TWO, name='group2'
        c.setFont("Courier", 16)
        c.drawString(210, 680, 'Cars:')
        c.setFont("Courier", 12)
        c.drawString(210, 650, 'Tesla:')
        form.radio(name='group2', tooltip='Apple',
                   value='tesla', selected=False,
                   x=310, y=650, buttonStyle='circle',
                   borderStyle='solid', shape='circle',
                   borderColor=blue, fillColor=magenta, 
                   textColor=blue, forceBorder=False)
    
        c.drawString(210, 600, 'Mercedes-Benz:')
        form.radio(name='group2', tooltip='Banana',
                   value='mercedes', selected=False,
                   x=310, y=600, buttonStyle='circle',
                   borderStyle='solid', shape='circle',
                   borderColor=blue, fillColor=magenta, 
                   textColor=blue, forceBorder=False)
    
        c.drawString(210, 550, 'Toyota:')
        form.radio(name='group2', tooltip='Orange',
                   value='toyota', selected=False,
                   x=310, y=550, buttonStyle='circle',
                   borderStyle='solid', shape='circle',
                   borderColor=blue, fillColor=magenta, 
                   textColor=blue, forceBorder=False)
    
        c.save()
    
    
    
    if __name__ == '__main__':
        create_radios()
    

    3.) 我以后如何以编程方式读取按钮的状态,例如通过 PyPDF2?

    我找到了一种更简单的方法,然后使用 PyPDF2 返回的字段数据...

    使用pdfminer 可以很好地解决问题。

    创建radios.pdf 后,我使用Adobe 更改了值并将其保存为新文件radios_checked.pdf,您也可以为每个组更改一个selected 属性。

    import sys
    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdftypes import resolve1
    
    filename = "radios_checked.pdf"
    
    with open(filename, 'rb') as pdf_file:
        parser = PDFParser(pdf_file)
        doc = PDFDocument(parser)
        fields = resolve1(doc.catalog['AcroForm'])['Fields']
        for i in fields:
            field = resolve1(i)
            name = str(field.get('T'), 'utf-8')
    
            value = field.get('V') #will return PSLiteral :/ 
    
            # transform PSLiteral to string
            if value != None:
                value = str(value)
                if value[0] == r"/":
                    value = value[2:-1]
                    value = str(value)
    
            print("Group Name: {0},  checked value: {1} ".format(name , value))
    

    这将过滤所有组对象并打印出选定的组名称和选定的值。

    提示: 在 texteditor 中打开 pdf 并检查一般结构。

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2016-03-08
      • 2011-06-29
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多