WPFアプリにPDFを表示する
windows.data.pdfを使ってWPFアプリにPDFを表示させてみました。環境は、Windows10とVisual Studio 2017です。
C#でPDFといえばiTextSharpとかブラウザで表示させるとかいう方法がメジャーなのかもしれないのですが、もともとWinRT用らしいwindows.data.pdfがWinodws10でも使えるということで、WPFアプリで使ってみました。
使い方は、マイクロソフト社のブログ や HIRO's.NET Blog といったブログの通りです。
目次
準備
プロジェクトに参照を追加します。
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での表示です。
作ったWPFアプリで表示するとこうなります。
ウィンドウを大きくすれば全体が表示されます。
でもこれ、Windows10のAPIを使うってことはWindows7では動かないんですよね。あまりメリットないのかな。
公開日
広告