サイトアイコン CAD日記

PDFium ViewerによるPDFレンダリングがイケてる

PDFが電子ペーパーの絶対的な標準になったなか、PDFをプログラムであつかうのがとても簡単になってきた。ブラウザ戦争の勝者であるGoogle ChromeがPDFレンダリングエンジンに採用しているPDFium(ピーディーエフ・イアム)。ライセンスは修正BSDライセンスなので、企業が商用利用する上でのハードルは低い。ていうか、ハードルなんてないと言ってもいい。

今日は、VisualStudioでPDFium Viewerなる便利な部品を使ってPDFをJpegにするというチョー簡単なプログラムに取り組んでみる。言語はC#だから、おいらにとっては専門外だが、何事もやってみないと始まらないんで。。
1.新しいプロジェクトでWindowsフォームアプリケーションを作成
2.ツール → NuGetパッケージマネージャー → ソリューションのNuGetパッケージ管理
3.参照 でPdfiumViewer を検索して、以下2つをインストール
 PdfiumViewer、PdfiumViewer.Native.x86_64.v8-xfa
4.プロジェクトのプロパティ → ビルドで「32ビットを優先」 のチェックを外す
5.フォームにボタンを配置
6.ボタンのクリックイベントに以下3行を挿入(ファイル名は適宜変更)
 PdfDocument pdfDoc = PdfDocument.Load(“C:\\work\\test.pdf”);
 Image img = pdfDoc.Render(0, 300, 300, false);
 img.Save(“C:\\work\\test.jpg”, ImageFormat.Jpeg);
7.参照を解決するために以下2行を追加
 using PdfiumViewer;
 using System.Drawing.Imaging;
8.ビルドして実行

test.pdfの1ページ目をtest.jpgにすることができたでしょ。なんとまぁ簡単なことか。Renderメソッド引数の意味は以下の通り。
PdfDocument.Reader(int page, float dpiX, float dpiY, bool forPringing);
PDFは複数ページあるわけだから、全ページ分のラスタライズをしてあげましょ。

using PdfiumViewer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PDFiumTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            PdfDocument pdfDoc = PdfDocument.Load("D:\\work\\test.pdf");
            for (int i = 0; i < pdfDoc.PageCount; i++)
            {
                Image img = pdfDoc.Render(i, 300, 300, false);
                string output = string.Format("D:\\work\\test{0}.jpg", i+1);
                img.Save(output, ImageFormat.Jpeg);
            }
        }
    }
}

今回はPDFium ViewerというC#の部品を使ってみたわけだが、PDFium本体はC++の部品らしい。世間的にはドットnetたるC#のほうが使いやすいんだろうけど、おいらとしては使い慣れたC++で組みたい気持ちが強い。いずれそいつを探し出して、いじってみようかなと。

モバイルバージョンを終了