Как изменить порядок страниц в файле PDF, используя pyPdf? - PullRequest
2 голосов
/ 24 марта 2011

У меня есть файл PDF "myFile.pdf". Я хотел бы изменить порядок страниц, используя pyPdf . Как?

Ответы [ 3 ]

4 голосов
/ 25 марта 2011
from pyPdf import PdfFileWriter, PdfFileReader
output_pdf = PdfFileWriter()

with open(r'input.pdf', 'rb') as readfile:
    input_pdf = PdfFileReader(readfile)
    total_pages = input_pdf.getNumPages()
    for page in xrange(total_pages - 1, -1, -1):
        output_pdf.addPage(input_pdf.getPage(page))
    with open(r'output.pdf', "wb") as writefile:
        output_pdf.write(writefile)
2 голосов
/ 21 января 2019

Спасибо за обмен предложениями. Я использовал их и немного отредактировал, чтобы сделать интерфейс более графическим при выборе и сохранении файла. Новое для всего этого, и то, что я добавил, может быть неэффективным или чистым, но это сработало для меня и поделилось.

from PyPDF2 import PdfFileWriter, PdfFileReader
import tkinter as tk
from tkinter import filedialog
import ntpath
import os


output_pdf = PdfFileWriter()

# grab the location of the file path sent
def path_leaf(path):
    head, tail = ntpath.split(path)
    return head

# graphical file selection
def grab_file_path():
    # use dialog to select file
    file_dialog_window = tk.Tk()
    file_dialog_window.withdraw()  # hides the tk.TK() window
    # use dialog to select file
    grabbed_file_path = filedialog.askopenfilename()
    return grabbed_file_path


# file to be reversed
filePath = grab_file_path()

# open file and read
with open(filePath, 'rb') as readfile:
    input_pdf = PdfFileReader(readfile)

    # reverse order one page at time
    for page in reversed(input_pdf.pages):
        output_pdf.addPage(page)

    # graphical way to get where to select file starting at input file location
    dirOfFileToBeSaved = path_leaf(filePath)
    locationOfFileToBeSaved=filedialog.asksaveasfilename(initialdir=dirOfFileToBeSaved, initialfile='name of reversed file.pdf',title="Select or type file name and location", filetypes=[("pdf files", "*.pdf")])
    # write the file created
    with open(locationOfFileToBeSaved, "wb") as writefile:
        output_pdf.write(writefile)

# open the file when done
os.startfile(locationOfFileToBeSaved)
0 голосов
/ 13 января 2019

Начиная с (задолго до) января 2019 года, pyPdf больше не обновляется и после тестирования не совместим (по крайней мере) с Python 3.6 и, скорее всего, вообще с Python 3:

In [1]: import pyPdf
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-bba5a42e9137> in <module>
----> 1 import pyPdf

c:\temp\envminecart\lib\site-packages\pyPdf\__init__.py in <module>
----> 1 from pdf import PdfFileReader, PdfFileWriter
      2 __all__ = ["pdf"]

ModuleNotFoundError: No module named 'pdf'

(Перемещение назначения __all__ над import устраняет эту конкретную проблему, но всплывают другие SyntaxError из-за синтаксиса Python 2.)

К счастью, проект-преемник, PyPDF2 , работает на Python 3.6 (по крайней мере). Похоже, что основной API, ориентированный на пользователя, намеренно поддерживался как совместимый с pyPdf, поэтому ответ nosklo можно использовать в современном Python после pip install PyPDF2, просто изменив на PyPDF2 в выражении import и переключение xrange на range:

from PyPDF2 import PdfFileWriter, PdfFileReader
output_pdf = PdfFileWriter()

with open(r'input.pdf', 'rb') as readfile:
    input_pdf = PdfFileReader(readfile)
    total_pages = input_pdf.getNumPages()
    for page in range(total_pages - 1, -1, -1):
        output_pdf.addPage(input_pdf.getPage(page))
    with open(r'output.pdf', "wb") as writefile:
        output_pdf.write(writefile)

Я бы также рекомендовал более Pythonic подход - просто перебирать страницы напрямую, используя reversed:

from PyPDF2 import PdfFileWriter, PdfFileReader

output_pdf = PdfFileWriter()

with open('input.pdf', 'rb') as readfile:
    input_pdf = PdfFileReader(readfile)

    for page in reversed(input_pdf.pages):
        output_pdf.addPage(page)

    with open('output.pdf', "wb") as writefile:
        output_pdf.write(writefile)

Я не знаю, была ли эта .pages коллекция доступной в оригинальном pyPdf, но, возможно, на данный момент это не имеет большого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...