pikepdf добавление страниц приводит к ошибке отображения - PullRequest
0 голосов
/ 13 июля 2020

У меня есть заполняемый PDF-файл на две страницы, который я заполняю с помощью pikepdf. Вторая страница содержит поля для заполнения при переполнении данных с первой страницы. Иногда данные выходят за пределы второй страницы, и я хотел бы скопировать вторую страницу на третью и заполнить третью страницу. Поскольку дублирование страницы не привело к созданию нового объекта AcroForm (он сохранил структуру второй страницы), я придумал следующий код, который правильно добавляет дублирующиеся заполняемые страницы, добавляя их в новый PDF-файл. Однако этот метод приводит к тому, что PDF-файл отображается по-разному при просмотре в Edge, Chrome, Drive PDF Viewer и Adobe Acrobat. В Edge and Drive PDF Viewer на третьей странице отображаются связанные с ней данные. В Chrome третья отображается как дубликат второй страницы. В Adobe Acrobat значения не отображаются ни в каких полях.

for i, row_info in enumerate(rows):
        if i >= 49 and (i-20)%29 == 0:

            pdf.root.AcroForm['/NeedAppearances'] = True

            for page in pdf.pages:
                if Name.Annots not in page:
                    continue
                annots = page.Annots
                for annot in annots:
                    if annot.Type != Name.Annot:
                        continue
                    if annot.Subtype == Name.Widget:
                        if Name.T in annot:
                            annot.Ff=1
            if (i == 49): #only append the first page once
                pdf_out.pages.append(pdf.pages[0])
            pdf_out.pages.append(pdf.pages[1])
            pdf.close()
            pdf = pikepdf.open(directory + "/my_pdf.pdf")
        
        fill_row(pdf, i, row_info)

    pdf.root.AcroForm['/NeedAppearances'] = True

    for page in pdf.pages:
        if Name.Annots not in page:
            continue
        annots = page.Annots
        for annot in annots:
            if annot.Type != Name.Annot:
                continue
            if annot.Subtype == Name.Widget:
                if Name.T in annot:
                    annot.Ff=1

    pdf_out.pages.append(pdf.pages[1])

Я пробовал использовать .append и .extend на pdf_out.pages, чтобы добавить третью страницу.

Метод fill_row ( ...) работает следующим образом.

def fill_row(...):
    ...
    fields = pdf.root.AcroForm.Fields[0].Kids[0].Kids
    fields[row_no].V = str(row_info[0])
    fields[row_no + 20].V = str(row_info[1])
    ...

Кто-нибудь знает, как добавить страницу при дублировании акроформы или как исправить проблему рендеринга / отображения в разных средствах просмотра после использования .append или .extend?

...