gpt4 book ai didi

Python:PDF:如何读取带有单选按钮的表单

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:11 32 4
gpt4 key购买 nike

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

这是代码示例,特别是。对于 radio :

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.) radio 始终处于“插入”状态。我怎样才能取消它们?2.) 是否可以分组,以便根据组仅按下一 (1) 个单选按钮3.)我稍后如何以编程方式读取按钮的状态,例如通过 PyPDF2?

版本:

Python:3.7.3
报告实验室:2019 年 5 月 3 日
枕头:6.0.0
PyPDF2:1.26.0

操作系统:

Windows10 v1809

最佳答案

1.) The radios are always in a "pushed" state. How can I unpush them?

如果 form.radio(... selected=True)

则按下按钮

2.) Can the be grouped, so that only ONE (1) radio button is pushed according to a group?

name 属性与组名称相关。

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

因此,对于前两个问题,我创建了一个包含两个不同组的简单示例。
第一个包含水果,第二组包含汽车:

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.) How could I read the state of the buttons later on programmatically e.g. via PyPDF2?

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

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

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

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))

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

提示:在文本编辑器中打开 pdf 并检查总体结构。

关于Python:PDF:如何读取带有单选按钮的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55812539/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com