Python PyPDF2寻求关闭文件错误

时间:2018-06-04 23:46:58

标签: python python-3.x pypdf pypdf2

我正在制作一个pdf分割器,起初似乎工作正常。但是当我尝试使用多个页面区域时,我不断收到此错误 - > ValueError:寻找已关闭的文件。 如果我省略pdf_file.close(),则错误将停止,但所有创建的pdf都没有页面。 我的代码在这里:

from PyPDF2 import PdfFileReader , PdfFileWriter

counter = 1
pdf_file = open(fileName2,'rb')
pdf_reader = PdfFileReader(pdf_file)
pdf_writer = PdfFileWriter()
output_file2 , _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", fileName2_c2+"_splited", "Folder will be created")
os.makedirs(r'{}'.format(output_file2+"\\{}_splited".format(fileName2_c2)))

for z in list_pdf_split:
    try:
        pdf_file = open(fileName2,'rb')
    except:
        print("error")
    print(z)
    c_z = z.split("-")

    for i in range(int(c_z[0]),int(c_z[1])+1):
        print(i)


        pdf_writer.addPage(pdf_reader.getPage(i-1))


    output_file = open(output_file2+"\\{}_splited".format(fileName2_c2)+"{}".format(counter)+".pdf",'wb')


    pdf_reader = PdfFileReader(pdf_file)
    pdf_writer = PdfFileWriter()
    pdf_writer.write(output_file)
    output_file.close()
    counter +=1
    pdf_file.close() 

2 个答案:

答案 0 :(得分:1)

你的逻辑在多个地方都没有多大意义。

首先,你要问的问题。查看您使用pdf_filepdf_reader执行的操作:

  1. pdf_file打开文件。
  2. 创建一个PdfFileReader作为pdf_file附加到pdf_reader
  3. 重新打开与pdf_file相同的文件。这会释放旧文件,导致它变成垃圾,因此很快(通常会立即)关闭。
  4. getPage(:-1)上反复拨打pdf_reader,这可能是第一次附加到已关闭的文件,而且绝对是每次都关闭。
  5. 使用我们在步骤3中打开的文件PdfFileReader创建一个新的pdf_reader
  6. 关闭您刚刚打开的pdf_file,因此pdf_reader现在肯定是引用已关闭的文件。
  7. 重复步骤2-6。
  8. 您需要在步骤3之前或步骤5之后执行步骤4,或者您需要有两个不同的pdf_file变量,以便在仍然使用旧变量时打开新变量。我不确定你想要的三个中的哪一个,但是原来,你是从一个封闭的文件中读取的。

    但我觉得重新组织事情以消除第1步更简单 - 而不是试图在循环之前打开东西,然后在每个循环结束时重新打开东西,你只需在循环开始时打开东西,右边你需要它的地方。

    其次,你的作家同样困惑。查看您使用output_filepdf_writer执行的操作:

    1. PdfFileWriter设为pdf_writer
    2. 反复向其添加页面。
    3. output_file打开输出文件。
    4. 创建一个新的PdfFileWriter作为pdf_writer,丢弃您写入旧内容的所有内容。
    5. 将现在为空的pdf_writer写到output_file
    6. 重复步骤2-5。
    7. 同样,你需要在其他地方执行第5步,可能在第4步之前。但是,再一次,重新组织事情以消除第1步可能要简单得多。

答案 1 :(得分:0)

抱歉,我想我回答这个问题太快了。 我将pdf.writer和pdf.reader移到了for循环的开头,因为它似乎阻塞了代码(用于编写pdf的流)。