web-dev-qa-db-ja.com

PDFでページを分割

1つの仮想ページ(pdfファイルのページ)で2ページをスキャンしたPDFファイルをスキャンしました。

解像度は良質です。問題は、読みながらズームし、左から右にドラッグする必要があることです。
このPDFファイルを通常のページに変換できるコマンド(convertpdftk、...)またはスクリプトがあります(本の1ページ= PDFファイルの1ページ) )?

72
xralf

小さなPythonスクリプトを使用した PyPdfライブラリ を使用したスクリプト)は、適切に機能します。un2up(または任意の名前)というスクリプトに保存して、それは実行可能(chmod +x un2up)であり、フィルターとして実行します(un2up <2up.pdf >1up.pdf)。

#!/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)

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

入力の方向が変わっている場合は、ページを切り捨てるときに別の座標を使用する必要がある場合があります。参照 スキャンしたPDFのすべてのページがコードで正しく分割されないのはなぜですか?


役に立つ場合に備えて、2つのツールといくつかの手動介入の組み合わせを使用する私の以前の答えは次のとおりです。

  • Pdfjam (少なくともバージョン2.0) pdfpages LaTeXパッケージに基づいて、ページをトリミングします。
  • Pdftk 、左半分と右半分を一緒に戻します。

私が知る限り、pdfpagesは1つのストリーム内の同じページに2つの異なる変換を適用できないため、両方のツールが必要です。 pdftkの呼び出しで、42を入力ドキュメントのページ数(2up.pdf)に置き換えます。

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf

Pdfjam 2.0がない場合は、pdfpagesパッケージを使用してPDFLaTeXをインストールするだけで十分です(Ubuntuの場合: texlive-latex-recommendedInstall texlive-latex-recommended およびおそらく(Ubuntuの場合: texlive-fonts-recommendedInstall texlive-fonts-recommended )、および次のドライバーファイルdriver.texを使用します。

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}

次に、次のコマンドを実行し、42を入力ファイル(2up.pdfと呼ばれる必要があります)のページ数で置き換えます。

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf

pythonスクリプト(および他のいくつかの解決策))に問題があったため、追加しただけです。私にとっては、mutoolはうまく機能しました。これは、エレガントなmupdfリーダーに付属するシンプルで小さな追加です。 :

mutool poster -y 2 input.pdf output.pdf

水平分割の場合、yxに置き換えます。もちろん、この2つを組み合わせてより複雑なソリューションにすることもできます。

これを見つけて本当に幸せです(毎日何年ものmupdfの使用後:)

mutoolには、バージョン1.4以降のmupdfが付属しています: http://www.mupdf.com/news


ソースからmupdfmutoolをインストールする:

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
Sudo make prefix=/usr/local install

または ダウンロードページ に移動して、新しいバージョンを見つけます。

60
martz

Imagemagickは、1つのステップでそれを行うことができます。

$ convert in.pdf -crop 50%x0 +repage out.pdf
18
tomas

Gilles および 検索方法PDFページ数 からの回答に基づく

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven

だから私は走ることができます

./split.sh my.pdf 50 1.2

ここで、調整マージンは50、スケールは1.2です。

6
Anton Bessonov

ImageMagickのConvertコマンドは、ファイルを2つの部分にトリミングするのに役立ちます。参照 http://www.imagemagick.org/Usage/crop/

私があなただったら、次のような(シェル)スクリプトを書きます。

  1. pdfsam でファイルを分割します。1ページ=ディスク上の1ファイル(形式は問題ではありません。ImageMagickが認識しているファイルを選択してください。PSまたはPDFを使用します。
  2. 各ページについて、 前半をクロップ し、$ {PageNumber} Aという名前のファイルに配置します

  3. 後半を切り取り、$ {PageNumber} Bという名前のファイルに入れます。

    1A.pdf、1B.pdf、2A.pdf、2B.pdfなどを取得します。

  4. ここで、これを新しいPDFに再度アセンブルします。 これを行うには多くの方法があります。
6
tiktak

Gillesが投稿したPyPDFコードのバリエーションを以下に示します。この関数は、ページの向きが何であっても機能します。

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()
4
moraes

最良の解決策は、上記のmutoolです。

Sudo apt install mupdf-tools pdftk

分割:

mutool poster -y 2 input.pdf output.pdf

ただし、ページを左に回転する必要があります。

pdftk output.pdf cat 1-endleft output rotated.pdf
3

moraes solution が機能しませんでした。主な問題はx5とx6の計算でした。ここでは、オフセットを考慮する必要があります。つまり、lowerLeftが(0,0)にない場合

これが、PyPDF2とpython 3:

import copy
import math
import PyPDF2
import sys
import io 

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

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

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

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

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)

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

        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.lowerLeft = (x1, x6)
            p.mediaBox.upperRight = (x3, x4)

            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()

if __name__ == "__main__":
    if ( len(sys.argv) != 3 ):
        print ('Usage: python3 double2single.py input.pdf output.pdf')
        sys.exit(1)

    split_pages(sys.argv[1], sys.argv[2])
1
vbar

AskUbuntuの Benjaminによる回答 に基づいて、 gscan2pdf と呼ばれるGUIツールの使用をお勧めします。

  1. インポートPDFファイルをgscan2pdfにスキャンします。非画像PDFファイルは機能しない可能性があります。スキャン大丈夫なので心配する必要はありません。

    enter image description here

  2. ドキュメントのサイズによっては、時間がかかる場合があります。ロードされるまで待ちます。

  3. Ctrl + Aを押してすべてのページを選択し、必要に応じて回転(Ctrl + Shift + C)します。

    enter image description here

  4. Tools >> Clean upに移動します。 Layoutasdoubleおよび#output pages = 2を選択します。

    enter image description here

  5. [〜#〜] ok [〜#〜]を押して、ジョブが完了するまで待ちます。

    enter image description here

  6. 保存PDFファイル。完了。

1