夜田たんの知的生活実践

ほそく・ながく・ゆるく続くブログを目指します(だいたい週一で更新中)

蔵書の電子書籍化(自炊)複合機編

open book lot
Photo by Patrick Tomasso on Unsplash

自炊には前々から興味があって、とりあえず初期費用ゼロで、自宅の複合機のスキャナで挑戦した記録を残します。
結論。可能でしたが体力的に1冊が限界でした。

環境

  • Windows10+Python(自分の場合、参考にしたオライリー本でAnacondaが紹介されていたのでそれを入れています)
  • EPSON EP-777A

準備

  1. スキャナドライバ(Epson Scan)のアップロード
  2. PDF作成モジュール/ OCRコンポーネントのインストール

使用した本

岩波新書の梅棹忠夫「知的生産の技術」

open book image
活字は一昔前って感じです。

手順

スキャン

設定は、とりあえずOCRの設定だけをちゃんとやっておいて、あとは適当です。

setting of epson scan

所要時間は約1時間。
ページを開く→角を合わせてスキャナに押しつける→パソコンでスキャン操作→終わるまで押しつけ続ける→ページを開く……のループが非常にきついです。翌日、肩こりがひどかったです。
今回はノートPCで作業したので、PCと複合機の距離を物理的に狭められたので良かったですが、スキャナ側でスキャンを実行できないのはかなり厳しい。
黙々と120回ほどスキャンを繰り返して、ようやくPDFファイルができました。

OCRがうまくいっているか確認

screenshot of pdf
※分かりやすいように検索結果をハイライト表示してあります

これはほとんど問題なさそうです。
ちょっと感動したのが、画像の最終行の「カー(改行)ド」のように、単語の途中で改行されていてもちゃんと検索されるようになっていること。

screenshot of pdf ocr

巻末のかなり小さい文字も認識してくれていますが、「岩波」は認識できていても「新書」の「書」の字がバラエティ豊かになっています。
混み合った字面は厳しそうです。

見開きPDFを分割して結合する

勉強がてら、ネットを調べつつPythonで以下のコードを書いてみました。
ごくごく単純に、右側と左側にトリミングしたものをくっつけるだけです。
rightとleftばっかりで鬱陶しいですが、勉強用ということでご容赦ください。
スキャン時点で本の外側の余白はトリミング済みであること前提です。

from PyPDF2 import PdfFileReader, PdfFileWriter

FILE_NAME = 'img005'

pdf_file_obj = open(FILE_NAME + '.pdf','rb')
pdf_reader = PdfFileReader(pdf_file_obj)
pdf_reader_left = PdfFileReader(pdf_file_obj)
pdf_reader_right = PdfFileReader(pdf_file_obj)
pdf_writer = PdfFileWriter()

for i in range(pdf_reader.numPages):
    # 頁の縦と横のサイズを指定
    # 左頁mediaBox…left_lowerleft, left_lowerright, left_upperleft, left_upperright
    # 右頁mediaBox…right_lowerleft, right_lowerright, right_upperleft, right_upperright
    left_lowerleft = pdf_reader.getPage(i).mediaBox[0]
    left_lowerright = pdf_reader.getPage(i).mediaBox[1]
    left_upperleft = int((pdf_reader.getPage(i).mediaBox[2]) * 0.5)
    left_upperright =  pdf_reader.getPage(i).mediaBox[3]
    right_lowerleft = left_upperleft + 1
    right_lowerright = pdf_reader.getPage(i).mediaBox[1]
    right_upperleft = pdf_reader.getPage(i).mediaBox[2]
    right_upperright = pdf_reader.getPage(i).mediaBox[3]

    # 余白を落とす
    margin_top = 30
    margin_bottom = 30
    margin_left = 18
    margin_right = 18

    # トリミング
    page_obj_right = pdf_reader_right.getPage(i)
    page_obj_left = pdf_reader_left.getPage(i)

    page_obj_right.cropBox.lowerLeft = (right_lowerleft, right_lowerright + margin_top)
    page_obj_right.cropBox.upperRight = (right_upperleft - margin_right, right_upperright - margin_bottom)
    page_obj_right.trimBox.lowerLeft = (right_lowerleft, right_lowerright + margin_top)
    page_obj_right.trimBox.upperRight = (right_upperleft - margin_right, right_upperright - margin_bottom)

    page_obj_left.cropBox.lowerLeft = (left_lowerleft + margin_left, left_lowerright + margin_top)
    page_obj_left.cropBox.upperRight = (left_upperleft, left_upperright - margin_bottom)
    page_obj_left.trimBox.lowerLeft = (left_lowerleft + margin_left, left_lowerright + margin_top)
    page_obj_left.trimBox.upperRight = (left_upperleft, left_upperright - margin_bottom)

    # 右・左の順で結合
    pdf_writer.addPage(page_obj_right)
    pdf_writer.addPage(page_obj_left)

pdf_output_file = open(FILE_NAME + '_split.pdf', 'wb')
pdf_writer.write(pdf_output_file)
pdf_output_file.close()
pdf_file_obj.close()

screen shot of pdf

できたー。

圧縮

このままだとファイル容量が44MBあって、send-to-kindleを使ってメール送信する際に、容量オーバーになってしまうので、SmallPDFの「PDF圧縮」でサイズダウンさせました。

Kindleに送って読んでみる

image of kindle

こんな感じです。
さすがにこの画面サイズだと文字が小さい。
そして文字のにじみが気になります。

image of kindle for PC

PC版のKindle for PCだと、そこまで気になりません。

今後の課題

とにかく素早くスキャンして、後から一括で補正する方法を探す

コーディングよりもスキャンがとにかく疲れました。
せめてもうちょっと楽に取り込める方法を考えないといけないと思いました。

PDFをサイズダウンする方法を探す

見開きのPDFを分割すると、ページ数が倍になったおかげでファイルサイズも倍になってしまったので、どうにかできるといいなあと思っています。
今回200dpiでスキャンしたので、もう少し解像度を抑えてもいいかもしれません。

綴じ方向を修正

今回つくったPDFは、左綴じになってしまっていて、ページ送りが逆になっています。
これをどうにか変更できるようにしたいです。

参考資料

コードを書く際に大変お世話になりました!