9

更新:スクリプトが機能する startdt に感謝します! pdfは別のページです。他のスクリプトでスクリプトを試してみましたが、各 pdf ページも正しく吐き出しましたが、ページ番号の順序が正しい場合と間違っている場合があります。たとえば、pdf ファイルの 25 ~ 28 ページでは、印刷されたページ番号は 14、15、17、16 です。PDF 全体はhttp://download304.mediafire.com/u6ewhjt77lzg/bgf8uzvxatckycn/3.pdfからダウンロードできます。

オリジナル:スキャンした pdf があります。2 つの紙のページが 1 つの pdf ページに並んでいます。PDFページを2つに分割したいと思います。元の左半分が2つの新しいPDFページの前になります。pdfは次のようになりここに画像の説明を入力ます。

Gillesun2upにインスパイアされた名前の 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が正しく分割されません。

変数wとの値h、 の出力もチェックしましたp.mediaBox.upperRightが、それらは5141224であり、実際の比率に基づいて正しく見えません。

ファイルはhttp://download851.mediafire.com/bdr4sv7v5nzg/raci13ct5w4c86j/page.pdfからダウンロードできます。

4

3 に答える 3

7

あなたのコードはそれが (0,0) であると想定していますp.mediaBox.lowerLeftが、実際には (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)
于 2011-08-13T00:43:34.923 に答える
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()
于 2013-04-01T10:37:30.427 に答える
0

mediaBox変数がコピー間で共有されていないことに注意する必要があることを付け加えたいと思いpますq. これは、コピーを取得する前にから読み取ると、簡単に発生する可能性がp.mediaBoxあります。

その場合、eg への書き込みp.mediaBox.upperRightは変更される可能性がq.mediaBoxあり、その逆も同様です。

@moraes のソリューションは、mediaBox を明示的にコピーすることでこれを処理します。

于 2013-08-14T10:18:40.890 に答える