使用pyPDF删除空白页的Python脚本

10 投票
1 回答
10296 浏览
提问于 2025-04-16 19:20

我正在尝试用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(): 来逐页检查,把有内容的页面编号收集到一个列表里,最后输出这个列表。

撰写回答