2011-08-13 13 views
8

更新:感謝stardt的腳本工作! pdf是另一個頁面。我在另一個腳本上嘗試了腳本,它也正確地吐出每個pdf頁面,但頁碼的順序有時是正確的,有時是錯誤的。例如,在pdf文件的第25-28頁中,打印的頁碼是14,15,17,16。我想知道爲什麼?整個pdf可以從http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf爲什麼我的代碼沒有正確分割掃描的pdf中的每一頁?

原始碼:我有一個掃描的pdf,其中兩個紙張並排放在一個PDF頁面。我想將pdf頁面分成兩部分,最初的左半部分成爲兩個新的pdf頁面中較早的部分。 pdf看起來像enter image description here

這是我的一個名爲un2up通過Gilles啓發Python腳本:

#!/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.upperLeft = (0, h/2) 
    p.mediaBox.upperRight = (w, h/2) 
    p.mediaBox.lowerRight = (w, 0) 
    p.mediaBox.lowerLeft = (0, 0) 

    q.mediaBox.upperLeft = (0, h) 
    q.mediaBox.upperRight = (w, h) 
    q.mediaBox.lowerRight = (w, h/2) 
    q.mediaBox.lowerLeft = (0, h/2) 

    output.addPage(q) 
    output.addPage(p) 
output.write(sys.stdout) 

我嘗試了劇本中的PDF與命令是un2up <page.pdf> out.pdf終端,但輸出out.pdf沒有正確分割。

我還檢查變量whp.mediaBox.upperRight輸出的價值觀,他們是5141224不看的權利根據自己的實際比例。

該文件可以從http://download851.mediafire.com/bdr4sv7v5nzg/raci13ct5w4c86j/page.pdf下載。

回答

7

你的代碼假定p.mediaBox.lowerLeft是(0,0),但它實際上是(0,497)

本工程爲您提供的文件:

#!/usr/bin/env python 
import copy, sys 
from pyPdf import PdfFileWriter, PdfFileReader 
input = PdfFileReader(sys.stdin) 
output = PdfFileWriter() 
for i in range(input.getNumPages()): 
    p = input.getPage(i) 
    q = copy.copy(p) 

    bl = p.mediaBox.lowerLeft 
    ur = p.mediaBox.upperRight 

    print >> sys.stderr, 'splitting page',i 
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft 
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight 

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2) 
    p.mediaBox.lowerLeft = bl 

    q.mediaBox.upperRight = ur 
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2) 
    if i%2==0: 
     output.addPage(q) 
     output.addPage(p) 
    else: 
     output.addPage(p) 
     output.addPage(q) 

output.write(sys.stdout) 
+0

謝謝!有用! pdf是另一個頁面。我在另一個腳本上嘗試了腳本,它也正確地吐出每個pdf頁面,但頁碼的順序有時是正確的,有時是錯誤的。例如,在pdf文件的第25-28頁中,打印的頁碼是14,15,17,16。我想知道爲什麼?整個pdf可以從http://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf – Tim

+0

下載@Tim我更新了代碼,以便它顛倒每隔一頁的拆分順序。這會正確地分割您的文件。 – stardt

+0

謝謝! (1)你知道爲什麼我們每隔兩頁需要切換'p'和'q'頁嗎?這是其他pdf文件的共同點,或只是特定於此? (2)我還想知道如何理解pdf頁面上的座標系,即p.mediaBox.lowerLeft是我們在查看pdf文件時看到的實際左下角或右上角?是我們看到的沿水平或垂直方向的第一個座標嗎? – Tim

1

@ stardt的代碼是非常有用的,但我有問題分裂一批不同方向的pdf文件。這裏有一個更普遍的功能,將工作無論頁面方向是什麼:

import copy 
import math 
import pyPdf 

def split_pages(src, dst): 
    src_f = file(src, 'r+b') 
    dst_f = file(dst, 'w+b') 

    input = pyPdf.PdfFileReader(src_f) 
    output = pyPdf.PdfFileWriter() 

    for i in range(input.getNumPages()): 
     p = input.getPage(i) 
     q = copy.copy(p) 
     q.mediaBox = copy.copy(p.mediaBox) 

     x1, x2 = p.mediaBox.lowerLeft 
     x3, x4 = p.mediaBox.upperRight 

     x1, x2 = math.floor(x1), math.floor(x2) 
     x3, x4 = math.floor(x3), math.floor(x4) 
     x5, x6 = math.floor(x3/2), math.floor(x4/2) 

     if x3 > x4: 
      # horizontal 
      p.mediaBox.upperRight = (x5, x4) 
      p.mediaBox.lowerLeft = (x1, x2) 

      q.mediaBox.upperRight = (x3, x4) 
      q.mediaBox.lowerLeft = (x5, x2) 
     else: 
      # vertical 
      p.mediaBox.upperRight = (x3, x4) 
      p.mediaBox.lowerLeft = (x1, x6) 

      q.mediaBox.upperRight = (x3, x6) 
      q.mediaBox.lowerLeft = (x1, x2) 

     output.addPage(p) 
     output.addPage(q) 

    output.write(dst_f) 
    src_f.close() 
    dst_f.close() 
+0

我似乎無法得到這個工作。與@stardt不同,這個產生一個空文件。任何想法@moraes? –

0

我想補充一點,你必須付出你的mediaBox變量不能跨越副本pq共同關注。 如果您在複製之前從p.mediaBox中讀取數據,很容易發生這種情況。

在這種情況下,寫入例如p.mediaBox.upperRight可修改q.mediaBox,反之亦然。

@moraes的解決方案通過顯式複製mediaBox來解決這個問題。

相關問題