pdfファイルの結合,ChatGPT(2),SCOAP3 Books からの続き
SCOAP3 Booksには現在60冊ほどのOpen Accessの素粒子原子核分野の単行本が登録されている。これをダウンロードしていると,Cambridge University Pressの本でつまづいた。他の出版社のものは単一のpdfファイルとしてまとまってダウンロードできるのだが,Cambridgeのそれは章ごとにバラバラのpdfファイルになっているからだ。
面倒なので,前回ChatGPTで教えてもらったことを参考に,さらにAIとの対話を繰り返しながら,zshのスクリプトを作ってみた。目的を入れると,それらしいコードが出てくるのだがうまく動作しない。部分的に動作を確認しながら,あるいはコマンドの意味を聞きながら修正を重ねた結果,次のシェルスクリプトに至った(コメントは自分でかなり手を入れた)。
#!/bin/zsh
# 2/16/2023 K. Koshigiri
# usage: pdf.sh target-url
#
# 1. コマンドラインに与えられたURLのHTMLファイルにアクセスし
# base_url (Cambridgeの場合,host name部分)と
# pdf_links (pdfファイルへのリンクがある行の相対URL)
# を取得する。文字列を配列にするため ($(…)) とする。
#
url=$1
base_url=$(echo $url | sed -E 's|https?://([^/]+)(/.*)?$|\1|')
pdf_links=($(curl -s "$url" | grep -oE 'href="([^"#]+\.pdf)"' | sed -E 's/href="(.+)"/\1/g'))
#
# 2. PDFファイルをダウンロードするため,headとbase_urlをつけた
# 相対URLを先に求めた配列から1つずつ取り出し絶対URLを定める。
# 絶対URL pdf_linkから,ファイル名 $pdf_link を取り出し curl
# でpdfファイルをダウンロードする。このとき,$iで連番を付加する。
#
head="https://"
i=10
for pdf_link in $pdf_links; do
i=$(($i+1))
# 1. HTMLファイルのドメインからの相対リンクを絶対URLに変換する
pdf_link="$head$base_url$pdf_link"
# 2. PDFファイルをダウンロードする
pdf_file=$(basename "$pdf_link")
echo $i$pdf_file
curl -s "$pdf_link" -o "$i$pdf_file"
done
#
# 3. PDFファイルを結合する
pdfunite $PWD/*.pdf combined.pdf
#
指定したhtmlファイルからpdfを取り出してzshの配列にするところ,ファイル名の出現順で結合するために整数変数を名前に付加するところなどがポイントだったが,いずれもChatGPTに教えてもらって解決した。中途半端に複数のプログラミング言語になじんでいるものの,どれもマスターしていない人には有難い環境だ。
残念ながら,pdfファイルのリストが2ページ以上になる場合の自動化までは実現できていない。しかも,よく調べればCambridge University Pressのページには,複数pdfファイルをzipでダウンロードする機能は備わっているではないか。無駄骨だったかもしれない・・・orz。