今日も微速転進

ここではないどこかへ

某雑誌の総集編から特定の連載記事だけ抜き取りたい (その2)


スポンサーリンク

前回の続き。PDFファイルに対する目次の追加は次回。

a244.hateblo.jp

前提

  • macOS
  • Python 3.6

工程

  1. PDFファイルの暗号化の解除(シェルスクリプトでqpdfコマンドを呼び出す)
  2. PDFファイルから目次情報(document outline, Bookmark)を取り出してファイルに書き出す(シェルスクリプトでpdftkコマンドを使う)
  3. 目次情報のファイルを扱いやすいようにTSV形式にしつつ、終了ページ番号を付加する
  4. PDFを分割して特定の連載記事の部分を取り出し、一つのファイルに連結
  5. 余力があれば目次情報を追加

上記の1. と2. が前回の記事。前回の記事では3. が不完全だったのでこの記事ではその辺を改善しつつ、PDFの分割・結合まで。

スクリプト

その1

pdftkコマンドの、dump_data_utf8オプションの出力をファイルに出力してあることが前提。

pdftkコマンドの`dump_data_utf8`オプションの出力ファイルから目次(Bookmar ...

あとはこのファイルを、grepするか何とかして、qpdfでもpdftkでもmutoolあたりに渡してやれば良い。ただ、単純にgrepすると順序がおかしいのでそこは考慮する必要がある。

$ grep -h  "どんとこい! フロントエンド開発" data/page_index/index_webdb_*
webdb_vol100.pdf    どんとこい! フロントエンド開発【第2回】AMP対応でモバイルサイトを高速表示! ◆脇崎 正俊、安部 洋平、安川 潤一 126 135
webdb_vol101.pdf    どんとこい! フロントエンド開発【第3回】Vue.jsでお手軽UI構築 ◆穴井 宏幸、加藤 隆一郎、加藤 佑典、金 昌熙  130 139
webdb_vol102.pdf    どんとこい! フロントエンド開発【第4回】MobXでらくらく状態管理 ◆穴井 宏幸 138 147
webdb_vol99.pdf どんとこい! フロントエンド開発【第1回】入門webpack 2  ◆穴井 宏幸    125 133

いわゆるナチュラルソートが必要。シェルスクリプトでやるならsortコマンドの-Vオプション。

sortコマンドで覚えておきたい使い方9個(+3個) | 俺的備忘録 〜なんかいろいろ〜

$ grep -h  "どんとこい! フロントエンド開発" data/page_index/index_webdb_* | sort -V
webdb_vol99.pdf どんとこい! フロントエンド開発【第1回】入門webpack 2  ◆穴井 宏幸    125 133
webdb_vol100.pdf    どんとこい! フロントエンド開発【第2回】AMP対応でモバイルサイトを高速表示! ◆脇崎 正俊、安部 洋平、安川 潤一 126 135
webdb_vol101.pdf    どんとこい! フロントエンド開発【第3回】Vue.jsでお手軽UI構築 ◆穴井 宏幸、加藤 隆一郎、加藤 佑典、金 昌熙  130 139
webdb_vol102.pdf    どんとこい! フロントエンド開発【第4回】MobXでらくらく状態管理 ◆穴井 宏幸 138 147

あとはawkで頑張ればいける。macOSのawkgawkではない点だけ注意。

その2

sortコマンドの-Vオプションの存在を知ったことだし、シェルスクリプトでやってみる。

#/bin/bash

while getopts k:d:o: OPT
do
    case $OPT in
        k)  KEYWORD=$OPTARG
            ;;
        d)  DATA_DIR=$OPTARG
            ;;
        o)  OUTPUT=$OPTARG
            ;;
    esac
done

shift $((OPTIND - 1))

if [ -z "$OUTPUT" ] ;then
    OUTPUT='output.pdf'
fi

#echo $KEYWORD $DATA_DIR

PAGE_RANGE=$(grep -h "${KEYWORD}"  "${DATA_DIR}"/index_webdb_* | sort -V | awk -F'\t' '{printf "%s %d-%d ", $1, $3, $4 }')

#echo ${PAGE_RANGE}

mutool merge -o ${OUTPUT} ${PAGE_RANGE}

使い方は以下のように。シェルスクリプトをextract_and_mergepdf.shというファイル名で保存したという前提。

  • -d:上記のPythonスクリプトの出力データのあるディレクトリ
  • -k:取り出したい連載記事のタイトル
  • `-o':出力ファイル名(省略した場合はoutput.pdf) 

やっつけスクリプトなので総集編のPDFのあるディレクトリで実行する必要あり。

$ bash extract_and_mergepdf.sh -d data/page_index -k "どんとこい! フロントエンド開発"

PDFの目次(document outline)がないので不便ですが、連載記事だけ取り出すところまでは成功。

課題など

面倒なことをしなくても、Coherent PDF(cpdf)ならいい感じに目次の情報(しおり)を引き継いでくれるかも。

community.coherentpdf.com

ただし、商用利用は不可。

汎用性の問題

ファイル配置のディレクトリ構造とか、シェルスクリプトで作業している部分とか、汎用性なし。

ファイルのパスの扱い

極力、pathlibを使うようにしているけど中途半端。

Pythonスクリプトでハマったところ

Python でリストを指定した文字列を挟んでjoinするとき、リストに数値が混ざっているとエラーになる。

TypeError: sequence item 0: expected string, int found – せつないぶろぐ

いきなりTypeErrorとか言われてもわからない。

対処としてはstrで文字列化するか、あるいは上記リンク先のコメント欄にあるようにmapstr関数を指定するか。

まとめ

あと1回は続きます。

目次の見出し項目とページ番号は著作権の保護の対象でしょうか。勝手に対応表アップロードすると怒られるのかな。

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

  • 作者: 川合史朗,秋葉拓哉,中嶋謙互,木村廉,酒井政裕,ninjinkun,渡辺訓章,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/04/26
  • メディア: 単行本
  • この商品を含むブログを見る

PDF構造解説

PDF構造解説

広告