自炊PDFを2値化して圧縮するツールを作りました

何をするツール?

自炊PDFの選択したページを2値化して圧縮します。用途としては図があるページと文字のみのページが混在する専門書やライトノベル等の自炊PDFの圧縮を想定しております。

特徴

  • 2値化の基準となる閾値を設定できます。
  • 仮実装ですがボールド化も対応しています。2値化後に黒となるピクセルをマンハッタン距離で拡張します。
  • 対象外ページはそのまま出力後PDFに統合されます。これによりJPEG(DCTDecode)で内部的に保持しているページも画質の劣化なく出力後のPDFに統合されます。
  • DCTDecodeとFlateDecode方式の画像データしか対応していません。ScanSnap S1500のPDF作成機能ではこれだけあれば十分そうだったので。

ダウンロード・ソースコード

github.com
Releasesからダウンロードしてください。別途.NET Runtimeが必須です。

作るに至った経緯

自炊PDFのバックアップ先のOneDriveの容量がこんな感じだったので。

電子書籍リーダーに向けて変換+圧縮するツールは既存であるのですが、原寸のまま2値化圧縮するツールが探しても見当たらなかったため作成しました。

技術的内容と謝辞

ソースコードについては公開しているので、詳細は見ていただければと思います。
ツールの特性上、まともなGUI構築が必須であったため今回はWPFを利用してのGUI構築をターゲットとしてC#を開発言語としました。F#でWPFを触ったことはあるのですが、流石に今回は関数型言語に求める堅牢さは求めておらず、実装速度を優先したかったのでC#を選択しました。
PDFの解析・作成ライブラリにPdfSharpCoreを利用させていただきました。PDF仕様は公開されているため頑張れば独自で解析・作成するライブラリも実装できたかもしれませんが、このライブラリがなければおそらく挫折していました。改めてライブラリのコントリビュータの皆様には感謝いたします。