заполненные поля PDF отображаются по-разному в разных контекстах - PullRequest
0 голосов
/ 03 июля 2019

У меня есть скрипт на 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 показывает правильное значение для каждой страницы, имеющей свои собственные данные полей,и если я посмотрю на предварительный просмотр, он также не показывает данные формы

...