PyPDF2复制后返回空白PDF

时间:2017-06-05 18:59:37

标签: python python-3.x pypdf2

def EncryptPDFFiles(password, directory):
    pdfFiles = []
    success = 0

    # Get all PDF files from a directory
    for folderName, subFolders, fileNames in os.walk(directory):
        for fileName in fileNames:
            if (fileName.endswith(".pdf")):
                pdfFiles.append(os.path.join(folderName, fileName))
    print("%s PDF documents found." % str(len(pdfFiles)))

    # Create an encrypted version for each document
    for pdf in pdfFiles:
        # Copy old PDF into a new PDF object
        pdfFile = open(pdf,"rb")
        pdfReader = PyPDF2.PdfFileReader(pdfFile)
        pdfWriter = PyPDF2.PdfFileWriter()
        for pageNum in range(pdfReader.numPages):
            pdfWriter.addPage(pdfReader.getPage(pageNum))
        pdfFile.close()

        # Encrypt the new PDF and save it
        saveName = pdf.replace(".pdf",ENCRYPTION_TAG)
        pdfWriter.encrypt(password)
        newFile = open(saveName, "wb")
        pdfWriter.write(newFile)
        newFile.close()
        print("%s saved to: %s" % (pdf, saveName))


        # Verify the the encrypted PDF encrypted properly
        encryptedPdfFile = open(saveName,"rb")
        encryptedPdfReader = PyPDF2.PdfFileReader(encryptedPdfFile)
        canDecrypt = encryptedPdfReader.decrypt(password)
        encryptedPdfFile.close()
        if (canDecrypt):
            print("%s successfully encrypted." % (pdf))
            send2trash.send2trash(pdf)
            success += 1

    print("%s of %s successfully encrypted." % (str(success),str(len(pdfFiles))))

我跟随Pythons Automate the Boring Stuff部分。我在复制PDF文档时遇到过问题但是现在每次运行程序时,我复制的PDF都是空白页面。我新加密的PDF页面数量正确,但它们都是空白的(页面上没有内容)。我之前发生了这种情况,但无法重现。在我关闭文件之前,我试过睡觉。我不确定在Python中打开和关闭文件的最佳做法是什么。作为参考,我使用Python3。

2 个答案:

答案 0 :(得分:3)

尝试将pdfFile.close移动到for循环的最后。

for pdf in pdfFiles:
    #
    # {stuff}
    #
    if (canDecrypt):
        print("%s successfully encrypted." % (pdf))
        send2trash.send2trash(pdf)
        success += 1

    pdfFile.close()

我们的想法是,当pdfWriter最终写出时,pdfFile需要可用并打开,否则它无法访问页面来写新文件。

答案 1 :(得分:0)

即使使用writer.addPage(your_page_name)将页面添加到pdf后仍获得空白页的问题是上下文管理器。 您必须确保没有关闭要从中读取页面的pdf。

例如:

with open(str(_pdf), "rb") as in_f:
    reader = PdfFileReader(in_f)
    _page = reader.getPage(0)
    writer = PdfFileWriter()
    writer.addPage(_page)

with open(_filename, "wb+") as out_f:
    writer.write(out_f)

这将无效,因为上下文管理器正在关闭文件句柄。该文件必须是打开的,因此我们必须缩进它。如下所示:

with open(str(_pdf), "rb") as in_f:
    reader = PdfFileReader(in_f)
    _page = reader.getPage(0)
    writer = PdfFileWriter()
    writer.addPage(_page)

    with open(_filename, "wb+") as out_f:
        writer.write(out_f)

我知道这没什么大不了的,但是从字面上看,这使我拔掉了头发,压痕浪费了我6个小时。这就是为什么我认为我应该为别人写一个答案