某雑誌の総集編から特定の連載記事だけ抜き取りたい (その2)
スポンサーリンク
前回の続き。PDFファイルに対する目次の追加は次回。
前提
- macOS
- Python 3.6
工程
- PDFファイルの暗号化の解除(シェルスクリプトでqpdfコマンドを呼び出す)
- PDFファイルから目次情報(document outline, Bookmark)を取り出してファイルに書き出す(シェルスクリプトでpdftkコマンドを使う)
- 目次情報のファイルを扱いやすいようにTSV形式にしつつ、終了ページ番号を付加する
- PDFを分割して特定の連載記事の部分を取り出し、一つのファイルに連結
- 余力があれば目次情報を追加
上記の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のawk
はgawk
ではない点だけ注意。
その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)ならいい感じに目次の情報(しおり)を引き継いでくれるかも。
ただし、商用利用は不可。
汎用性の問題
ファイル配置のディレクトリ構造とか、シェルスクリプトで作業している部分とか、汎用性なし。
ファイルのパスの扱い
極力、pathlibを使うようにしているけど中途半端。
Pythonスクリプトでハマったところ
Python でリストを指定した文字列を挟んでjoin
するとき、リストに数値が混ざっているとエラーになる。
TypeError: sequence item 0: expected string, int found – せつないぶろぐ
いきなりTypeErrorとか言われてもわからない。
対処としてはstr
で文字列化するか、あるいは上記リンク先のコメント欄にあるようにmap
でstr
関数を指定するか。
まとめ
あと1回は続きます。
目次の見出し項目とページ番号は著作権の保護の対象でしょうか。勝手に対応表アップロードすると怒られるのかな。
WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)
- 作者: 川合史朗,秋葉拓哉,中嶋謙互,木村廉,酒井政裕,ninjinkun,渡辺訓章,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2018/04/26
- メディア: 単行本
- この商品を含むブログを見る
- 作者: John Whitington,村上雅章
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/05/25
- メディア: 単行本(ソフトカバー)
- クリック: 166回
- この商品を含むブログ (9件) を見る