PyPdf2 - заполненные поля пропадают при конвертации в изображение - PullRequest
0 голосов
/ 23 апреля 2020

У меня проблема с тем, что все поля, которые я заполнил, исчезли после преобразования в изображение с помощью библиотеки pdf2image.

/ атрибут NeedAppearances помог сделать его отображаемым для предварительного просмотра, но когда я преобразовал PDF в image все поля пропали.

Не уверен, что это поможет, но когда PDF открывается из Acrobat Reader (после того, как все поля заполнены), файл отображается как несохраненное состояние и просит меня сохранить его. После сохранения файла из Acrobat Reader все поля отображаются при преобразовании в изображение.

Можно ли установить атрибут для блокировки (или сохранения) поля?

Заранее спасибо .

 def fill(self, data_dict):
        input_stream = open(self.SOURCE, "rb")
        pdf_reader = PyPDF2.PdfFileReader(input_stream, strict=False)
        if "/AcroForm" in pdf_reader.trailer["/Root"]:
            pdf_reader.trailer["/Root"]["/AcroForm"].update(
                {NameObject("/NeedAppearances"): BooleanObject(True)})

        pdf_writer = PyPDF2.PdfFileWriter()
        self.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)})

        pdf_writer.addPage(pdf_reader.getPage(0))
        page = pdf_writer.getPage(0)
        for j in range(0, len(page['/Annots'])):
            writer_annot = page['/Annots'][j].getObject()
            for field in data_dict:
                if writer_annot.get('/T') == field:
                    writer_annot.update({
                        NameObject("/Ff"): NumberObject(1)
                    })

        pdf_writer.updatePageFormFieldValues(page, data_dict)

        with open(self.DESTINATION, 'wb') as fh:
            pdf_writer.write(fh)

        input_stream.close()

        self.convert_to_image()
        return self.DESTINATION_IMG

    def convert_to_image(self):
        images = convert_from_path(self.DESTINATION)
        images[0].save(self.DESTINATION_IMG, 'JPEG')

    @staticmethod
    def set_need_appearances_writer(writer):
        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
...