我有一个加密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秒钟内完成)。这很奇怪,因为此功能中的第一个文件可以正常工作,但是第二个文件(任何第二个文件)会损坏它。
有人知道如何进行吗?它使我永远陷入困境。谢谢!