PDFiumで画像化とテキスト抽出が容易にできることは前回まででわかっていたので、今回は描画に取り組んでみた。
前回までの記事は以下の通り。
PDFium ViewerによるPDFレンダリングがイケてる
PDFium第2弾はPDFを画像化するWindowsフォームアプリケーションなり
PDFiumはPDFからテキスト抽出するのもちょー簡単
画面設計はこんなで、PDFを指定して描画ボタンを押せばよい。

そうすると、別フォーム「PDF描画」をモーダルで出る。ページを切り替えられて、フォームのサイズを変更すれば、描画している中身が連動して大きくなったり小さくなったりする仕組み(表示しているPDFファイルは、ネットから適当にダウンロードしたもの)。

PDFアレコレ紹介ページ
ダウンロードしたzipを解凍してexeexeをたたけば動く。アプリ名はPDFアレコレに変更。
新たに作ったフォームのソースコード。
public partial class Form2 : Form
{
PdfDocument m_pdfDoc;
int m_maxpage;
public Form2(PdfDocument pdfDoc)
{
InitializeComponent();
m_pdfDoc = pdfDoc;
m_maxpage = m_pdfDoc.PageCount;
label2.Text = "/ " + m_maxpage.ToString();
numericUpDown1.Value = 1;
numericUpDown1.Maximum = m_maxpage;
numericUpDown1.Minimum = 1;
DisplayPage(0);
}
private void DisplayPage(int page)
{
if (page >= m_maxpage)
return;
SizeF size = m_pdfDoc.PageSizes[page];
float h1 = size.Width / size.Height; // pdfの縦横比
float h2 = (float)pictureBox1.Width / (float)pictureBox1.Height; // コントロールの縦横比
if (h2 > 10) // 落ちないように
return;
int width = 0, height = 0;
if (h1 < h2) // フォーム内にImageを当てはめる判定
{
width = (int)((float)pictureBox1.Height * h1);
height = pictureBox1.Height;
}
else
{
width = pictureBox1.Width;
height = (int)((float)pictureBox1.Width / h1);
}
Image img = m_pdfDoc.Render(page, width, height, 100, 100, false); // 解像度は意味ない?
Image oldImage = pictureBox1.Image;
pictureBox1.Image = img;
if( oldImage != null)
oldImage.Dispose(); // メモリー節約
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
DisplayPage((int)numericUpDown1.Value-1);
}
private void pictureBox1_ClientSizeChanged(object sender, EventArgs e)
{
DisplayPage((int)numericUpDown1.Value - 1);
}
}
わずか50行程度でPDF描画ができるなんて。。やっぱC#ってすげーなぁ。C++だったら、あれやこれやと手続きが必要で自分で書く分だけで500行は必要だろう。いや、そもそもおいらはC++のWindows描画処理がよくわかってないから、数日かけてバグだらけのものしかできなかったはず。たった数時間でPDF描画ができちまうなんて、PDFium ViewerとC#の偉大さがよーくわかったぞよ。
今後はWindows Azure上にWebアプリで公開していくという構想があったけれども、一旦停止。まだWindowsアプリとしての可能性が広まりそうなので、もうしばらくは今の形で進めていくことにする。