У меня есть скрипт на python, который создает несколько форм pdf (0 - 10), а затем объединяет их в одну форму.Поля в скомпилированном PDF-файле отображаются по-разному в 4 разных контекстах.Я работаю в Debian Linux, и средство просмотра PDF (Okular) не показывает никаких полей в скомпилированном PDF, тогда как в Windows 10, если я открываю PDF с помощью Chrome, мне нужно навести курсор на поле, чтобы увидеть значение поля.Он содержит правильные данные поля для первой страницы, однако каждая последующая страница является просто дубликатом первой страницы, что неверно.Если я открою PDF-файл с помощью Microsoft Edge, он правильно отображает данные формы для каждой страницы, однако, когда я начинаю печатать с краем, никакие данные формы не отображаются.
Я использую pdfrw для записи в pdf и pypdf2 для слияния.Я пробовал несколько разных вещей, в том числе пытался сгладить pdf с помощью python (кстати, поддержка btw очень слаба), чтение и запись вместо слияния, пытался преобразовать поля формы в текст вместе со многими другими вещами, которыеС тех пор я забыл о том, что они не работают.
def writeToPdf(unfilled, output, data, fields):
'''Function writes the data from data to unfilled, and saves it as output'''
# TODO: Use literal declarations for lists, dicts, etc
checkboxes = [
'misconduct_complete',
'misconduct_incomplete',
'not_final_exam',
'supervise_exam',
'not_final_home_exam',
'not_final_assignment',
'not_final_oral_exam',
'not_final_lab_exam',
'not_final_practical_exam',
'not_final_other'
]
template_pdf = pdfrw.PdfReader(unfilled)
annotations = template_pdf.pages[0][Annot_Key]
for annotation in annotations:
# TODO: Singly nested if's with no else's suggest a logic problem, find a clearer way to do this.
if annotation[Subtype_Key] == Widget_Subtype_Key:
if annotation[Annot_Field_Key]:
key = annotation[Annot_Field_Key][1:-1]
if key in fields:
if key in checkboxes:
annotation.update(pdfrw.PdfDict(AS=pdfrw.PdfName('Yes')))
else:
if(key == 'course'):
annotation.update(pdfrw.PdfDict(V='{}'.format(data[key][0:8])))
else:
annotation.update(pdfrw.PdfDict(V='{}'.format(data[key])))
pdfrw.PdfWriter().write(output, template_pdf)
def set_need_appearances_writer(writer):
# basically used to ensured there are not
# overlapping form fields, which makes printing hard
try:
catalog = writer._root_object
# get the AcroForm tree and add "/NeedAppearances attribute
if "/AcroForm" not in catalog:
writer._root_object.update({
NameObject("/AcroForm"): IndirectObject(len(writer._objects), 0, writer)})
need_appearances = NameObject("/NeedAppearances")
writer._root_object["/AcroForm"][need_appearances] = BooleanObject(True)
except Exception as e:
print('set_need_appearances_writer() catch : ', repr(e))
return writer
def mergePDFs(listOfPdfPaths, outputPDf):
'''Function Merges a list of pdfs into a single one, and saves it to outputPDf'''
pdf_writer = PdfFileWriter()
set_need_appearances_writer(pdf_writer)
pdf_writer.setPageMode('/UseOC')
for path in listOfPdfPaths:
pdf_reader = PdfFileReader(path)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open(outputPDf, 'wb') as fh:
pdf_writer.write(fh)
Как уже упоминалось выше, для разных контекстов существуют разные результаты.В Debian Linux в обычном представлении не отображаются формы, в Windows 10 Google Chrome показывает повторяющиеся поля после первой страницы (но мне нужно навести курсор мыши на поле / щелкнуть по полю), Microsoft Edge показывает правильное значение для каждой страницы, имеющей свои собственные данные полей,и если я посмотрю на предварительный просмотр, он также не показывает данные формы