У меня есть функция, которая шифрует 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 секунд).Это странно, так как первый файл в этой функции работает отлично, но второй (любой второй файл) повреждает его.
Кто-нибудь знает, как поступить?Это застряло у меня навсегда.Спасибо!