2015-11-15 40 views
2

Here我發現這個代碼拆分pdf頁面。pyPdf如何理解文檔邊界?

#!/usr/bin/env python 
import copy, sys 
from pyPdf import PdfFileWriter, PdfFileReader 
input = PdfFileReader(sys.stdin) 
output = PdfFileWriter() 
for p in [input.getPage(i) for i in range(0,input.getNumPages())]: 
    q = copy.copy(p) 
    (w, h) = p.mediaBox.upperRight 
    p.mediaBox.upperRight = (w/2, h) 
    q.mediaBox.upperLeft = (w/2, h) 
    output.addPage(p) 
    output.addPage(q) 
output.write(sys.stdout) 

如果一個頁面包含四個另一頁是這樣的:

+-------+-------+ 
| 1 | 2 | 
|-------+-------| 
| 3 | 4 | 
+-------+-------+ 

然後代碼將其分割到兩頁(按照這個順序)含有另外兩個頁面:

+-------+-------+ 
| 3 | 4 | 
+-------+-------+ 

+-------+-------+ 
| 1 | 2 | 
+-------+-------+ 

你可以測試它,例如在following文件上。如果我理解正確upperRightupperLeft(等)在代碼中提到的變量,那麼這是所看到pyPdf文檔表示:

UL(0,10)  UR(10,10) 
+-------+-------+ 
| 1 | 2 | 
|-------+-------| 
| 3 | 4 | 
+-------+-------+ 
LL(0,0)   LR(10,0) 

UL(x,y) = UpperLeft 
UR(x,y) = UpperRight 
LL(x,y) = LowerLeft 
LR(x,y) = LowerRight 

據提到代碼:

(w, h) = p.mediaBox.upperRight 
p.mediaBox.upperRight = (w/2, h) 
q.mediaBox.upperLeft = (w/2, h) 

我期待這個輸出:

p: 
+-------+ 
| 1 | 
|-------+ 
| 3 | 
+-------+ 

q: 
+-------+ 
| 2 | 
|-------+ 
| 4 | 
+-------+ 

我在這裏失蹤了什麼?

+0

你得到了什麼,而不是你所期望的? – usr2564301

+0

它在後文中描述,請參見圖2.我期待垂直分割,但是相反,我會以相反的順序進行水平分割。 –

回答

4

在PDF有2種方式來獲得一個橫向頁面:

  1. 定義頁面寬度>高度。
  2. 定義一個縱向頁面(寬度爲<高度)和一個旋轉角度(90度,270度等)。

您的示例PDF使用第二種方式:所有頁面均爲595x842,旋轉270度。不考慮旋轉會導致垂直被解釋爲水平,反之亦然。

+0

謝謝你的回覆。請問我怎樣才能使用pyPdf獲得頁面的度數,以及是否有一些通用的方法將第二種方法轉換爲第一種?我發現只有特定頁面的旋轉'input.getPage(0).rotateCounterClockwise(90)'但我怎麼知道應該旋轉到多少度? –

+0

對不起,我不熟悉pyPdf。快速瀏覽文檔並沒有揭示獲取輪換的方法。另外,似乎沒有辦法遍歷PDF對象結構。如果可能的話,這只是檢索頁面字典並獲取/ Rotate值的問題。 – rhens

+0

這個問題解決了嗎? – Steinfeld