Python PyPDF2 поиск закрытого файла Ошибка - PullRequest
0 голосов

Я делаю 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 голосов
/ 05 июня 2018

Ваша логика не имеет большого смысла, в нескольких местах.


Во-первых, проблема, о которой вы спрашиваете.Посмотрите, что вы делаете с pdf_file и pdf_reader:

  1. Откройте файл как pdf_file.
  2. Создайте PdfFileReader, прикрепленный к pdf_file как pdf_reader.
  3. Повторно открыть тот же файл, что и pdf_file.Это освобождает старый файл, превращая его в мусор, поэтому он скоро (обычно сразу) закрывается.
  4. Неоднократно вызывайте getPage(:-1) для pdf_reader, который, вероятно, присоединяется к закрытому файлу в первый рази определенно каждый раз после этого.
  5. Создайте новый PdfFileReader с файлом, который мы открыли на шаге 3, как pdf_reader.
  6. Закройте pdf_file, который вы только что открыли, поэтомуpdf_reader теперь определенно ссылается на закрытый файл.
  7. Повторите шаги 2-6.

Вам необходимо выполнить шаг 4 до шага 3, или после шага 5, или вынеобходимо иметь две разные переменные pdf_file, чтобы вы могли открыть новую, все еще используя старую.Я не уверен, какой из трех вы хотите, но как есть, вы читаете из закрытого файла.

Но я думаю, что было бы проще реорганизовать вещи, чтобы исключить шаг 1 - вместо попыткичтобы открыть вещи перед циклом, а затем снова открыть вещи в конце каждого цикла, вы просто открываете вещи в начале цикла, там, где вам это нужно.


Во-вторых, ваш писатель так же, каксмущенный.Посмотрите, что вы делаете с output_file и pdf_writer:

  1. Создайте PdfFileWriter как pdf_writer.
  2. Неоднократно добавляйте к нему страницы.
  3. Откройте выходной файл как output_file.
  4. Создайте новый PdfFileWriter как pdf_writer, отбрасывая все, что вы записали в старый.
  5. Запишите пустой сейчас pdf_writerна output_file.
  6. Повторите шаги 2-5.

Опять же, вам нужно выполнить шаг 5 где-то еще, вероятно, до шага 4. Но, опять же, это, вероятно, многоПроще реорганизовать вещи, чтобы исключить шаг 1.

0 голосов

Извините, полагаю, я слишком быстро отвечаю на этот вопрос.Я переместил pdf.writer и pdf.reader в начало цикла for, так как кажется, что он блокирует код (поток для записи pdf).

...