CAD日記

AutoCAD,DXF,DWG,SXFなどCADのことから、仮想通貨や投資関係、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

ファイル選択でアプリ即死

まずはキーワードを並べる。 ・ファイル選択ダイアログ ・デスクトップ ・ツールチップ ・マウスカーソル ・2回目 ・落ちる(スッといなくなる) ・Adobe Reader 7 ・pdfshell.dl …

no image

複数ファイルの名前やパスを取得するのに便利なフリーソフト

ファイル名の一覧を作りたいときに使えるものはこれだ。 NameToClipboard64 インストーラは付いていないが、以下の簡単な操作でセットアップができる。 1.zipをダウンロード後解凍して適当 …

no image

PDFiumでPDFを描画したりなんだりできるんだとさ

まずはこちらのネットニュースをご覧あれ。2014年に書かれたものでおもしろいことが書いてある。

no image

円周率

3.1415926535…。私が記憶しているのはここまでです。スーパーコンピュータを使って数億桁まで計算、なんてニュースをよく聞きますね。コンピュータの性能向上とアルゴリズムの工夫に対する …

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

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