关闭文件E的Python PyPDF2 seek

2024-10-01 15:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个pdf拆分器,起初似乎工作得很好。但是,当我尝试使用多个页面区域时,总是会遇到这样的错误-->ValueError:seek of closed file。 如果我省略pdf_文件.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() 

Tags: formatcloseoutputpdfcounteropenreaderfile2
2条回答

你的逻辑没有多大意义,在很多地方。在


首先,你要问的问题。看看你用pdf_filepdf_reader做了些什么:

  1. pdf_file格式打开文件。在
  2. 创建一个附加到pdf_filePdfFileReader,作为pdf_reader。在
  3. 重新打开与pdf_file相同的文件。这会释放旧文件,使其成为垃圾,因此很快(通常是立即)关闭它。在
  4. pdf_reader上反复调用getPage(:-1),这可能是第一次附加到一个关闭的文件中,之后肯定每次都会这样。在
  5. 用我们在步骤3中打开的文件创建一个新的PdfFileReader,作为pdf_reader。在
  6. 关闭刚刚打开的pdf_file,因此pdf_reader现在肯定在引用一个关闭的文件。在
  7. 重复步骤2-6。在

您需要在步骤3之前或步骤5之后执行步骤4,或者需要有两个不同的pdf_file变量,以便在仍然使用旧变量的同时打开新的变量。我不知道你想要哪三个,但事实上,你正在从一个封闭的文件中读取。在

但我认为,重新组织事物以消除步骤1会更简单,而不是尝试在循环之前打开东西,然后在每个循环结束时重新打开东西,你只需在循环的开始处打开东西,就在你需要的地方。在


第二,你的作者也很困惑。看看你用output_filepdf_writer做了些什么:

  1. PdfFileWriter创建为pdf_writer。在
  2. 重复添加页面。在
  3. output_file的形式打开输出文件。在
  4. 创建一个新的PdfFileWriter作为pdf_writer,丢弃你写给旧文件的所有内容。在
  5. 写出现在空的pdf_writeroutput_file。在
  6. 重复步骤2-5。在

同样,您需要在其他地方执行步骤5,可能在步骤4之前。但是,同样地,重新组织事物以消除步骤1可能要简单得多。在

对不起,我想我回答这个问题太快了。 我搬家了pdf.writer以及pdf.reader到for循环的开头,因为它似乎是块代码(用于编写pdf的流)。在

相关问题 更多 >

    热门问题