Форум сайта python.su
Уважаемые форумчане, снова обращаюсь к вам с вопросом.
Появилась задача разбить PDF документ постранично и сохранить каждую страницу в отдельный документ (с именем типа “ИсходноеНазваниеДокумента_НомерСтраницы”). Нашёл библиотеку PyPDF и PyPDF2, но не нашёл примера как сделать разбиение… С объединением в этой библиотеке всё понятно, используя merge(position, file, bookmark=None, pages=None, import_bookmarks=True), а вот про разбиение ничего такого там нет…
Подскажите, может ещё есть какие-то библиотеки для работы с ПДФ в Питоне, или же в этой можно это как-то реализовать?
Офлайн
from pyPdf import PdfFileWriter, PdfFileReader output = PdfFileWriter() input_PDF = PdfFileReader(file('C:/Python/hello.pdf', "rb")) for i in range(input_PDF.getNumPages()): new_File_PDF = input_PDF.getPage(i) output.addPage(new_File_PDF) outputStream = file('output_'+i+'.pdf', wb) output.write(outputStream) outputStream.close()
Traceback (most recent call last): File "C:\Python\PDFrazbienie.py", line 1, in <module> from pyPdf import PdfFileWriter, PdfFileReader File "C:\Python\pyPdf\__init__.py", line 1, in <module> from pdf import PdfFileReader, PdfFileWriter File "C:\Python\pdf.py", line 655 raise Exception, "file has not been decrypted" ^ SyntaxError: invalid syntax
Отредактировано SunIsUp (Июнь 15, 2017 15:17:15)
Офлайн
from PyPDF2 import PdfFileWriter, PdfFileReader output = PdfFileWriter() input_PDF = PdfFileReader(open('C:/Python/PDF/PyPDF2/hello.pdf', 'rb')) for i in range(input_PDF.getNumPages()): new_File_PDF = input_PDF.getPage(i) output.addPage(new_File_PDF) print (new_File_PDF) outputStream = open("output_"+i+".pdf", "wb") output.write(outputStream) outputStream.close()
outputStream = open("output_"+i+".pdf", "wb")
Офлайн
Доделал, всё работает)
from PyPDF2 import PdfFileWriter, PdfFileReader output = PdfFileWriter() input_PDF = PdfFileReader(open('C:/Python/PDF/PyPDF2/hello.pdf', 'rb')) count = 0 for i in range(input_PDF.getNumPages()): new_File_PDF = input_PDF.getPage(i) output.addPage(new_File_PDF) print (new_File_PDF) output_Name_File = "output"+str(count)+".pdf" outputStream = open(output_Name_File, 'wb') output.write(outputStream) outputStream.close() count += 1
Офлайн
всё же некорректно…(
в первый файл записал 1 страницу, во второй 1 и 2, в третий файл 1,2,3 страницы и т.д.
Офлайн
SunIsUpНе та версия питона.File "C:\Python\pdf.py", line 655
raise Exception, "file has not been decrypted"
^
SyntaxError: invalid syntax
SunIsUpНаверное, из-за этой строки
в первый файл записал 1 страницу, во второй 1 и 2, в третий файл 1,2,3 страницы и т.д.
SunIsUpНадо заново делать output на каждом шаге цикла или просто поискать в самом этом объекте обнуление.output.addPage(new_File_PDF)
Отредактировано py.user.next (Июнь 16, 2017 01:44:18)
Офлайн
А как сделать обнуление, подскажите, пожалуйста?
from PyPDF2 import PdfFileWriter, PdfFileReader output = PdfFileWriter() input_PDF = PdfFileReader(open('C:/Python/PDF/PyPDF2/hello.pdf', 'rb')) for i in range(input_PDF.getNumPages()): new_File_PDF = input_PDF.getPage(i) output.addPage(new_File_PDF) output_Name_File = "output_"+str(i+1)+".pdf" outputStream = open(output_Name_File, 'wb') output.write(outputStream) outputStream.close()
Офлайн
Похоже, что нет обнуления у неё
http://pythonhosted.org/PyPDF2/PdfFileWriter.html
SunIsUpЭту строку можешь внутрь цикла занести самой первой строкой.output = PdfFileWriter()
Офлайн
Пробовал уже делать то, что вы советуете, вот что выходит:
Traceback (most recent call last): File "C:\Python\PDF\PyPDF2\PDFrazbienie.py", line 10, in <module> output.write(outputStream) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 482, in write self._sweepIndirectReferences(externalReferenceMap, self._root) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 572, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 572, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 557, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, data[i]) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 572, in _sweepIndirectReferences self._sweepIndirectReferences(externMap, realdata) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 589, in _sweepIndirectReferences newobj = self._sweepIndirectReferences(externMap, newobj) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 589, in _sweepIndirectReferences newobj = self._sweepIndirectReferences(externMap, newobj) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 548, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, value) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 557, in _sweepIndirectReferences value = self._sweepIndirectReferences(externMap, data[i]) File "C:\Python\PDF\PyPDF2\PyPDF2\pdf.py", line 575, in _sweepIndirectReferences if data.pdf.stream.closed: AttributeError: 'PdfFileWriter' object has no attribute 'stream'
Офлайн
SunIsUpНапиши сам код, который ты сделал.
Пробовал уже делать то, что вы советуете, вот что выходит:
Офлайн