Python скрипт для удаления пустых страниц с помощью pyPDF - PullRequest
7 голосов
/ 10 июня 2011

Я пытаюсь написать пару сценариев Python, используя pyPDF, чтобы разделить страницы 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 Ответ

5 голосов
/ 18 июня 2011

PdfFileReader имеет метод getPage(self, page number), который возвращает объект, PageObject, который в свою очередь имеет метод getContents, который будет возвращать None, если страница пуста. Итак, с вашим pdf-объектом getNumPages() итерируйте с if getPage(i).getContents():, собирая попадания в список номеров страниц для вывода.

...