コマンドラインを使用して、各 PDF ページを 2 ページに分割するにはどうすればよいですか?

コマンドラインを使用して、各 PDF ページを 2 ページに分割するにはどうすればよいですか?

オリジナルからスキャンした電子書籍が何冊かあります。それらは1冊にまとめられるようフォーマットされています。PDFページ2つ含む実際のページ: 左側に 1 つ、右側に 1 つ。

プログラムで各 PDF ページを 2 つに分割し、PDF ページ 1 の左 50% がページ 1 になり、右がページ 2 になり、すべてのページが同様に分割されるようにします。

これに役立つコマンドラインユーティリティまたはスクリプトを知っている人はいますか?


出力元pdfimages -list -f 1 -l 1 file.pdf:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    1921  1561  rgb     3   8  jpeg   no       643  0   200   200  200K 2.3%
   1     1 stencil     1     1  -       1   1  image  no   [inline]   0.692     2    -    - 
   1     2 stencil     1     1  -       1   1  image  no   [inline]   0.722 0.650    -    - 
   1     3 stencil     1     1  -       1   1  image  no   [inline]       3     3    -    - 

2番目のPDF:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     456   625  gray    1   8  jpx    yes      251  0    72    72 11.7K 4.2%

答え1

これは機能するはずですが、pdftkツール ( およびghostscript) が必要です。

簡単なケース:

第一歩:個別のページに分割

 pdftk clpdf.pdf burst

pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdfこれにより、ページごとに 1 つのファイルが生成されます。また、doc_data.txtページのサイズを含む も生成されます。

ステップ2:左半分と右半分のページを作成する

  pw=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $2}'`
  ph=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $3}'`
  w2=$(( pw / 2 ))
  w2px=$(( w2*10 ))
  hpx=$((  ph*10 ))
  for f in  pg_[0-9]*.pdf ; do
   lf=left_$f
   rf=right_$f
   gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
   gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${w2} 0]>> setpagedevice" -f ${f}
  done

ステップ3:newfile.pdf単一ページの .pdfを生成するために、左と右を結合します。

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

より一般的なケース:

  1. 上記の例では、すべてのページが同じサイズであると仮定しています。doc_data.txtファイルには分割された各ページのサイズが含まれています。コマンド

    grep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l

    1を返さない場合は、ページのサイズが異なり、追加のロジックが必要になります。ステップ2

  2. 分割が正確に 50:50 でない場合は、w2=$(( pw / 2 ))上記の例で使用した式よりも適切な式が必要になります。

この 2 番目の例では、より一般的なケースを処理する方法を示します。

第一歩:pdftk以前と同じように分割する

ステップ2:ここで、各ページの幅と高さ、および左ページが使用する分割の割合のデフォルトを含む 3 つのファイルを作成します。

  grep PageMediaDimensions <doc_data.txt | awk '{print $2}'    >   pws.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print $3}'    > phs.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print "0.5"}' > lfrac.txt

異なるページを分割する場所に関する情報が利用可能な場合は、ファイルをlfrac.txt手動で編集できます。

ステップ3:次に、異なるページ サイズと (編集した場合) 分割の異なる小数点位置を使用して、左と右の分割ページを作成します。

#!/bin/bash
exec 3<pws.txt
exec 4<phs.txt
exec 5<lfrac.txt

for f in  pg_[0-9]*.pdf ; do
 read <&3 pwloc
 read <&4 phloc
 read <&5 lfr
 wl=`echo "($lfr)"'*'"$pwloc" | bc -l`;wl=`printf "%0.f" $wl`
 wr=$(( pwloc - wl ))
 lf=left_$f
 rf=right_$f
 hpx=$((  phloc*10 ))
 w2px=$(( wl*10 ))
 gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
 w2px=$(( wr*10 ))
 gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${wl} 0]>> setpagedevice" -f ${f}
done

ステップ4:これは、前のより単純な例と同じマージ手順です。

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

答え2

次のようにPDFをPostScriptに変換し、停止開いた本からスキャンしたと思われる 2 ページが表示されている A4 縦向きのページから開始し、次のように背表紙が中央を水平に通っているものと想定します。

オリジナル

当然のことながら、以下のソリューションの値を実際のケースに合わせて変更できます。

pdf2psこの PDF を(ghostscript パッケージの一部)を使用して PostScript に変換できます。次に、 pstopspsutils パッケージのツールを使用して、ページを左下隅を軸に右 (時計回り) に回転し、サイズを変更して、結果を上に移動し、ページ全体を下半分だけで覆うことができます。

1ページ

同じ元のページから、同様の回転、拡大縮小、および移動を行うことで 2 ページ目を作成できます。結果は PDF に変換し直すことができます。1 つのコマンドで、各ページを 2 つの新しいページに描画できます。

pdf2ps myfile.pdf out.ps
pstops -p a4 '[email protected](1cm,29cm),[email protected](-16cm,29cm)' out.ps new.ps
ps2pdf new.ps new.pdf

構文はマニュアル ページで説明されています。ここではR、右に回転するには @1.2 を使用し、結果を移動するには (x,y) を使用します。コンマ (,) により、元の各ページから 2 ページが生成されます。

この場合、各ページは 2 回完全に描画されますが、1 回に表示されるのはページの半分だけなので、生成される PDF のサイズは 2 倍になることに注意してください。

答え3

コマンドラインのソリューションを具体的に求めているのは、おそらく、座ってすべてのページを選択したくないからでしょう。

しかし、すべての本を開くことが許容される場合は、pdfarranger機能します。

PDF ファイルのサイズが 2 倍になることはありません。

分割する前に 分割後

答え4

以下をご覧くださいimagemagick:

$ convert -resize 1000x1000 /links/www/Salix/pdf/index.pdf a.jpg
$ convert -crop 500x1000+0+0  a.jpg b.jpg
$ convert -crop 500x1000+500+0 a.jpg c.jpg
$ convert c.jpg c.pdf
$ convert b.jpg b.pdf

関連情報