【问题标题】:Read form fields in a PDF created by Adobe LiveCycle Designer读取由 Adob​​e LiveCycle Designer 创建的 PDF 中的表单域
【发布时间】:2019-07-14 19:56:02
【问题描述】:

如何从this PDF file 获取字段?它是由 Adob​​e LiveCycle Designer 创建的动态 PDF。如果您在网络浏览器中打开链接,您可能会看到一个以“请稍候...”开头的页面。如果您下载文件并通过 Adob​​e Reader(5.0 或更高版本)打开它,您应该会看到全部 8 个页面。

因此,当通过PyPDF2 阅读时,您会得到一个空字典,因为它将文件呈现为单个页面,就像您通过网络浏览器看到的那样。

def print_fields(path):
    from PyPDF2 import PdfFileReader
    reader = PdfFileReader(str(path))
    fields = reader.getFields()
    print(fields)

您可以使用 Java 依赖库 tika 来读取所有 8 个页面的内容。但是结果很混乱,我正在避免 Java 依赖。

def read_via_tika(path):
    from tika import parser
    raw = parser.from_file(str(path))
    content = raw['content']
    print(content)

所以,基本上,我可以在 Adob​​e Actobat DC 中手动 Edit -> Form Options -> Export Data… 来获得一个不错的 XML。同样,我需要通过 Python 获取漂亮的表单字段及其值。

【问题讨论】:

  • 或者,如果问题中的那个过期了,请使用这个link

标签: python pdf


【解决方案1】:

就我而言,以下代码有效(来源:ankur garg

import PyPDF2 as pypdf
def findInDict(needle, haystack):
    for key in haystack.keys():
        try:
            value=haystack[key]
        except:
            continue
        if key==needle:
            return value
        if isinstance(value,dict):            
            x=findInDict(needle,value)            
            if x is not None:
                return x
pdfobject=open('CTRX_filled.pdf','rb')
pdf=pypdf.PdfFileReader(pdfobject)
xfa=findInDict('/XFA',pdf.resolvedObjects)
xml=xfa[7].getObject().getData()

【讨论】:

    【解决方案2】:

    感谢this awesome answer,我设法使用pdfminer.six 检索字段。

    浏览目录 > AcroForm > XFA,然后在列表中b'datasets' 元素之后的pdfminer.pdftypes.resolve1 对象。

    【讨论】:

    • 如何在 PDFMiner 中浏览目录 > AcroForm > XFA? @Max
    • 我收到以下错误:TypeError: int() argument must be a string, a bytes-like object or a number, not 'PSKeyword'
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2021-10-21
    相关资源
    最近更新 更多