2011-06-10 204 views
7

我想用pyPDF编写几个python脚本将PDF页分割成六个单独的页面,并对它们进行正确排序(通常是正面和背面都打印,所以每隔一个页面需要使用它子页面排序不同),并在输出文档的末尾删除生成的空白页面。使用pyPDF删除空白页的Python脚本

我写了下面的脚本来剪下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 2011-06-10 19:46:33

+0

这不是一个真正的答案,所以我会将它作为评论发布。整个事情一旦完成就需要放入iOS应用程序中。我使用了一个设置来绘制原始PDF的相应区域,以确定最终的空白页数。这不是理想的,但它的工作原理。 – rpeck1682 2011-06-16 22:47:23

回答

5

PdfFileReader有一个方法,getPage(self, page number)返回对象,PageObject,这反过来有一个方法getContents,这将返回None如果页面是空白的。因此,使用您的pdf对象getNumPages(),与if getPage(i).getContents():重复,将匹配收集到要输出的页码列表中。

+0

谢谢!我显然已经使用了几年前的pyPdf副本,但没有getContents()方法。自从我对原帖发表评论(不是解决方案,完全不同的路线)中描述的路线以来,我还没有测试过这个解决方案。如果我需要回到这里,我将使用getContents()作为起点。 – rpeck1682 2011-06-20 20:56:28