コマンドラインを使用して各PDFページを2つのページに分割するには?

コマンドラインを使用して各PDFページを2つのページに分割するには?

原稿からスキャンした電子ブックが複数冊あります。単一の形式で構成されます。PDFページ2個入っています実際のページ:左側に一つ、右側に一つ。

プログラム的に各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)が必要です。

簡単なケース:

ステップ1:別のページへ

 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番目の例は、より一般的なケースを処理する方法を示しています。

ステップ1: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 

おすすめ記事