自炊本をスマートフォンで読むための convertガナス

第2回 本文を分割する

2015.07.23

前回は「余白を削除する」について書きました。

余白を削除するだけで読めるサイズになるのですが 1ページとしては横幅が300ドットくらいスマホの画面をはみ出しています。画面からはみだしている部分を読むためにスクロール操作が必要となります。

今、読んでいる箇所がスクロールするところなのか、次のページに行くところなのか、よくわからなくなり、文章を読んでいることに集中している時には結構ストレスになります。この問題を解消するために1ページを幅720ドットに分割し、1ページがスマホの1画面におさまる pdf を生成することにします。(この記事ではスマホの画面は幅720ドット高さ1280ドットとしています。)

以下は元文書から余白を削除した1ページ目(右)と2ページ目(左)です。グレイの縦線のところがページの区切りです。1ページ目と2ページ目の幅が異なりますが、これは1ページ目の余白が多かったためです。

以下が各ページを幅720ドットで再構成したものです。グレイの縦線のところがページの区切りです。

分割のアルゴリズム

処理が複雑になるのでプログラムを作成します。分割のアルゴリズムは以下の通りです。

  1. pdf を画像に変換します。
  2. 変換した画像の余白を削除します。
  3. 高さをスマートフォンの画面の高さ(1280ドット)にリサイズします。
  4. 画像をスマートフォンの画面の幅(720ドット)に切ります。
  5. 切った残りの部分は次のページに結合します。
  6. 結合した画像について 4,5 を繰り返します。
  7. 720x1280 のサイズにした全ての画像を pdf に変換します。

分割のスクリプト

上記の処理をスクリプトにすると以下のようになります。

src.pdf から dest.pdf を生成します。なお、画像切り出し位置は前回同様、始点(27,213) 幅1150ドット,高さ1293ドットの文書を使用しています。

#! /bin/bash
# スマートフォン画面サイズ
width=720
height=1280

# 画像切り出し位置
x=27
y=213
w=1150
h=1293

SRC=src.pdf  # 元文書

#1. pdf を画像に変換します。
pdftoppm  ${SRC} aa

#2. 変換した画像の余白を削除します。
mogrify -crop ${w}x${h}+${x}+${y} -trim *.ppm

#3. 高さをスマートフォンの画面の高さ(1280ドット)にリサイズします。
mogrify  -resize x${height} *.ppm

# 切り出した画像を保存するディレクトリ
/bin/rm -fr crop
mkdir -p crop

# 切り出した画像ページ数
PAGE=1
# 切った残り部分
REMAIN=crop/remain.ppm
# 最初、切った残り部分はないのでダミーデータ作成
convert -size 1x${height} xc:white ${REMAIN}

# スクリプトの組み方の都合で 4,5,6 の順番は前後しています。
#6. 結合した画像について 4,5 を繰り返します。
for img in *.ppm
do
  #5. 切った残りの部分は次のページに結合します。
  convert +append ${img} ${REMAIN} ${REMAIN}

  # 画像が幅720ドットより大きい場合, #4 の切り出しを繰り返します。
  while w=`identify -format %w ${REMAIN}` && [ $w -gt ${width} ]
  do
    p=`printf %03d $PAGE`
    # 4. 画像をスマートフォンの画面の幅(720ドット)に切ります。
    xremain=`expr ${w} - ${width}`
    convert -crop ${width}x${height}+${xremain}+0 ${REMAIN} crop/${p}.ppm

    # 切った残りの部分を抽出します。
    convert -crop ${xremain}x${height}+0+0 ${REMAIN} ${REMAIN}
    PAGE=`expr $PAGE + 1`
  done
done

#7.  720x1280 のサイズにした全ての画像を pdf に変換します。
convert crop/*.ppm  dest.pdf

使用するファイル

分割のスクリプト、元文書、生成した文書は以下からダウンロードできます。

pdftoppm, convert, mogrify, identify コマンドを使用しますのでインストールされていない場合は、以下でインストールします。

$ sudo apt-get install poppler-utils # pdftoppm のインストール
$ sudo apt-get install imagemagick   # convert, mogrify, identify のインストール

スクリプト実行

src.pdf をカレントディレクトリに置いて、スクリプトを実行すると dest.pdf が作成されます。

$ sh conv.sh

aa-1.ppm aa-2.ppm aa-3.ppm crop が生成されますが、dest.pdf 作成過程のファイルですので、削除して問題ないです。

$ /bin/rm -r aa-1.ppm  aa-2.ppm  aa-3.ppm  crop

綴じ方向を右綴じにする

作成したpdfは綴じ方向が左綴じになっています。縦書の文書の綴じ方向は右綴じなのでスマホのpdfリーダーの設定で右綴じに変更する必要があります。

おわりに

これで画面内にページがおさまり、スクロールしなくてもすみ、読書に集中できます。

しかし、720ドットでページを切ったところの文字が切れていたり、余白が多いページの文字が巨大になったりする場合があります。それでも読めるので読めるのですが、すこし不便です。

次回はそのあたりの調整を行います。

著者プロフィール

naka

すきなコマンドは awk と bc です。なにかを計算する時、awk か bc を使います。

記事一覧Index