CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

PDFiumでPDFを描画してみたけど、こんなに簡単にできちゃっていいのかよ!

投稿日:2018年9月16日 更新日:

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アプリとしての可能性が広まりそうなので、もうしばらくは今の形で進めていくことにする。

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

メイリオが他のフォントとくらべて小さく表示される件

左側がMS Pゴシックで、右側がメイリオ。 高さを同じ80pixcelで書いているのに、メイリオは3割型小さくなる。 メイリオの場合、GetTextMetricsで取得できるtmInternalLea …

no image

VC6デバッグ

ここ数年抱えていた問題が一つ解決したので、ここに記しておこう。 VC6でデバッグしていると、たまに戻ってこないことがあったのさ。 別の言い方をすると、固まる、凍る、フリーズ、ハングアップ。 マウスは動 …

no image

受託開発

パッケージソフトの開発にメンバーとして関わって10年、そこそこの売り上げを継続でき、よい結果を出していると思います。ここ最近、少しジリ貧なので、ちょっと厳しいですけど、それはともかく... 近頃、受託 …

PDFアレコレはiTextSharp7も組み込むことにする

PDFiumViewerを使ってPDFアレコレという名のフリーソフトを作ってみたわけだが、PDFiumViewerの限界が見えてきた。

PDFium第2弾はPDFを画像化するWindowsフォームアプリケーションなり

「PDFium ViewerによるPDFレンダリングがイケてる」では、最低限のWindowsフォームアプリケーションを作ったわけだが、その第2弾は普通の人(非プログラマー)でも使えるPDFの画像変換ア …