PyPDF2 IOError:[Errno 22] PyPdfFileReader Python 2.7

时间:2015-11-21 02:29:33

标签: python python-2.7 pypdf

目标=打开文件,加密文件,写入加密文件 尝试使用PyPDF2模块来完成此任务。我已经验证了这个"输入"是一个文件类型对象。我已经研究过这个错误,它转换为"找不到文件"。我相信它以某种方式链接到文件/文件路径但不确定如何调试或故障排除。并收到以下错误:

Traceback (most recent call last):
  File "CommissionSecurity.py", line 52, in <module>
    inputStream = PyPDF2.PdfFileReader(input)
  File "build\bdist.win-amd64\egg\PyPDF2\pdf.py", line 1065, in __init__
  File "build\bdist.win-amd64\egg\PyPDF2\pdf.py", line 1660, in read
IOError: [Errno 22] Invalid argument

以下是相关代码。我不确定如何纠正这个问题,因为我不确定问题是什么。任何指导都表示赞赏。

for ID in FileDict:
        if ID in EmailDict : 
            path = "C:\\Apps\\CorVu\\DATA\\Reports\\AlliD\\Monthly Commission Reports\\Output\\pdcom1\\"
            #print os.listdir(path)
            file = os.path.join(path + FileDict[ID])

            with open(file, 'rb') as input:
                print type(input)
                inputStream = PyPDF2.PdfFileReader(input)
                output = PyPDF2.PdfFileWriter()
                output = inputStream.encrypt(EmailDict[ID][1])
            with open(file, 'wb') as outputStream:
                output.write(outputStream)  
        else : continue

3 个答案:

答案 0 :(得分:2)

我认为您的问题可能是因为您使用相同的文件名来打开和写入文件,打开它两次:

with open(file, 'rb') as input :
    with open(file, 'wb') as outputStream :

w模式将截断文件,因此第二行截断输入 我不确定你的意图是什么,因为你无法真正尝试从文件的(开头)读取,同时覆盖它。即使您尝试写入文件的末尾,您也必须将文件指针放在某处。 因此,创建一个具有不同名称的额外输出文件;在两个文件关闭后,您始终可以将该输出文件重命名为输入文件,从而覆盖输入文件。

或者您可以先将完整的文件读入内存,然后写入:

with open(file, 'rb') as input:
    inputStream = PyPDF2.PdfFileReader(input)
    output = PyPDF2.PdfFileWriter()
    output = input.encrypt(EmailDict[ID][1])
with open(file, 'wb') as outputStream:
    output.write(outputStream)  

注意:

  • 您指定inputStream,但从不使用
  • 您将PdfFileWriter()分配给output,然后在下一行中为output分配其他内容。因此,您从未使用过第一个output =行的结果。

请仔细检查您正在做什么,因为您觉得代码存在许多其他问题。

或者,以下是一些可能有用的提示:

documentation建议你也可以使用文件名作为PdfFileReader的第一个参数:

  

stream - 支持标准读取的File对象或对象   并寻找类似于File对象的方法。也可以是一个字符串   表示PDF文件的路径。

所以试试:

inputStream = PyPDF2.PdfFileReader(file)

您还可以尝试将strict参数设置为False

  

strict(bool) - 确定是否应警告用户   问题也导致一些可纠正的问题是致命的。   默认为True。

例如:

inputStream = PyPDF2.PdfFileReader(file, strict=False)

答案 1 :(得分:1)

由于PDF文件为空而引发此错误。 我的PDF文件为空,这就是引起我的错误的原因。因此,首先,我用一些数据填充我的PDF文件,然后使用PyPDF2.PdfFileReader开始对其进行检索,

它解决了我的问题!!!

答案 2 :(得分:-1)

迟到了,您可能正在打开一个无效的 PDF 文件或一个名为 x.pdf 的空文件,并且您认为它是一个 PDF 文件