使用pyPDF删除空白页的Python脚本
我正在尝试用pyPDF写几个Python脚本,把PDF的页面分成六个单独的页面,并且把它们按正确的顺序排列(通常是正反面打印,所以每隔一页的子页面顺序需要不同),最后还要把输出文档中多余的空白页面去掉。
我写了以下这个脚本来切割PDF页面并重新排序。这个脚本把每一页切成两列,然后每列再切成三页。因为我对Python不太熟悉,所以如果有什么做得不对的地方,请多多包涵。
#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for i in range(0,input.getNumPages(),2):
p = input.getPage(i)
q = copy.copy(p)
r = copy.copy(p)
s = copy.copy(p)
t = copy.copy(p)
u = copy.copy(p)
(x, y) = p.mediaBox.lowerLeft
(w, h) = p.mediaBox.upperRight
p.mediaBox.lowerLeft = (x, 2 * h / 3)
p.mediaBox.upperRight = (w / 2, h)
q.mediaBox.lowerLeft = (w / 2, 2 * h / 3)
q.mediaBox.upperRight = (w, h)
r.mediaBox.lowerLeft = (x, h / 3)
r.mediaBox.upperRight = (w / 2, 2 * h / 3)
s.mediaBox.lowerLeft = (w / 2, h / 3)
s.mediaBox.upperRight = (w, 2 * h / 3)
t.mediaBox.lowerLeft = (x, y)
t.mediaBox.upperRight = (w / 2, h / 3)
u.mediaBox.lowerLeft = (w / 2, y)
u.mediaBox.upperRight = (w, h / 3)
a = input.getPage(i+1)
b = copy.copy(a)
c = copy.copy(a)
d = copy.copy(a)
e = copy.copy(a)
f = copy.copy(a)
(x, y) = a.mediaBox.lowerLeft
(w, h) = a.mediaBox.upperRight
a.mediaBox.lowerLeft = (x, 2 * h / 3)
a.mediaBox.upperRight = (w / 2, h)
b.mediaBox.lowerLeft = (w / 2, 2 * h / 3)
b.mediaBox.upperRight = (w, h)
c.mediaBox.lowerLeft = (x, h / 3)
c.mediaBox.upperRight = (w / 2, 2 * h / 3)
d.mediaBox.lowerLeft = (w / 2, h / 3)
d.mediaBox.upperRight = (w, 2 * h / 3)
e.mediaBox.lowerLeft = (x, y)
e.mediaBox.upperRight = (w / 2, h / 3)
f.mediaBox.lowerLeft = (w / 2, y)
f.mediaBox.upperRight = (w, h / 3)
output.addPage(p)
output.addPage(b)
output.addPage(q)
output.addPage(a)
output.addPage(r)
output.addPage(d)
output.addPage(s)
output.addPage(c)
output.addPage(t)
output.addPage(f)
output.addPage(u)
output.addPage(e)
output.write(sys.stdout)
接着我用下面这个脚本来去掉空白页面。
#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for i in range(0,input.getNumPages()):
p = input.getPage(i)
text = p.extractText()
if (len(text) > 10):
output.addPage(p)
output.write(sys.stdout)
问题似乎在于,虽然页面看起来被裁剪了,但文本绘制命令仍然存在。这些页面都不是扫描的,所以如果它们是空白的,那就真的是空白的。有没有人有什么想法,能给我一些不同的建议,或者完全不同的方法来去掉空白页面?我非常感谢任何帮助。
1 个回答
7
PdfFileReader
有一个方法叫 getPage(self, page number)
,这个方法会返回一个对象 PageObject
。而这个 PageObject
里又有一个方法 getContents
,如果页面是空白的,它会返回 None
。所以,你可以用你的 pdf 对象,先用 getNumPages()
获取总页数,然后用 if getPage(i).getContents():
来逐页检查,把有内容的页面编号收集到一个列表里,最后输出这个列表。