PdfFileReader.getFields() возвращает {} | django

Я пытаюсь прочитать pdf форму с помощью django. Дело в том, что в другом представлении моего views.py мне удалось сделать это с помощью PyPDF2 и его метода PdfFileReader.getFields(). Теперь проблема в том, что чтение не работает должным образом: Я проверил с помощью adobe acrobat, и файл по-прежнему представляет собой форму с полями, так что у меня нет никакой идеи, в чем может быть проблема.

Я прикрепляю здесь соответствующую часть кода:

if request.method == "POST":
        form = Form(request.POST, request.FILES) # the form refer to a model called 'New Request'
        if form.is_valid():
            form.save()
            File = request.FILES['File'].name
            full_filename = os.path.join(BASE_DIR, 'media/media', File)
            f = PdfFileReader(full_filename)
            fields = f.getFields()
            fdfinfo = dict((k, v.get('/V', '')) for k, v in fields.items())
            k = creare_from_pdf2(request, fdfinfo, pk) # this is a custom function 
            nr = NewRequest.objects.all() #I'm deleting the object uploaded because it won't be useful anymore
            nr.delete()
            os.remove(full_filename)

Если я отображаю print(fdfinfo), то на самом деле отображается {}. Это, конечно, приводит к ошибке при передаче fdfinfo в функцию 'create_from_pdf_2'. Я не знаю, в чем может быть проблема, также потому что в другом представлении я сделал точно так же, и оно работает:

if request.method=='POST':
        form = Form(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            uploaded_filename = request.FILES['File'].name
            full_filename = os.path.join(BASE_DIR, 'media/media', uploaded_filename)
            f = PdfFileReader(full_filename)
            fields = f.getFields()
            fdfinfo = dict((k, v.get('/V', '')) for k, v in fields.items())
            k=create_from_pdf1(request, fdfinfo)
            if k==1:
                return HttpResponse('<html><body>Something went wrong</html></body>')
            nr = NewRequest.objects.all()
            nr.delete()
            os.remove(full_filename)

Возможно, есть способ отобразить ошибки PdfFileReader?

ОБНОВЛЕНИЕ

Новый файл, который я пытаюсь прочитать, сначала модифицируется в том смысле, что некоторые (НО НЕ ВСЕ!) поля заполняются PdfFileWriter'ом, а те, что заполнены, затем устанавливаются только для чтения. Могла ли эта операция повлиять на работу PdfFileReader? Прилагаю соответствующее представление

att = MAIN.objects.get(id=pk)
    file_path = os.path.join(BASE_DIR, 'nuova_form.pdf')
    input_stream = open(file_path, "rb")
    pdf_reader = PdfFileReader(input_stream, strict = False)
    if "/AcroForm" in pdf_reader.trailer["/Root"]:
        pdf_reader.trailer["/Root"]["/AcroForm"].update(
            {NameObject("/NeedAppearances"): BooleanObject(True)})

    pdf_writer = PdfFileWriter()
    set_need_appearances_writer(pdf_writer)
    if "/AcroForm" in pdf_writer._root_object:
        # Acro form is form field, set needs appearances to fix printing issues
        pdf_writer._root_object["/AcroForm"].update(
            {NameObject("/NeedAppearances"): BooleanObject(True)})
data_dict1 = { # my text fields
    }
data_dict2 = { # my booleancheckbox fields }

for i in range(0,6): #The pdf file has 6 pages
        pdf_writer.addPage(pdf_reader.getPage(i))
        page = pdf_writer.getPage(i)
        
        # update form fields
        pdf_writer.updatePageFormFieldValues(page, data_dict1)
        for j in range(0, len(page['/Annots'])):
            writer_annot = page['/Annots'][j].getObject()
            for field in data_dict1:
                if writer_annot.get('/T') == field:
                    writer_annot.update({
                        NameObject("/Ff"): NumberObject(1)    # make ReadOnly
                    })
        # update checkbox fields
        updateCheckboxValues(page, data_dict2)
    output_stream = BytesIO()
    pdf_writer.write(output_stream)

    return output_stream

def updateCheckboxValues(page, fields):

    for j in range(0, len(page['/Annots'])):
        writer_annot = page['/Annots'][j].getObject()
        for field in fields:
            if writer_annot.get('/T') == field:
                writer_annot.update({
                    NameObject("/V"): NameObject(fields[field]),
                    NameObject("/AS"): NameObject(fields[field])
                })

Я получил похожие результаты, когда пытался выполнить прямое чтение PDF-формы с помощью Python и PyPDF2. PDF-форма была создана с помощью Libre Writer и представляла собой одну страницу с примерно 50 текстовыми полями. Когда я запускал метод getFields() на объекте reader, я получал ту же проблему - он возвращал пустой объект dict.

Я подумал, что может быть ограничение на количество полей, и попробовал удалить некоторые для тестирования, но получил тот же результат. Затем при просмотре я заметил, что все имена полей довольно длинные: txtLabMemberFirstName01, txtLabMemberLastName01, txtPrincipalInvestigatorFirstName и т.д.

Я сократил имена всех полей (например, "txtLMFN01"), и PyPDF2 снова заработал, как и ожидалось.

Вернуться на верх