用加密的Python填写PDF表单

用加密的Python填写PDF表单,python,pdf,pypdf2,Python,Pdf,Pypdf2,我的项目是为晚点列车自动填写德国铁路公司(Deutsche Bahn)的PDF表格 当你用谷歌浏览器打开链接时,你可以很容易地编辑文档。因此,在python中也应该可以做到这一点 我尝试了多种方法: 1.使用PyPDF2 在这个堆栈溢出问题的第二个答案中建议的方法是: #-*-编码:utf-8-*- 从集合导入订单 从PyPDF2导入PdfileWriter、PdfileReader def_getFields(obj,tree=None,retval=None,fileobj=None): "

我的项目是为晚点列车自动填写德国铁路公司(Deutsche Bahn)的PDF表格

当你用谷歌浏览器打开链接时,你可以很容易地编辑文档。因此,在python中也应该可以做到这一点

我尝试了多种方法:

1.使用PyPDF2 在这个堆栈溢出问题的第二个答案中建议的方法是:

#-*-编码:utf-8-*-
从集合导入订单
从PyPDF2导入PdfileWriter、PdfileReader
def_getFields(obj,tree=None,retval=None,fileobj=None):
"""
如果此PDF包含交互式表单字段,则提取字段数据。
*tree*和*retval*参数用于递归使用。
:param fileobj:要写入的文件对象(通常是文本文件)
找到的所有交互式表单字段的报告。
:return:一个字典,其中每个键都是字段名,每个
值是一个:类:`Field`对象
默认情况下,映射名称用于键。
:rtype:dict,如果找不到表单数据,则为“无”。
"""
fieldAttributes={'/FT':'字段类型','/Parent':'父','/T':'字段名称','/TU':'备用字段名称',
“/TM”:“映射名称”、“/Ff”:“字段标志”、“/V”:“值”、“/DV”:“默认值”}
如果retval为None:
retval=OrderedDict()
目录=对象拖车[“/Root”]
#获取AcroForm树
如果目录中有“/AcroForm”:
树=目录[“/AcroForm”]
其他:
一无所获
如果树为无:
返回返回
对象(树、检索、文件对象)
对于字段属性中的属性:
如果属性在树中:
#树是一块地
对象\构建字段(树、检索、文件对象、字段属性)
打破
如果树中有“/字段”:
字段=树[“/fields”]
对于字段中的f:
field=f.getObject()
对象\构建字段(字段、检索、文件对象、字段属性)
返回返回
def获取表单字段(填充):
infle=PdfileReader(打开(infle,'rb'))
字段=\u获取字段(填充)
在fields.items()中为k,v返回OrderedDict((k,v.get('/v',''))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
从pprint导入pprint
pdf_file_name='2PagesFormExample.pdf'
pprint(获取表单字段(pdf文件名))
但是,该程序在解密PDF时存在问题:

  File "c:\Users\User1\iCloudDrive\fahrgastrechte\fahrgastrechte.py", line 94, in <module>
    pprint(get_form_fields(pdf_file_name))
  File "c:\Users\User1\iCloudDrive\fahrgastrechte\fahrgastrechte.py", line 62, in get_form_fields
    fields = _getFields(infile)
  File "c:\Users\User1\iCloudDrive\fahrgastrechte\fahrgastrechte.py", line 32, in _getFields
    catalog = obj.trailer["/Root"]
  File "C:\Program Files\Python36\lib\site-packages\PyPDF2\generic.py", line 516, in __getitem__
    return dict.__getitem__(self, key).getObject()
  File "C:\Program Files\Python36\lib\site-packages\PyPDF2\generic.py", line 178, in getObject
    return self.pdf.getObject(self).getObject()
  File "C:\Program Files\Python36\lib\site-packages\PyPDF2\pdf.py", line 1617, in getObject
    raise utils.PdfReadError("file has not been decrypted")
PyPDF2.utils.PdfReadError: file has not been decrypted

目前,我的系统(Windows 10)无法识别pyhton模块正在调用的pdftk.exe。所以我直接在bash中调用它:

pdftk.exe fahrgstrechteformular.pdf dum_数据_字段
我还发现了一个加密错误:

Error: Failed to open PDF file:
   fahrgastrechteformular.pdf
   OWNER PASSWORD REQUIRED, but not given (or incorrect)
Error: Unable to find file.
Error: Failed to open PDF file:
   dum_data_fields
Done.  Input errors, so no output created.
所以在开始的时候,我只想阅读PDF的表单字段。例如,当我用谷歌浏览器填写第一个字段“柏林中央车站”时。我想通过上面提到的python脚本读出它。下一步是,实际编辑字段内容。希望你能跟上。有不清楚的地方请提问