Функция записи PyPDF2 повреждает файл PDF - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть функция, которая шифрует PDF.Я использую его несколько раз для разных документов, поэтому каждый раз он выполняется в цикле с другим файлом.Я использую пакет PyPDF2, и каждый раз, когда функция выполняет следующие действия:

def manual_encrypting(folder_path, file_name):

  # creates a new pdf_writer and a pdf_reader
  pdf_writer = PdfFileWriter()
  pdf_reader = PdfFileReader(folder_path + "/" + file_name)

  # creates an output file to save a new, encrypted file
  output_pdf = folder_path + "/english/secured documents/" + file_name

  # iterates through and saves all pages of this tutorial
  for page in range(pdf_reader.getNumPages()):
          pdf_writer.addPage(pdf_reader.getPage(page))

  #encrypts a PDF
  pdf_writer.encrypt(user_pwd='', owner_pwd='some_password', 
                         use_128bit=True)

  #and the last step, it writes to a new file to output_pdf
  with open(output_pdf, 'wb') as fh:
          pdf_writer.write(fh)

Первый файл, обработанный этой функцией, полностью зашифрован и сохранен в нужном месте.Второй файл в строке также обрабатывается, шифруется и сохраняется, но он поврежден, и я не могу открыть его с помощью Adobe Reader (с сообщением об ошибке «При открытии этого документа произошла ошибка. Файл поврежден и не может быть восстановлен»).Программа полностью вылетает, и компьютер становится очень громким.Когда я жду достаточно долго, я получаю код выхода 3489660927.

Проблема лежит в pdf_writer.write(fh) 100%.Вопрос в том, почему?Раньше я использовал точно такой же синтаксис для разделения PDF на 17 частей, и он работал отлично, все файлы были в рабочем состоянии.

Моя отладка была такой:

  • Я проверил, если этоошибка файла, но после замены на другую проблема не исчезла
  • Я добавил несколько отпечатков перед записью и после, чтобы проверить, какие значения хранятся в разных переменных.Строки выглядят так:

    with open(output_pdf, 'wb') as fh:
        print("I'm getting in")
        print(fh)
        print(output_pdf)
        print(pdf_writer)
        pdf_writer.write(fh)
        print("I'm getting out")
    

Вывод для этого следующий (для двух итераций функция находится в цикле):

I'm getting in
<_io.BufferedWriter name='C:/Users/marta.pozaroszczyk/Desktop/script/Manuals/00/english/secured tutorials/2D-0-Gen-Info.pdf'>
C:/Users/marta.pozaroszczyk/Desktop/script/Manuals/00/english/secured tutorials/2D-0-Gen-Info.pdf
<PyPDF2.pdf.PdfFileWriter object at 0x000001D2E39A6780>
I'm getting out
the end of manual_encrypting function
I'm getting in
<_io.BufferedWriter name='C:/Users/marta.pozaroszczyk/Desktop/script/Manuals/X2D-2-Reference.pdf'>
C:/Users/marta.pozaroszczyk/Desktop/script/Manuals/X2D-2-Reference.pdf
<PyPDF2.pdf.PdfFileWriter object at 0x000001D2E4FCEFD0>
[Finished in 10.0s]

Итак,как видите, переменные каждый раз получают разные значения.Затем происходит сбой до строки pdf_writer.write(fh) и печать после этого не производится.Я должен принудительно остановить программу (таким образом, закончил через 10 секунд).Это странно, так как первый файл в этой функции работает отлично, но второй (любой второй файл) повреждает его.

Кто-нибудь знает, как поступить?Это застряло у меня навсегда.Спасибо!

...