Как редактировать файл pdf, заменяя его данные?

Я пытаюсь повернуть страницы в PDF-файл, а затем заменить старые страницы на повернутые в одном и том же PDF-файле.

Я написал следующий код:

#!/usr/bin/python

import os
from pyPdf import PdfFileReader, PdfFileWriter

my_path = "/home/USER/Desktop/files/"

input_file_name = os.path.join(my_path, "myfile.pdf")
input_file = PdfFileReader(file(input_file_name, "rb"))
input_file.decrypt("MyPassword")
output_PDF = PdfFileWriter()

for num_page in range(0, input_file.getNumPages()):
    page = input_file.getPage(num_page)
    page.rotateClockwise(270)
    output_PDF.addPage(page)

#Trying to replace old data with new data in the original file, not
#create a new file and add the new data!
output_file_name = os.path.join(my_path, "myfile.pdf")
output_file = file(output_file_name, "wb")
output_PDF.write(output_file)
output_file.close()

Приведенный выше код дает мне ошибку! Я даже пытался использовать:

input_file = PdfFileReader(file(input_file_name, "r+b"))

но это тоже не сработало...

Смена строки:

output_file_name = os.path.join(my_path, "myfile.pdf")

с:

output_file_name = os.path.join(my_path, "myfile2.pdf")

все исправляет, но это не то, что я хочу...

Любая помощь?

КОД ОШИБКИ:

Трассировка (последний вызов был последним): файл "12-5.py", строка 22, в файле output_PDF.write(файл_входа) "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", строка 264, в записи файла self._sweepIndirectReferences(externalReferenceMap, self._root) "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", строка 339, в файле _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) "/ usr / lib / pymodules / python2.7 / pyPdf / pdf.py ", строка 315, в значении _sweepIndirectReferences = self._sweepIndirectReferences(externMap, value) Файл" /usr/lib/pymodules/python2.7/pyPdf/pdf.py ", строка 339, в _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) Файл "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", строка 315, в _sweepIndirectReferences value = self._sweepIndirectReferences(externMap), /usr/lib/pymodules/python2.7/pyPdf/pdf.py ", строка 324, в значении _sweepIndirectReferences = self._sweepIndirectReferences(externMap, data[i]) файл" /usr/lib/pymodules/python2.7/pyPdf /pdf.py ", строка 339, в _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) Файл "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", строка 315, в _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value / lib) файл / " /pymodules/python2.7/pyPdf/pdf.py ", строка 324, в значении _sweepIndirectReferences = self._sweepIndirectReferences(externMap, data[i]), файл" /usr/lib/pymodules/python2.7/pyPdf/pdf.py ", строка 345, в _sweepIndirectReferences newobj = data.pdf.getObject(data) Файл" /usr/lib/pymodules/python2.7/pyPdf/pdf.py ", строка 649, в getObject retval = readObject(self.stream, self) Файл "/usr/lib/pymodules/python2.7/pyPdf/generic.py", строка 67, в readObject возвращает файл DictionaryObject.readFromStream(stream, pdf) файл "/usr/lib/pymodules/python2.7/pyPdf /generic.py ", строка 564, в readFromStream поднять utils.PdfReadError, " Невозможно найти маркер "конечного потока" после потока." pyPdf.utils.PdfReadError: Невозможно найти маркер "конечного потока" после потока.

1 ответ

Решение

Я подозреваю, что проблема заключается в том, что PyPDF читает из файла во время его записи.

Правильное исправление - как вы заметили - это запись в отдельный файл, а затем замена исходного файла новым. Что-то вроде этого:

output_file_name = os.path.join(my_path, "myfile-temporary.pdf")
output_file = file(output_file_name, "wb")
output_PDF.write(output_file)
output_file.close()
os.rename(output_file_name, input_file_name)

Я написал немного кода, который упрощает это: https://github.com/shazow/unstdlib.py/blob/master/unstdlib/standard/contextlib_.py

from unstdlib.standard.contextlib_ import open_atomic

with open_atomic(input_file_name, "wb") as output_file:
    output_PDF.write(output_file)

Это автоматически создаст временный файл, запишет в него и заменит исходный файл.

редактировать: я изначально неправильно прочитал вопрос. Ниже мой неправильный, но потенциально полезный для других людей ответ.

Ваш код в порядке, и должен работать без проблем на "большинстве" PDF-файлов.

Проблема, которую вы видите, - это несовместимость между PyPDF и конкретным PDF, который вы пытаетесь использовать. Это может быть ошибка в PyPDF или PDF не полностью действителен.

Вы можете попробовать две вещи:

  1. Посмотрите, может ли PyPDF2 прочитать файл. Установите PyPDF2 с pip install PyPDF2заменить import pyPdf … с import PyPDF2 …, а затем повторно запустите ваш скрипт.

  2. Используйте другую программу, чтобы перекодировать ваш PDF и посмотреть, работает ли он. Например, используя что-то вроде convert bad.pdf bad.ps; convert bad.ps maybe-good.pdf может исправить вещи.

Другие вопросы по тегам