PDFを「予約解除」する方法


10

小冊子形式にしたpdfファイルがあります。A4用紙に横向きで印刷するためのものです。これはPDFの2ページであり、実際の本の4ページに対応しているはずです。

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

括弧で囲まれた番号は、個々のページの順序に対応しています。

Linuxにはあらゆる種類のコマンド(pdfbook、pdfnupなど)があることを知っています(おそらくこのブックレットを最初に作成するために使用されていました)。どうすれば「予約を解除」できますか?つまり、これから、最終製品の各ページが通常の方法で並べられたpdfの個別のページであるpdfドキュメントを作成します。

編集する

Gillesのおかげで、次のコードをなんとか使用できました。

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    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(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)


@AdamZalcmanなんで?彼はLinuxプログラムを探しています
Michael Mrozek

2
この質問への回答(Gillesによる)を問題適応させることができます。つまり、PyPdfスクリプトを作成します。
sr_ 2012年

3ページと4ページを入れ替えていませんか?私は印刷に携わってきました。そのレイアウトは意味をなさない....
ワイルドカード'10年

回答:


4

これが、PyPdfライブラリを使用した小さなPythonスクリプトです。(から派生un2up)と呼ばれるスクリプトに保存し、unbook実行可能にして(chmod +x unbook)、フィルターとして実行します(unbook <book.pdf >1up.pdf)。

このスクリプトをの出力でテストしましたpdfbook --signature=N。別の方法では、他のすべての入力ページを逆にする必要がない場合があり、ページの順序が異なる場合があります(ランドスケープページの向きによって異なります)。ページの処理が質問と一致しません。13,42は私には意味がありません(4ページのブックでは、3は1の横ではなく2の横にあるはずです)。

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

非推奨の警告は無視してください。PyPdfメンテナのみがこれらに関係する必要があります。


これは先ほど尋ねられましたが、ソリューションの実装に問題があります。私はOSXを実行していて、MacPorts経由でpythonとpy27-pypdfをインストールしています。unbookファイルを作成し、スクリプトをコピーして貼り付けました。指示どおりにコマンドを実行すると、0バイトの新しい1up.pdfファイルが作成されます。私の端末にはエラーや何も表示されていませんが、コマンドを実行しても何も起こりません(CTRL-Cで出力する必要があります)。システムはハングアップせず、何も実行していないように見えます。問題を追跡するにはどうすればよいですか?@ギレス
TSGM

@TSGM最も可能性の高い説明は<、入力ファイルの前を忘れたというものです。コマンドを正しく作成したことが本当に確実である場合、それはPyPdfライブラリのバグである可能性があります(まだ失敗していませんが、発生する可能性があります)。
Gilles 'SO-悪をやめる'

問題は、「python unbook <in.pdf> out.pdf」を介してpythonを呼び出すことになっていたということでした。愚かな私。また、あなたのコードは少し奇妙でした(最後の方にsecond_halfページを貼り付けていました。元の投稿で書いた形式に合わせて修正したようです)。最終的に使用したコードが含まれるように元の応答を編集しました。また、ページサイズコマンドが間違っているようです。それも修正しました。@ギレス
TSGM

@TSGMこのコードは、通常のブックレイアウトである1 | 4表、2 | 3逆のレイアウトを想定しています。ページのレイアウトが異なる場合は、微調整が必​​要になる場合があります。それはその設定でフィールドテストされました。あなたが明示的に電話しpythonなければならないのは私の間違いでした:私はシバン行を入れるべきだった、と付け加えました。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.