cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

openFrameworksでPDFビューア

お仕事のネタではありませんが、PDFビューアを自作したり、PDFを開いて画像処理してPDFに書き戻すプログラムを書きたいことがあります。とくに、ScanSnapを使って漫画を自炊した時に、埃やノリのせいで縦線が入ってしまったのを修正したい時に・・・。openFrameworksの標準では、cairoライブラリを使ってPDFを出力する機能はサポートされているようですが、読み込みに関しては用意されていないようです。

ofxPDFium

PDFビューアの自作にはjvtibさんが配布されているofxPDFium[2]がとても便利に使えます。最近googleが公開したpdfiumというライブラリ[1]を使っているそうです。元の開発元はFoxitという会社で有料ライセンスのソフトウェア製品だったものを、googleオープンソースとして提供開始した、ということのようです。Chromeのpdf描画エンジンでもあるようです。

ofxPDFium内部でofImageにページを保持しているので、普通に画像処理し放題できます。ありがたい。

VisualStudio2012ではファイルパスが少しずれて読まれてしまうので、

  • 解凍後のフォルダ名からofxPDFium-testの-testを削除
  • 解凍フォルダ中のofxPDFiumを切り取り、一つ上の階層に上書き移動

その後、example内のslnを開いてビルド実行。 

f:id:cvl-robot:20140916122552p:plain

すごい!簡単!

解像度の調整

解像度高くしたい場合、ofxPDFium.cppのloadPage関数の

int width = static_cast<int>(FPDF_GetPageWidth(page));
int height = static_cast<int>(FPDF_GetPageHeight(page));

をスケール倍してやると良いです。

ページの縦横比と画面の縦横比に合わせて調整してやるとなお良しです。

1ピクセル≒0.35mmとして扱われていますので、これを勘案して物理的な画面の解像度に合わせてやると、最適な解像度となります。

 

[1] pdfium - PDFium - Google Project Hosting

[2] Rough draft/example for using Chrome web browser's PDF rendering library - openFrameworks