使用pyPDF编写Python脚本来删除空白页

10
我正在尝试使用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
更新:如果我在Acrobat中打开第一个脚本的结果,然后使用“另存为...”,它会从头开始重新构建文件。然后当我运行第二个脚本时,它按照我想要的方式工作。我需要一种方法来编写脚本,以执行Acrobat在“另存为...”中执行的过程,以便在不需要Acrobat本身的脚本中使用。 - rpeck1682
这并不是一个真正的答案,所以我会将其发布为评论。一旦完成,整个东西需要放入iOS应用程序中。我只能通过绘制原始PDF的适当区域,并设置识别末尾空白页数的方式来解决问题。虽然不是理想的解决方案,但它可以工作。 - rpeck1682
1个回答

7

PdfFileReader有一个方法getPage(self, page number),返回一个对象PageObject,它又有一个方法getContents,如果页面为空,则返回None。所以,使用您的pdf对象getNumPages(),用if getPage(i).getContents():迭代,将结果收集到一个页码列表中以输出。


谢谢!显然我一直在使用一个几年前的pyPdf副本,它没有getContents()方法。我没有测试这个解决方案,因为我采用了原帖中的评论所描述的路线(不是解决方案,而是完全不同的路线)。如果我将来需要回到这里,我会以getContents()作为起点。 - rpeck1682

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接