#author("2017-10-06T05:54:48+00:00","","")
#author("2018-10-29T01:23:31+00:00","","")
[[Computer/PDF]]

*見開きの書類をスキャンして1ページごとに切り出す [#ge64f919]

**概要 [#x6d07354]

見開きの書類をPDFでスキャンして保存した場合,もとの書類の2ページ分がPDFファイルの1ページ分になりますが(□を書類の1ページ分とするとPDFの1ページが「□□」のようになる),これをもとの書類のように2ページに分割したい場合があります.これをオープンソースのソフトウェアを用いてコマンドラインから実行することを考えます.

次のソフトウェアを用います.

+ghostscript
+pdftk
+(extractbb): TeXLiveなどに付属.

**方法 [#p06fd62b]

ghostscriptを用いるとBoundingBoxの値を取得することができます.

 $ gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox input.pdf
 ...
 %%BoundingBox: 0 0 392 263
 %%HiResBoundingBox: 0.000000 0.000000 391.409426 262.781992

BoundingBox, HiResBoundingBoxの値はx y X Yの順で書かれており,左下が(x, y),右上が(X, Y)です.□を書類の1ページ分とするとPDFの1ページが「□□」のようになっているのがふつうだと思いますので,左ページ(偶数ページ)はBoundingBoxを‘0 0 X/2 Y’に,右ページ(奇数ページ)はBoundingBoxを‘X/2 0 X Y’にしてやれば得ることができます.

まず,input.pdfから左ページのみを切り出してoutput_halve0.pdfを得ます.$Xには上のBoundingBoxのxの値(392)の1/2の値を入れます.$Yにはyの値263を入れます.

 $ gs \
  -o output_halve0.pdf \
  -sDEVICE=pdfwrite \
  -dUseCropBox=true \
  -c "[/CropBox [0 0 $X $Y] /PAGES pdfmark" \
  -f input.pdf

次にinput.pdfから右ページのみを切り出してoutput_halve1.pdfを得ます.

 $ gs \
  -o output_halve1.pdf \
  -sDEVICE=pdfwrite \
  -dUseCropBox=true \
  -c "[/CropBox [$X 0 $XX $Y] /PAGES pdfmark" \
  -f input.pdf

output_halve0.pdfとoutput_halve1.pdfのページを交互に並べます.
output_halve0.pdfとoutput_halve1.pdfのページを交互に並べます.なお,以下は横書きの場合です.縦書きの場合はoutput_halve0.pdfとoutput_halve1.pdfを逆にします.

 $ pdftk output_halve0.pdf output_halve1.pdf shuffle output output_halve2.pdf

できあがったoutput_halve2.pdfのファイル容量はinput.pdfの約2倍になっています.これをもとの容量程度に圧縮してoutput_halve.pdfというファイルを得るには次のようにします.

 $ gs \
   -dBATCH \
   -dNOPAUSE \
   -dQUIET \
   -sDEVICE=pdfwrite \
   -dPDFSETTINGS=/prepress \
   -sOutputFile=output_halve.pdf output_halve2.pdf

以上をスクリプトにすれば大量のPDFファイルを処理することができるでしょう.

BoundingBoxの値を得る方法には考慮の余地があります.どうやらghostscriptを用いるとすべてのページのBoundingBoxを得ようとするようです.すべてのページの大きさが同じ場合はTeXLiveなどに付属しているextractbbコマンドを用いるとBoundingBoxを得ることができますので,この値を読み出すようにすれば処理時間を短くすることができます.


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS