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

2024-04-13

我创建了一个带有一些单选按钮的表单,遵循以下示例使用 Python 在 ReportLab 中创建交互式 PDF 表单 https://www.blog.pythonlibrary.org/2018/05/29/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?

版本:

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

OS:

Windows 10 v1809


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

如果出现以下情况,则按下按钮form.radio(... selected=True)

2.) 是否可以进行分组,以便根据一组仅按下一 (1) 个单选按钮?

The name属性与组名相关。

So 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 返回的字段数据......

Using 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在文本编辑器中检查一般结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:PDF:如何读取带有单选按钮的表单 的相关文章

随机推荐

  • WordPress 使用 GD 图像引擎以编程方式将图像转换为 WebP 格式

    有许多 PHP 解决方案和 WP 插件 它们都带有我不想要 不需要的附加选项 即如何提供转换后的文件 存储它们的位置等 我不需要所有这些 并且正在寻找使用 GD 的纯简单代码 我不想使用插件 谢谢 编码应该什么时候发生 任何时候你知道这是钩
  • 实体框架“意外的连接状态”异常

    经过三个小时的调试和搜索 我希望这里有人能找到答案 如果我连续快速调用以下函数 例如间隔 System InvalidOperationException 意外的连接状态 使用包装提供程序时 请确保在包装的 DbConnection 上实现
  • 错误:错误域=NSURLErrorDomain代码=-1001“请求超时。”

    我正在 Xcode 6 1 iOS 8 1 中开发一个应用程序 该应用程序直到 2 天前都工作得很好 但今天当我执行它时 我在网络服务中遇到了错误 错误打印在下面 错误 错误域 NSURLErrorDomain代码 1001 请求计时 出
  • 如何使用 Java 8 可选,在三个都存在的情况下执行操作?

    我有一些使用 Java 可选的 简化的 代码 Optional
  • SSRS 计算行组和列组的计数

    我正在构建案例结果报告 其中对行组和单列分组进行父子分组 Parent Row Group Location 子行组 结果 列组 月份 报告中贯穿的是一年中的月份 报告中贯穿的是位置以及给定月份中该位置的不同结果细分 看起来像这样 Jan
  • Twitter API:获取关注者 +99

    使用 twitter API 和 OAuth 如果我要调用用户关注者 状态 关注者 我将仅返回 99 个结果 有没有办法让我返回 99 然后从关注者 100 开始再次调用 然后循环这种调用方式 直到返回关注者总数 或者只是返回所有关注者 您
  • Android 日历视图 - 将滚动方向更改为垂直

    我在导航抽屉内的应用程序中使用日历视图来选择不同的日期 除了在日历视图上向左滑动以到达下个月 向右滑动正确更改上个月 之外 一切正常 因为这是关闭抽屉的滑动手势 是否可以将日历的滚动方向更改为垂直而不是水平 我想实现这一点 这样用户就不必严
  • JavaFX - 以编程方式设置目标路径以直接将节点打印到 pdf 文件

    我想使用 Microsoft Print to PDF 打印机将节点打印到 pdf 文件 假设 Printer 对象已经被提取 我有下一个功能 该功能运行良好 public static void printToPDF Printer pr
  • Canvas 类绘图基元的除法独立性

    Android Canvas 类支持一组丰富的绘图基元 圆 线等 我有一个应用程序使用这些图元来绘制一些统计数据 阅读完相关说明后http developer android com reference android graphics C
  • 在node_modules/dojo/dojo.js的resolveDepMaps()中出现“TypeError: deps.map is not a function”

    我一直在更改我的组织的底层基础设施 以将我们的自动化测试从使用单独的 Web 服务器在浏览器客户端中运行切换到在测试运行程序 实习运行程序 中运行 在测试运行器环境中 一切进展顺利 我解决了很多问题 但随后繁荣起来 有人删除了一个新的单元测
  • 如何创建一个值超过允许的最大整数的枚举?

    我正在 C 中创建一个枚举 以使用二进制标志创建一个有限状态机 看起来像 enum VStates NEUTRAL 0x00000000 000000 Physical Status DRY 0x00000001 000001 WET 0x
  • Java Web 服务 - Axis 是必要的吗?

    Is AXIS or CXFJava Web 服务必需吗 这一切都可以通过 JDK 1 6 完成吗 Java Web 服务需要 AXIS 或 CXF 吗 不 虽然Axis2 http ws apache org axis2 是使用 Web
  • 如何设计“冰淇淋三明治”选项卡之间的分隔线样式?

    我将以下样式与一组九个补丁图像一起使用 在一些冰淇淋三明治选项卡的底部创建一条红线 而不是标准的蓝线
  • 在c#中将未命名的json数组反序列化为对象

    想知道如何在 C 中反序列化以下字符串 access token thisistheaccesstoken 如果 json 是 我知道该怎么做 array access token thisistheaccesstoken 我会这样做 pu
  • java 注释:用 xml 文件覆盖注释的库

    Java 有注释 这很好 然而 一些开发人员认为最好使用 xml 文件用元数据注释代码 其他开发人员更喜欢注释 但会使用元数据覆盖源代码中的注释 我正在编写一个使用注释的 Java 框架 问题是 是否有一种标准方法来定义和解析 xml 文件
  • 处理回调

    我在 Objective C 类中有一个方法 它有 2 个用 C 编写的回调函数 类指针 即self被传递给这些函数作为void 在 C 函数中 我创建一个类型为 class 的指针并分配void 范围 第一个回调函数执行成功 但是void
  • 使用 FFMPEG 播放音频

    我一直在尝试使用 NDK 将 FFMPEG 用于播放音频 移植到 Android 中 我取得了一些成功 我可以构建 FFMPEG 并通过 NDK 链接它 我可以打电话avcodec decode audio3 并解码给定的音频文件 所以这里
  • java并发hashmap

    这似乎是错误的 static ConcurrentHashMap k multiple threads have access to k X o k get LL o a 6 如果多个线程同时访问 k 并获取 k LL 然后在没有 k pu
  • 使用 glassfish 4 和 Postgres 在 eclipselink 中创建数据库不起作用

    我想创建基于实体的数据库 配置 Glassfish GlassFish 服务器开源版 4 1 版本 13 Eclipselink Eclipse 持久性服务 2 5 2 v20140319 9ad6abd 随 glassfish 提供 数据
  • Python:PDF:如何读取带有单选按钮的表单

    我创建了一个带有一些单选按钮的表单 遵循以下示例使用 Python 在 ReportLab 中创建交互式 PDF 表单 https www blog pythonlibrary org 2018 05 29 creating interac