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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

Vectorに作者登録の申し込みをしてみた

Vectorとはフリーウェア、シェアウェアのダウンロードサイト。最近はあまり使わなくなった。もちろんフリーソフトはよく使っているんだけど、マイナーなものはあまり使わなくなってきていて、メジャーどころは …

no image

Tech Ed

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

クリップボード履歴を一括でまとめて取得したいだろ?

Windows 10 1809の新機能「クリップボード履歴」はそこそこ使えるんだけど、惜しいんだよね。最大25個までのコピーした履歴を取れるところまではよいが、その履歴を一括でまとめて取得できないのだ …

no image

PDF印刷のアプリ指定

PCにAdobe ReaderとAcrobatの両方が入っている場合、PDFファイルを 右クリックメニューから印刷ってやると、どっちで印刷されるのか? Windows XPまでは、拡張子の関連付けのと …

no image

テキストファイルの最大行数

【2018/12/24追記】以下の記事も参考になるかな。 扱えるテキストファイルの最大行数は1億行 バカでかいテキストファイルを作る必要があって、結果約2GBにもなった。 CADから出力するんだけど、 …