Webサイトで公開されている長編小説などを電子書籍リーダーでじっくり読みたい場面がある。その場合、WebページをPDFにしてしまうと良いのだが、ブラウザの機能を使って変換すると、非常に文字が小さくなり、KindleやKoboなど電子書籍リーダーで読むには適さないことが多い。そこで、単にPDFに変換するだけでなく、読書端末で快適に読書できるように、文字サイズなどをカスタマイズするプログラムを作ってみよう。
じっくり読書するためのPDF造り
多くの電子書籍リーダーは、ディスプレイに電子ペーパー(E Ink)を搭載している。この電子ペーパーは、太陽光の下でもくっきりと画面を確認できるため、目に優しいと言われており、長時間の読書に適している。筆者も電子書籍リーダーを愛用しており、日々の読書の友としている。
一般的な電子書籍リーダーでは、独自に用意されたストアから書籍を購入することが多いだろう。しかし、場合によっては、自分で用意した資料を読書端末で読みたい場合もある。多くの電子書籍リーダーでは、スマートフォンと異なり、好きなアプリを追加することはできない。そのため、端末ごとに異なる独自のデータ形式のファイルを用意する必要がある。例えばKindleではmobi形式となっており、専用のツールを使って作成する。同様に、他の端末でも、表示可能なデータ形式に制限があることが多い。
しかし、PDFはKindle/Koboをはじめ、電子ペーパーを搭載した大半の読書端末で表示可能な汎用的なフォーマットだ。しかも、PDFであれば好きな文字サイズや行間を指定できるというメリットがある。
今回は、WebからダウンロードしたHTMLをドラッグ&ドロップでPDFに変換するPythonのプログラムを作ってみよう。特に、青空文庫などで公開されているテキストファイルを自分が持っている電子書籍リーダーで快適に読めるように調整して使えるようにしてみよう。
必要なライブラリのインストール
最初に、PDFを生成するために専用のライブラリをインストールしよう。ここでは、本連載66回目でも紹介している「wkhtmltopdf」を使ってみよう。
wkhtmltopdfはこちらからインストールできる。Windowsであれば「Stable」(安定版)の表の一番上にあるInstallerから「64-bit」(OSが32ビットであれば32-bit)を選んでダウンロードしてインストールしよう。
次に、Pythonからwkhtmltopdfを使うことのできるライブラリpdfkitをインストールしよう。コマンドラインで以下のコマンドを実行するとインストールされる。
$ python3 -m pip install pdfkit
プログラムなしでPDFを生成する方法
前回も紹介した通り、もともと「wkhtmltopdf」はHTMLをPDFに変換するツールだ。コマンドを実行することで、任意のWebサイトのページを手軽にPDFに変換できる。なお、Windowsの場合は、コマンドラインから開けるように「システムのプロパティ」にパス(path)を設定しておこう。[Win]+[R]で"ファイル名を指定して実行"を呼び出し、"sysdm.cpl"を入力し「システムのプロパティ」を起動。「詳細設定」→「環境変数」のシステム環境変数の"Path"にインストールしたC:\Program Files\wkhtmltopdf\binを追加する。
例えば「夏目漱石の吾輩は猫である」をPDFに変換したいだけならば、コマンドライン(WindowsならPowerShell、macOSならターミナル.app)を開いて、以下のコマンドを実行すれば良い。
$ wkhtmltopdf https://www.aozora.gr.jp/cards/000148/files/789_14547.html neko.pdf
すると、neko.pdfというPDFが生成される。
以下のような書式でコマンドを叩くことで気軽にPDFを生成できるので便利なツールだ。
wkhtmltopdf (青空文庫のURL) (PDFファイル名)
今回作るプログラムの手順
ただし、上記の方法で作ったPDFを電子書籍リーダーに転送すると、非常に文字が小さくなり、長時間の読書には適さない。そこで、自分の持っている読書端末で快適に読めるよう、文字サイズをカスタマイズしたPDFを作ってみよう。
ここでは、次の手順でプログラムを作ってみよう。
(1)Web上にあるHTMLをダウンロード
(2)HTMLファイルから本文を取り出す
(3)読書端末用にカスタマイズしたフォントや行間設定のあるHTMLに本文を差し込む
(4)wkhtmltopdfを使って上記HTMLからPDFを出力する
つまり、基本的にはWeb上にあるHTMLを使いつつ、フォントや行間設定をカスタマイズしてPDFを生成するプログラムを作る。
PDFを生成するプログラム
まず、今回のプログラムは、Pythonのプログラム「convert.py」とWindowsのバッチファイル「convert.bat」の二つから構成される。この二つのファイルが同じフォルダに配置されるようにしておこう。
ソースコードなどサンプルファイルはこちらからZIPファイルでダウンロードできる。ただし、ネットからダウンロードしたバッチファイルには、セキュリティの保護がかかっているので、エクスプローラー上で「convert.bat」を選択して右クリックしてプロパティを表示して、画面下の「セキュリティ」を「許可する」にチェックを入れよう。
なお、Pythonのプログラム「convert.py」は以下の通りだ。
import pdfkit, sys, os, re
# 変換のための設定 --- (*1)
ENCODING = 'Shift_JIS' # 入力HTMLの文字コード
FONT_SETTING = 'body{font-size: 4em; line-height: 2.0;}'
PAGE_SETTING = {
'page-size': 'A4', 'encoding': 'UTF-8',
'margin-top': '20mm', 'margin-right': '20mm',
'margin-bottom': '20mm', 'margin-left': '20mm',
}
def convert_file(htmlfile):
print("convert=", htmlfile)
pdffile = htmlfile + '.pdf'
# HTMLのテキストを読む --- (*2)
with open(htmlfile, "rt", encoding=ENCODING) as fp:
text = fp.read()
# <body>から</body>以外を削除 --- (*3)
text = re.sub(r'(^.*<body>|</body>.*$)', '', text, flags=(re.DOTALL))
# リンクやスクリプトがあれば削除
text = re.sub(r'<a href.*?</a>', '', text, flags=(re.DOTALL))
text = re.sub(r'<script.*?</script>', r'', text, flags=(re.DOTALL))
print('抽出しました:', text[:600])
# HTMLに埋め込む --- (*4)
html = '''
<html><head><style>{font}</style></head>
<body>{body}</body></html>
'''.format(font=FONT_SETTING, body=text)
# PDFで出力 --- (*5)
pdfkit.from_string(html, pdffile, options=PAGE_SETTING)
if __name__ == '__main__':
if len(sys.argv) < 2:
print("[使い方] convert.py (入力ファイル)"); quit()
convert_file(sys.argv[1])
プログラムを確認してみよう。(*1)では変換のための設定を記述する。変数ENCODINGには、入力するHTMLの文字コード(文字エンコーディング)を指定する。青空文庫ではShift_JISなのでその旨を指定している。最近のWebサイトであれば、だいたいUTF-8を指定する。
(*2)ではHTMLをテキストファイルとして読み込む。そして、(*3)でHTMLの<body>から</body>までを抽出する。そして、リンク(a要素)やスクリプト(script要素)があれば削除しておく。さらに(*4)ではHTMLに取り出したテキストを埋め込んで(*5)でPDFに変換する。
バッチファイル「convert.bat」は、以下のようになる。
python3 %~dp0\convert.py %1
pause
上記のバッチファイルは、バッチファイルをドラッグ&ドロップした時に、Pythonのプログラム「convert.py」を実行するためのものだ。
プログラムを実行する
まず、ブラウザで夏目漱石の「吾輩は猫である」にアクセスし、名前をつけて保存で「nako.html」という名前で保存しよう。
そして、プログラムを実行するには、青空文庫からダウンロードしたHTMLファイルを「convert.bat」にドラッグ&ドロップする。すると、PDFが生成される。
なお、macOSの場合、ターミナルから以下のコマンドを実行する。これは、「neko.html」というHTMLをPDFに変換する例だ。
$ python3 convert.py neko.html
プログラム改造のヒント
なお、今回のプログラムは、筆者のKindle用に文字をかなり大きめで入れている。そこで、プログラムの(*1)の部分にある変数FONT_SETTINGを変更することで文字の大きさを変更できる。もし、小さな字で良ければ「font-size: 4em」のところを「font-size: 2.3em」などと修正すると良いだろう。
生成したPDFファイルを電子書籍リーダーに転送したら、文字サイズなどを確認してみよう。なお、Kindleであれば、PCとKindle端末をUSBで接続して端末へコピーするか、メールにPDFファイルを添付して指定されたアドレスへ送信する。
まとめ
以上、今回はHTMLファイルを元に電子書籍リーダー用のPDFファイルを出力するプログラムを作成した。今回のように簡単なプログラムを作ることで快適な読書が可能になるので、筆者はサイトごとにプログラムを用意して使っている。
なお、既に紹介したように、基本的にwkhtmltopdfはHTMLを元にPDFを生成するので、CSSの設定を修正することで、PDFのフォント設定を変更できるので便利だ。プログラムをいろいろ変更して自分好みのPDFを生成すると良いだろう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。