Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pdfminer错误消息:pdfminer.pdfdocument.PDFTextExtractionNotAllowed:不允许文本提取_Python_Pdf_Pdfminer - Fatal编程技术网

Python pdfminer错误消息:pdfminer.pdfdocument.PDFTextExtractionNotAllowed:不允许文本提取

Python pdfminer错误消息:pdfminer.pdfdocument.PDFTextExtractionNotAllowed:不允许文本提取,python,pdf,pdfminer,Python,Pdf,Pdfminer,我需要处理一些PDF文件,并将其表单字段内容添加到数据库中 正如我在PDF Viewer文档属性中看到的,此文档未设置安全方法 我尝试了我找到的建议 当我使用pdfminer(或pdfminer.six)进行测试时,我没有收到错误消息,但它没有检索任何字段 使用PyPDF2,我得到错误消息:“文件尚未解密。” 这是pdfminer代码: import sys from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument im

我需要处理一些PDF文件,并将其表单字段内容添加到数据库中

正如我在PDF Viewer文档属性中看到的,此文档未设置安全方法

我尝试了我找到的建议

当我使用pdfminer(或pdfminer.six)进行测试时,我没有收到错误消息,但它没有检索任何字段

使用PyPDF2,我得到错误消息:“文件尚未解密。”

这是pdfminer代码:

import sys
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1

fname=r'D:\Atrium\Projects\CTFC\psgf\database\19022021\formulari-dinamic-redaccio-plans-simples-gestio-forestal_Filled.pdf'
fp = open(fname, 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)
fields = resolve1(doc.catalog['AcroForm'])['Fields']
for i in fields:
    field = resolve1(i)
    name, value = field.get('T'), field.get('V')
    print('{0}: {1}'.format(name, value))
print('Done!')
可以下载一个示例文件


如何获取字段名和内容?

正如mkl所解释的,我的PDF文件以XFA格式存储表单数据,XFA格式是一种不推荐的格式。XFA是一个XML文档数组,我必须在每个文档中获取字段名

我使用PyPDF2库来实现这一点:

import PyPDF2 as pypdf
import xml.etree.ElementTree as ET

fname=r'form.pdf'

def findInDict(needle, haystack):
    xlas = []
    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(fname,'rb')
pdf=pypdf.PdfFileReader(pdfobject)
xfaparts=findInDict('/XFA',pdf.resolvedObjects)

for xfa in xfaparts:
    if isinstance(xfa,pypdf.generic.IndirectObject):
        xml = str(xfa.getObject().getData())
        ## Then process XML to find form tags

您的示例文件包含一个XFA表单,即不是您要查找的正常AcroForm表单定义。带有XFA表单的PDF是一种不推荐使用的技术。Tks!但是,PDF表单已经填写完毕,如何访问数据字段,或者您知道是否有任何工具可以在Acroform中转换XFA?实际上,XFA表单定义是一个xml文件,可以作为一个整体嵌入,也可以作为一个部分嵌入。您可以提取它并从xml中读取数据。它作为键XFA的值位于AcroForm字典中。