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 снова заработал, как и ожидалось.