アイキャッチ画像

WPFアプリにPDFを表示する

windows.data.pdfを使ってWPFアプリにPDFを表示させてみました。環境は、Windows10とVisual Studio 2017です。

C#でPDFといえばiTextSharpとかブラウザで表示させるとかいう方法がメジャーなのかもしれないのですが、もともとWinRT用らしいwindows.data.pdfがWinodws10でも使えるということで、WPFアプリで使ってみました。

使い方は、マイクロソフト社のブログHIRO's.NET Blog といったブログの通りです。

目次

  1. 準備
  2. 表示に使うPDF
  3. コード
  4. 動かしてみた

準備

プロジェクトに参照を追加します。

Visual Studioのソリューションエクスプローラーのウインドウの「参照」を右クリックして「参照の追加」を選択します。

参照マネージャーダイアログが開くので、その中の「参照」を選択して、「参照」ボタンをクリックします。

そして、下記のファイルを追加します。

C:\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral\Annotated\Windows.winmd

同様に、下記のファイルも追加します。

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

表示に使うPDF

テスト用のPDFファイルは、厚生労働省 の方からダウンロードしました。

コード

では、コードを書いてみます。

XAMLはこんな感じです。

<Window x:Class="wpf_pdf_test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf_pdf_test"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="144*"/>
            <RowDefinition Height="275*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.RowSpan="2">
            <Button Name="btnPdf" Content="open PDF" Click="btnPdf_Click" />
            <Image Name="imgPdf" />
        </StackPanel>
    </Grid>
</Window>

StackPanelでボタンとイメージを縦に並べただけの簡単なものです。

コードビハインドにこんな風に書きました。

using System;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;

namespace wpf_pdf_test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Windows.Data.Pdf.PdfDocument pdfDocument;

        private async void btnPdf_Click(object sender, RoutedEventArgs e)
        {
            var file = await Windows.Storage.StorageFile.GetFileFromPathAsync(@"C:\Users\xxxx\Downloads\eiyou-syokuji6.pdf");

            try
                {
                    // PDFファイルを読み込む
                    pdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromFileAsync(file);
                }
                catch
                {

                }

            if (pdfDocument != null)
            {
                // 1ページ目を読み込む
                using (Windows.Data.Pdf.PdfPage page = pdfDocument.GetPage(0))
                {
                    BitmapImage image = new BitmapImage();

                    using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
                    {
                        await page.RenderToStreamAsync(stream);

                        image.BeginInit();
                        image.CacheOption = BitmapCacheOption.OnLoad;
                        image.StreamSource = stream.AsStream();
                        image.EndInit();
                    }
                    imgPdf.Source = image;
                }
            }
        }
    }
}

pdfDocumentというインスタンスにPDFファイルを読み込んで、そこからpageというインスタンスにページを読み込みます。

RenderToStreamAsyncというメソッドでstreamインスタンスに変換して、streamからBitmapImageクラスのインスタンスに変換します。

できあがったimageというインスタンスをイメージコントロールにバインドしてできあがり。

動かしてみた

まずはAcrobatでの表示です。

AcrobatでのPDF表示

作ったWPFアプリで表示するとこうなります。

WPFアプリでのPDF表示

ウィンドウを大きくすれば全体が表示されます。

でもこれ、Windows10のAPIを使うってことはWindows7では動かないんですよね。あまりメリットないのかな。

公開日

広告

C#とPDFカテゴリの投稿