2011-06-10 38 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