如何使用pyPdf反转PDF文件中页面的顺序?
我有一个PDF文件叫“myFile.pdf”。我想用pyPdf这个工具,把它的页面顺序反过来,应该怎么做呢?
4 个回答
3
截至2019年1月(其实早在这之前),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
语句上面可以解决这个具体的问题,但由于Python 2的语法,其他的SyntaxError
错误又会出现。)
幸运的是,它的继任者项目,PyPDF2,在Python 3.6(至少)上运行得很好。看起来它的核心用户接口故意保持了和pyPdf的兼容性,所以在现代Python中可以使用nosklo的回答,只需在pip install PyPDF2
后,将import
语句中的pyPdf
改为PyPDF2
,并把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)
我还建议使用更符合Python风格的方法,直接用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
中是否可用,但现在看来这并不太重要。
4
谢谢你们分享的建议。我根据这些建议做了一些修改,让选择和保存文件的界面看起来更直观一些。我对这些东西还很陌生,我添加的内容可能不是最有效或最简洁的,但对我来说是有效的,所以我想分享出来。
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)
6
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)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。