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

マルチスレッド

ついに出来ました。 マルチスレッド技術を利用した画期的機能が。 って、そんな大したものではありません。 スレッド化技術は、この時代当たり前になりつつありますが、 なかなか難しそうで、手をつけてませんで …

no image

Tech Ed

Windowsアプリつくって十数年経つけど、Tech Edに初めて行った。 アホらしそうだから毎年敬遠してきたけど、 行ってみたらそれなりにおもしろかった。 携帯で撮った写真。     Tech Ed …

no image

レイヤ付きPDFを出力する弊害

Illustratorという高価なアプリを使ってPDFを出力すると、PDFにレイヤが付いてしまって非表示にしたはずのレイヤが表示されて困ったなという事象に2回遭遇したので以下に記録。共通しているのが、 …

no image

Microsoft Visual C++ 2015 Redistributable

C言語のプラグラマなもんで、MFCなんていう今や時代遅れなプラットフォームを使っている。VC6の時代は長かったが、その後VC8(VS2005)に上げて

PDFアレコレはこんなところが落としどころかね

この3連休はPDFiumを使ったサンプルアプリ作成に取り組んでいて、まぁそこそこの感じにできあがったのでここらでいったん完成としておく。