XPSビューアを自動で立ち上げる方法

[戻る]
なおぞう 2016/08/16(火) 11:58:56
お世話になります。
Windows7 VS2010 C#で開発しています。

プログラム中で作った帳票をMicrosoft XPS document Writer で名前を付けtえ出力(保
存)し、そのファイルを自動でビューアーで開きたいのですが、どうしたらよいでしょうか。

Microsoft XPS document Writer のXPSドキュメントタブに「XPSビューアーを使って自動
的にXPSドキュメントを開く」というチェックボックスがあり、これをプログラムの中か
らチェックできればよいかと思うのですが、方法が思いつきません。

何か方法がありましたら教えていただけますようお願いします。

瀬戸っぷ [E-Mail] 2016/08/16(火) 20:17:55
自動で…が無理なら、コードで出力…でしょうかね?

>Microsoft XPS document Writer で名前を付けtえ出力(保存)し

出力先のファイル名が判明している必要があるかも知れませんが。
# ファイルシステムで監視…はちょっとねぇ……。

対象のファイル名が確定していれば
http://dobon.net/vb/dotnet/process/shell.html#openfile
辺りで実行可能かと。

なおぞう 2016/08/17(水) 13:57:30
>瀬戸っぷ 様
ご返答ありがとうございます。

ダミーのフォルダ選択ダイアログを出してユーザに書かせてそれを覚えておく。
内部では、決まった一時ファイルにXPSファイルを吐き出させて、ビューアーで見せた
後、removeしてユーザが決めたフォルダにファイルを置くという処理にしようかと思って
います。
プログラム内で一時ファイルへのXPS出力、ビューアー立ち上げにProcessStartInfoオブ
ジェクトを使います。

こんな感じで出来そうでしょうか?

YuO [E-Mail] 2016/08/18(木) 02:54:55
ちょっと横道にそれますが……。

一応,.NET Frameworkの機能にはXPSの出力機能があります。
これを使うと,XPS Document Writerを使わずに出力することができます。

手順は以下になります。
1. System.Windows.Documents.FixedDocumentを作る
2. ページ数分だけSystem.Windows.Documents.FixedPageを作る
 2.1. FixedPageにコンテンツを配置する。1ページ分に対応するWPFのユーザーコントロール
を用意するのが楽。
 2.2. System.Windows.Documents.PageContentを作る
 2.3. PageContentをSystem.Windows.Markup.IAddChildにキャストする
 2.4. IAddChildのAddChildにFixedPageを渡す
 2.5. FixedDocument.PagesにPageContentを追加する
3. System.Windows.Threading.Dispatcherを回す (これをやらないとDataContextのバインド
が有効にならない)
  System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.SystemIdle,
    new System.Windows.Threading.DispatcherOperationCallback(delegate { return null; 
}),
    null);
4. System.IO.Packaging.Package.Open で出力ファイルを開く
5. Packageを引数にしてSystem.Windows.Xps.XpsDocumentを作る
6. XpsDocument.CreateXpsDocumentWriterにXpsDocumentを渡してXpsDocumentWriterを取得す
る
7. XpsDocumentWriter.WriteにFixedDocument.DocumentPaginatorを渡してXPSを出力する


元々のUIがWPFであるならば,帳票をUIと同様に作れるため考慮に入れてもよいと思います。
WinFormsの場合は,ややこしくなるだけかもしれません。

なおぞう 2016/08/18(木) 10:32:34
>YuO さま
アドバイスありがとうございます。勉強になります。
残念ながら元のプログラムはWPFではありません。まだ一度もWPFのプログラムは作った事
がないのですが、ますます便利みたいですね。

現状プログラムでの印刷のところは、
PrintDialog dlg を作って、PrinterSettingsにいろいろ設定して、ShowDialog()で出力
プリンタを選ばせてOKが返ってきたら、
PrintDocument のPrinterSettings にdlg.PrinterSettingsを代入して、PrintDocumentの
Print()を実行してます。


これを、
PrintDialog Dlg;
--省略--
Dlg.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";

PrintDocument  pd.PrinterSettings = Dlg.PrinterSettings;
pd.Print();

としてみると、XPSのファイル保存先ダイアログが出て保存できました。
が、やりたいのは、ここでこのダイアログを出さないで一時ファイルに保存することなの
ですが、どのようにしたらできるのかが分からない状態です。

これが分かれば、あとはProcessStartInfoを使って、XPSファイルをビューアで開けばよ
いのだと考えております。
もし、ご存知でしたら教えていただけますようお願いします。

なおぞう 2016/08/18(木) 15:19:34
PrintDocumentのメンバに、以下のものがあったのでXPSへのファイル出力はできました。
               PrinterSettings.PrintToFile = true;
               PrinterSettings.PrintFileName = "D:\\test.xps";

なおぞう 2016/08/18(木) 18:01:21
[[解決]]
なんとか希望通りに作成できました。
アドバイスありがとうございました。

古いスレッドには追加発言できません。