按照Creating Interactive PDF Forms in ReportLab with Python
的示例,我创建了带有一些单选按钮的表单。这是代码示例esp。用于收音机:
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
答案 0 :(得分:0)
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))
这将过滤所有组对象并打印出选定的组名和选定的值。
提示:
在文本编辑器中打开pdf
,然后检查常规结构。