2015-02-23 5 views
0

Я пытаюсь повернуть страницы в pdf-файл, а затем заменить старые страницы на повернутые в SAME 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") 

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

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

ОШИБКА КОД:

Traceback (most recent call last): File "12-5.py", line 22, in output_PDF.write(output_file) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 264, in write self._sweepIndirectReferences(externalReferenceMap, self._root) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 339, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 315, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 339, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 315, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 324, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, data[i]) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 339, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 315, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 324, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, data[i]) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 345, in _sweepIndirectReferences newobj = data.pdf.getObject(data) File "/usr/lib/pymodules/python2.7/pyPdf/pdf.py", line 649, in getObject retval = readObject(self.stream, self) File "/usr/lib/pymodules/python2.7/pyPdf/generic.py", line 67, in readObject return DictionaryObject.readFromStream(stream, pdf) File "/usr/lib/pymodules/python2.7/pyPdf/generic.py", line 564, in readFromStream raise utils.PdfReadError, "Unable to find 'endstream' marker after stream." pyPdf.utils.PdfReadError: Unable to find 'endstream' marker after stream.

+0

что вы подразумеваете под "It did not work" и "дает ошибку" –

+0

отредактировал с кодом ошибки! – midkin

ответ

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#L14

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может исправить вещи.

+0

1. Попробовал! Многие строки кода ошибки. Начинается с: Traceback (последний последний звонок): Файл «12-5.py», строка 22, в output_PDF.write (output_file) 2. Не знаю, как это сделать! – midkin

+0

Мои извинения - я неправильно прочитал вопрос. См. Мой обновленный ответ. –

+0

ОК, работа os.rename работает! Тем не менее, я считаю, что правильный ответ заключается в том, что то, что я пытаюсь сделать, не может быть сделано таким образом, поскольку PyPDF читает из файла по мере его написания! :) Но если кому-то нужно это сделать БЕЗ создания и сохранения нового файла pdf на своем жестком диске, то уверен, что os.rename - это способ сделать это! И поскольку это tottally делает то, что мне нужно, хотя и не так, как я думал, я выберу это как правильный ответ! :) – midkin

Смежные вопросы