テキスト中心の本のスキャンからjbig2で小さいPDFを作成する 2026年6月2日更新
スキャナーで作成したPDFや電子書籍のスクリーンショットで作成した画像から小さいPDFを作成をする。ページ中のテキスト等はjbig2形式でモノクロに圧縮し、写真等はグレイスケールjpeg形式でPDFの元の位置にスタンプとして貼り付ける方針。
使用するソフトは jbig2enc、ImageMagick、CPDF、BusyBox for Windows、Python 等。Pythonには pip install で opencv-python と img2pdf パッケージをインストールする。画像のPDF化は img2pdf.py の替わりに CPDF でもできるが再エンコードしているようなので使わないこととした。
スクリーンショットの自動化方法については書かないので必要であれば何らかの方法でご自分でご用意下さい。
(1) スキャンでPDFが作成されるのであればその中からまず個々の画像ファイルを抽出する。Poppler の pdfimages.exe コマンドを使ったり、私のスキャナーのPDFは 画像梱包 でも抽出できた。
(2) 必要により何らかの方法で画像のサイズを小さくしてしてファイルサイズを小さくする。透明テキストを付けるのであれば、たとえば NDLOCR-Lite は電子書籍ののスクリーンショット程度の解像度の画像でもOCRをかけられる。ちなみに NDLOCR-Lite は非可逆圧縮にしてファイルサイズを落としても意味がないので可逆圧縮か無圧縮にする。
(3) 各ページの画像ファイルを何らかの方法で p0000.*, p0001.*, p0002.* ・・・ という連番にして新規フォルダーに入れる。私は IrfanView を常用しているので その「一括変換/名前の変更」を使った。
(4) 透明テキストを結合するのであれば「OCRで作成されたPDFから「透明テキストの抽出・可視化」
で透明テキストPDFを作成しておく。NDLOCR-Lite
のようにページごとにPDFが作成されるのであれば何かの方法で無劣化結合してから透明テキスト作成バッチファイルを実行する。CPDF
コマンドを使用するのであれば、
cpdf.exe -merge -idir 対象PDFフォルダー -o 結合後.pdf
が使える。
(5) (3) をカレントフォルダーにして make_pdf.sh とget_img_pos.py
を置き、以下のコマンドを実行する。その前に
make_pdf.sh ファイル中の *.exe や *.py のパスを編集し、magick.exe
の引数を変更して好みの画質にする。パスの区切り文字は"\"ではなく"/"を使う。get_img_pos.py
の作成は簡単ではなかったので Gemini に作ってもらった。
busybox ash -c ./make_pdf.sh
(6) output.pdf が作成される。別途透明テキストを作成していた場合
次のコマンドで結合できる。
cpdf -combine-pages output.pdf 透明テキスト.pdf -o output2.pdf
さらに cpdf -squeeze 入力.pdf -o 出力.pdf を使うと更にサイズが小さくなるかもしれない。
ちなみに NDLOCR-Lite で作成したPDFはベータ版だということもあってか透明テキストの文字の位置がかなりずれるが検索はできる。