2011-08-13 14 views
8

更新:スクリプトが動作するstardtのおかげで! pdfは別のページです。私はもう一方のスクリプトを試してみましたが、それぞれのpdfページも正しく吐き出しましたが、ページ番号の順序が正しいことがあります。たとえば、pdfファイルのページ25-28では、印刷されたページ番号は14,15,17,16です。なぜ私は不思議に思っていましたか? PDF全体はhttp://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdf私のコードがスキャンされたPDFの各ページを正しく分割しないのはなぜですか?

からダウンロードできます。オリジナル:私はスキャンされたPDFを持っています。ここでは、2つの紙ページがpdfページに並んでいます。私は元の左半分が2つの新しいpdfページの前になるように、pdfページを2つに分割したいと思います。 pdfはenter image description hereのように見えます。ここで

Gillesに触発un2upという名前の私の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) 

私は、コマンドがun2up <page.pdf> out.pdfことで、端末でPDFにスクリプトを試してみましたが、出力out.pdfが正しく分割されません。

私はまた、変数whの値をチェックしp.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を2ページごとに切り替える必要がある理由を知っていますか?これは他の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.upperRightq.mediaBoxを変更することができ、その逆もあります。

@moraesの解決策は、mediaBoxを明示的にコピーすることによってこれを処理します。

関連する問題