【问题标题】:PyPDF2 returning blank PDF after copyPyPDF2在复制后返回空白PDF
【发布时间】:2017-06-05 18:59:37
【问题描述】:
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。

【问题讨论】:

    标签: python python-3.x pypdf2


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这似乎有效(在我的特定示例中,必须在将其发送到垃圾箱之前关闭它)。您似乎是正确的,因为 pdfReader 需要保持打开状态,直到 pdfWriter 写入并关闭。我想我有一个错误的假设,即“getPage”函数创建了作者所需的所有信息。如果作者依赖于仍然打开的阅读器,即使您已经从中存储了一个页面对象,这似乎违反直觉。再次感谢!
    【解决方案2】:

    即使在使用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 个小时。这就是为什么我认为我应该为别人写一个答案

    【讨论】:

    • 如果我们需要循环附加到 PDF,您会如何建议尝试此解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多