2016/04/26(火)[WPF]PdfiumViewerを使ったPDFの表示

PDFファイルを読み込みを行う場合、Windows Storeアプリ用のAPI PdfDocumentは用意されています。
しかし、WPF用のAPIは残念ながら用意されていません。

Webを検索した結果、完全マネージドで書かれているPDFの表示用ライブラリは見つかりませんでした。Win32 DLLをラッピングしている表示用ライブラリでライセンス条件が緩い(Apache License Ver.2.0)なのが、PdfiumViewerです。

本記事では、PdfiumViewerを使用してWPFでPDFを標示する方法を記載します。


1. NuGetを使用してSharpCompressをプロジェクトに追加する。

(1)メニューの[ツール]-[NuGetパッケージマネージャー]-[ソリューションのNuGetパッケージの管理]を選択します。
(2)[参照]を選択し、[PdfiumViewer]を検索します。
(3)使用するプロジェクトにチェックを入れ、インストールを選択します。

PdfiumViewer_001.png

2. 追加されたpdfium.dllをx86/x64ともにプロパティを開き、「新しい場合はコピーする」に変更します・

PdfiumViewer_002.png

3 使用するソースコードに名前空間の参照を追加します。

using PdfiumViewer;

4 PDFファイルを開く処理を追加します。

PdfDocument pdfDoc = PdfDocument.Load(fileName);

5 指定ページをレンダリングします。

System.Drawing.Image image = pdfDoc.Render(page, 96, 96, false);

6 WPFのImageに設定できるようにBitmapSourceに変換します。

BitmapSource bmp = BitmapHelper.ToBitmapSource(image);
※BitmapHelper.ToBitmapSourceはPdfiumViewerのサンプルコードに付属のメソッドです。

7 取得したBitmapSourceを任意のImageに設定します。

ダウンロードは以下からできます。

ダウンロード

2016/04/10(日)[WPF]FlipView

WPF
スマホ/タブレット用の写真/画像ビューアはスワイプ、フリックによる操作で映像を切り替えます。
UWP用アプリケーションは、この機能を実現するコントロール「FlipView」があります。
残念ながら、WPFは、このような操作を行い映像を切り替えるコントロールが標準で搭載されていませんが、同様の機能をWPFで実現するコントロールが公開されています。

1. WPF FlipView

URL

http://www.codeproject.com/Articles/741026/WPF-FlipView
https://wpfplayground.com/2014/03/09/wpf-flipview/

ライセンス

The Code Project Open License (CPOL)

Flip.png

2. Gu.Wpf.FlipView

URL

https://github.com/JohanLarsson/Gu.Wpf.FlipView

ライセンス

The MIT License (MIT)

Gu.png

2015/06/14(日)[C#]DynamicJsonでの列挙型データの対応

WPF
DynamicJsonを使用してemun型のデータをシリアライズ/デシリアライズするとデシリアライズ時にエラーが発生します。
このことはDynamicJsonのサイト内DISCUSSIONSで検討されていますが対応は行われていないようです。
このディスカッション内では文字列にすることで対処可能と書かれていましたので、実装を行ってみました。

差分は以下となります。

■「private static JsonType GetJsonType(object obj)」に以下を追加
            if (obj.GetType().IsEnum == true)
            {
                return JsonType.@string;
            }

■「private dynamic DeserializeValue(XElement element, Type elementType)」に以下を追加

            if (elementType.IsEnum == true)
            {
                value = Enum.Parse(elementType, value);
            }
■ダウンロード
 修正を行ったコードは以下からダウンロードできます。

 ダウンロード


2015/05/17(日)[WPF]仮想対応のWrapPanel

WPF
WrapPanelは標準では仮想化に対応していないため大量のデータを登録してしまうとメモリを大幅に使用してしまいます。

少し調べましたが、オープンソースで仮想対応のWrapPanelが公開されていました。

■Virtualizing WrapPanel
https://virtualwrappanel.codeplex.com/
License : The MIT License (MIT)

動作を確認しましたが、標準のWrapPanelと置き換えで使用できそうです。

<追記:2017/01/27>
以下のVirtualizingWrapPanelは、上記よりも良い動作をします。

https://uhimaniavwp.codeplex.com/SourceControl/latest
Microsoft Public License (Ms-PL)

差異は以下です。
・スムーズスクロールができる。
・終端部分でも正常に動作する。

2015/03/29(日)[C#]WPF MediaKit

WPF
■WPF MediaKitについて

WPFでビデオを扱うには標準でMedieElmentを使用しますがサポートされる形式が限定されており再生したビデオを再生できないことがあります。

そこでDirectShowを使用して再生することになります。
DirectShowは.Net Frameworkで使用するためのライブラリ DirectShow.NET があります。
このライブラリはWin32上で動作するためWPF上のUIElementと親和性がよろしくありません。

WPF MediaKitはDirectShow.NETの表示をD3DImageで行うことによりUIElementと親和性を高め通常のUIElementとして使用できるようにしています。

https://wpfmediakit.codeplex.com/

ライセンスは「New BSD License (BSD)」でありライブラリを使用したアプリケーションのソースコードを非公開ですみとても使用しやすくなっています。

この記事は、シンプルなビデオ再生アプリケーションの例を記載しています。



■ビデオ再生処理の実装

1.ソースコードをオフィシャルサイトからダウンロードします。

Mediakit_001.jpg


2.ソリューション状の右クリックメニュー[追加]-[既存プロジェクト]でWpfMediakitのプロジェクトを追加します。

Mediakit_002.jpg


3.WPFMediakitのプロパティを開き対象フレームワークを作成するアプリケーションい合わせます。
 ※この例では.Net Framework4にしています。

Mediakit_003.jpg


4.作成するアプリケーションにWPFMediakitとDirectShow.NETの参照を追加します。
 DirectShow.NETはWPFMediakitソースコード内の「WPFMediaKit\Assemblies」にあります。

Mediakit_004.jpg


5.作成するアプリケーションのプロパティを開き「ビルドタブ」を開きます。
 ターゲットプラットフォームをx86にします。
 DirectShow関連のモジュールの多くは32bitで提供されておりx64やAny CPUで実行すると期待通り再生が行われません。

Mediakit_005.jpg


7.MainWindows.XAMLを開き以下の様に編集しWPFMediaKitのUIElementへの参照を記載します。
<Window x:Class="TestWPFMediakits.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Control="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit" <-- 追加する
        Title="MainWindow" Height="350" Width="525">

8.WPFMediakitのUIElementをWindow状に追加します。
 以下の例ではビデオレンダラ(表示オブジェクト)にVideoMixingRenderer9を設定しています。
    <Grid>
        <Control:MediaUriElement Name="player" VideoRenderer="VideoMixingRenderer9"/>
    </Grid>
9.Loadedイベントを追加しファイル再生処理を記載します。
//MediaUriElementの初期化開始処理を行う
player.BeginInit();
//ファイルを指定する
player.Source = new Uri(@"C:\tmp\test.mp4");
//DirectShowグラフの構築を行う
player.EndInit();
※c:\tmp\test.mp4を作成しておく必要あります。

10.構成マネージャーで出力形式をx86にします。

Mediakit_006.jpg


11.ビルドし実行するとc:\tmp\test.mp4が再生されます。

■サンプルのダウンロード
TestWPFMediakits.zip
OK キャンセル 確認 その他