locked
Silverlightによる帳票作成について RRS feed

  • 質問

  • Expression Blend(Ver2.5)を利用して帳票のレイアウトを作成し、

    ASP.Net(VS2008)で帳票に対する値の入力・保存・呼出及び帳票の印刷を行うシステムを作成したいと考えております。

     

    現在、Expression Blendで作成したXamlファイルを印刷するためにXpsへ変換し、

    それをブラウザ(IE)へ出力して印刷プレビューを表示し印刷できないかと考えており

    変換処理を作成しているのですが、躓いております。

    (単純なXamlファイルだとうまくいくのですがExpression Blendで作成したXamlファイルだとエラーになってしまう状態です)

     

    そこでXPS変換で発生するエラーについて調査しているところなのですが

    そもそも、クライアント側でExpression Blendで作成したXamlファイルの内容を印刷しようとする場合、

    Xpsに変換してXpsViewer経由で実現しようとする考え方はあっているのだろうか?

    と、考えてしまいました。

     

    もし他に適切な方法が有るのであれば教えていただけないでしょうか?

    もしくは参考となるようなサイト・書籍等をご存知ないでしょうか?

     

    ご存知であればご教授ください。よろしくお願いいたします。

     

    2008年12月4日 10:19

回答

  • 大西 様

     

     Akira Onishi - MSFT さんからの引用

    ということは、Silverlightのアプリケーションとして入力フォームを実行し、帳票については実現可能性を含めて調査するという話になるのでしょうね。

     

    XPSをサーバー側で生成して、何らかの方法でブラウザから読み込むのであれば、どうにかなりそうではありますが、サーバー側でXAMLとデータの結合をどのようにするのかが新たな課題になるかもしれません。

    データの結合についてはXPSへの変換処理が確定してから悩むつもりです。

    現段階ではサーバーサイドでXamlファイルをテキストベースで読み込み、

    入力項目の部分をReplaceをかけて別名で保存。

    保存したファイルをXPSに変換、クライアントのブラウザへ出力する方法を考えています。

    (このままだと入力項目ごとにReplace処理を記述しなければいけないので、さらに改良する必要はありますが・・・)

     

     Akira Onishi - MSFT さんからの引用

    削除すれば変換が正常であるならば、それが回避策だと思います。

    なお、x:Class属性は、分離コードにかかわらないのであれば省略可能です。WPFだと次に解説があります。今回のようにXAML -> XPS変換をする際には特になくても問題ないと思います。

    http://msdn.microsoft.com/ja-jp/library/ms752309.aspx

    了解しました。

     

     

    拙い質問ばかりしてすみません、

    なんとか作業を進める事ができそうです。

     

    これにて回答済みにさせて頂きます。

    ありがとうございました。

    2008年12月11日 2:49

すべての返信

  • Expression Blend 2 SP1は、WPFのアプリケーション、Silverlight JavaScript APIによるアプリケーション、Silverlight 2マネージコードによるアプリケーションの開発において、画面部分をデザインするために利用できます。ASP.NETのアプリケーションデザイン用ではないので注意が必要です。

     

    おそらく、ASP.NETやSilverlight、Expression Blend、XAMLに関して、それぞれの特長をご確認いただくのがよいかと思います。

     

    Silverlightそのものは、印刷機能を有していません。ブラウザの印刷機能で、HTMLページの印刷は可能なので、Silverlightアプリケーションの画面そのものをプリンタに送ることはできます。

    加えて、XPSをサーバ側で生成するアプローチであれば、クライアント側は単にXPSのファイルダウンロードと印刷なので、Silverlightとは関係ない世界になると思います。

     

    今回のケースだと、Expression Blend 2 SP1で帳票をデザインし、Silverlightでデータと結合してXAMLを表示し、ブラウザから印刷という手法がとれるかもしれません。XPSに出力する必要はないかと思います。

    ただし、この方法は、一般の帳票印刷と比較すると、単なるHTMLページの出力なので使い勝手はよろしくありません。

     

    単にブラウザからの帳票印刷という観点であれば、帳票作成用のActiveXコントロールを入手していただき、HTMLとJavaScript、ActiveXコントロールを組み合わせて、印刷を実行するのがよろしいかと思います。SilverlightアプリケーションとActiveXコントロールを併用することができるからです。その理由として、Silverlight 2からは、HTML DOMへのアクセスやマネージコードからのJavaScriptメソッドへのアクセスが可能です。

    これを応用し、JavaScriptとActiveXコントロールで印刷部分を実装し、そのメソッドをSilverlightから呼び出すのが簡単です。
    http://msdn.microsoft.com/ja-jp/library/cc645076(VS.95).aspx
    日本語版のドキュメントのサンプルコードに不要な<span>タグが含まれているので、オンラインの英語版か日本語版のオフラインドキュメントをダウンロードしてご覧ください。

    オフラインドキュメント(CHM)
    http://www.microsoft.com/downloads/details.aspx?FamilyID=bce7684a-507b-4fc6-bc99-6933cd690cab&DisplayLang=ja


      この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

     

     

     

     

     

     

    2008年12月5日 7:58
  • 大西 様

     

    コメント、ありがとうございます。

     

    Expression Blendで作成された物を印刷したい場合、

    印刷用のレイアウトを別に(CrystalReport等で)作成するべきということなのですね。

     

    要件的にExpression BlendではなくASP.Net+CrystalReport等で開発を行うべきなのでしょうが

    帳票レイアウトがExpression Blendで既に作成されており、

    そのレイアウトをそのまま(印刷用にべつのレイアウト作成することなく)印刷できるようにしなければならない状態です

     

    Expression Blend自体に印刷機能が無い事はすぐにわかったため

    PDFに変換する方法を考えて調査していたのですがその方法を見つける事ができていませんでした。

    調査の過程でXamlファイルのXPSへの変換処理のサンプルを見つけたので

    この方法ならいけるかと思い、Xaml→XPS変換処理を作成しておりましたが

    以下のような問題が発生しております。

     

    下記の変換処理を実行すると

    XamlStreamToXps(fileStream, context, "xps/test.xps");

    この部分で以下のようなエラーが発生してしまいます。

    ”'Name' プロパティは、既定の名前空間または要素名前空間 'http://schemas.microsoft.com/winfx/2006/xaml/presentation' にある必要があります。 行 '9' 位置 '8'。”

     

    未だ、このエラーの対処方法がわからない状態です。

    解決策をご存知であれば、ご教授願えないでしょうか

    ※変換対象Xamlをエラー未発生Xamlファイルのように修正するとエラーは発生せず正常にXpsファイルが作成されます。

     

     

     

    ***変換処理 ここから***

    Stream fileStream = new FileStream("xaml/test.xaml", FileMode.Open);

    ParserContext context = new ParserContext();
    context.BaseUri = new Uri(Directory.GetCurrentDirectory() + "//");
    context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
    context.XmlnsDictionary.Add("d", "http://schemas.microsoft.com/expression/blend/2008");
    context.XmlnsDictionary.Add("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");

    XamlStreamToXps(fileStream, context, "xps/test.xps");

    ***変換処理 ここまで***

     

    ***対象Xamlファイル ここから***

    <UserControl
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/client/2007"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     mc:Ignorable="d"
     d:DesignWidth="605" d:DesignHeight="855" FontSize="10" FontFamily="Trebuchet MS">

     <Grid x:Name="LayoutRoot" Width="605" Height="855" Background="#FFFFFFFF">
    (以下省略)

    ***対象Xamlファイル ここまで***

     

    ***エラー未発生Xamlファイル ここから***

    <UserControl
     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"
     FontSize="10" FontFamily="Trebuchet MS">

     <Grid x:Name="LayoutRoot" Width="605" Height="855" Background="#FFFFFFFF">
    (以下省略)

    ***エラー未発生Xamlファイル ここまで***

    ※投稿時にアイコンへ自動変換されてしまう為、ソース上の":"を":"(全角)に置換してます。

    2008年12月8日 5:53
  •  ino_zest さんからの引用

    Expression Blendで作成された物を印刷したい場合、

    印刷用のレイアウトを別に(CrystalReport等で)作成するべきということなのですね。

    いいえ、そういう意味ではありません。

     

     ino_zest さんからの引用

    要件的にExpression BlendではなくASP.Net+CrystalReport等で開発を行うべきなのでしょうが

    帳票レイアウトがExpression Blendで既に作成されており、

    そのレイアウトをそのまま(印刷用にべつのレイアウト作成することなく)印刷できるようにしなければならない状態です

    よくわからないのですが、そもそもExpression BlendでSilverlight 2アプリケーションのプロジェクトで帳票レイアウトを作成している理由を教えていただけませんか。

    Expression Blendは、WPFのアプリケーションあるいはSilverlightのアプリケーションの画面デザインを制作するものです。

    XAMLで帳票レイアウトに対して、データの結合はどのように行う予定でしょうか。

     

    問題となっている部分は、おそらくは、http://msdn.microsoft.com/ja-jp/magazine/cc163664(en-us).aspx あたりで、XAMLからXPSへの変換について情報を得られたのだと推測しています。

     

    変換処理側では、

    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");

    を指定されていますが、

    対象となるXamlファイル側では、

    xmlns:x="http://schemas.microsoft.com/client/2007"

    となっていて、名前空間が一致していないようにも思います。

     

    変換処理側で

    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/client/2007");

    としたらどうなりますか。

     

    WPFとSilverlightでのXAMLは完全互換ではないので、WPF用にデザインされたXAMLでは問題がなく、Silverlight 2用にデザインされたXAMLだと問題が発生するようにも思います。次の文書に説明があります。

    Silverlight と WPFとの間のXAML処理の相違

    http://msdn.microsoft.com/ja-jp/library/cc917841(VS.95).aspx

     

    なんにせよ、クライアント側でのローカルファイルの生成は、Silverlightではできませんので、これはデスクトップの.NETアプリケーションで行う話だと思います。

     


    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

     

     

    2008年12月8日 12:40
  •  Akira Onishi - MSFT さんからの引用

    よくわからないのですが、そもそもExpression BlendでSilverlight 2アプリケーションのプロジェクトで帳票レイアウトを作成している理由を教えていただけませんか。

    Expression Blendは、WPFのアプリケーションあるいはSilverlightのアプリケーションの画面デザインを制作するものです。

    XAMLで帳票レイアウトに対して、データの結合はどのように行う予定でしょうか。

    私がこのプロジェクトに携わった時点で帳票レイアウト(兼入力フォーム)がExpression Blendにて作成されており、

    その帳票レイアウト(兼入力フォーム)を利用して印刷機能を実現する方法を調査・実装するよう指示されております。

    レイアウト作成(システムのベース)にExpression Blend(Silverlight)を選択したのは

    マルチプラットフォーム上で同一の動作を実現させる為という事でした。

    データの結合についてですが、入力値のDBへの保存についてはWebサービスが用いられるそうなので、

    DBへ格納された値を取得してレイアウトのXamlファイルを読み込んで

    Xaml上の入力項目の値をDBの値で置き換えてからXPSへ変換できないかと考えております。

    (変換処理自体はサーバーサイドで行い、作成したXPSをクライアントのブラウザへ出力できればと考えています)

     

     Akira Onishi - MSFT さんからの引用

    問題となっている部分は、おそらくは、http://msdn.microsoft.com/ja-jp/magazine/cc163664(en-us).aspx あたりで、XAMLからXPSへの変換について情報を得られたのだと推測しています。

     

    変換処理側では、

    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");

    を指定されていますが、

    対象となるXamlファイル側では、

    xmlns:x="http://schemas.microsoft.com/client/2007"

    となっていて、名前空間が一致していないようにも思います。

     

    変換処理側で

    context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/client/2007");

    としたらどうなりますか。

     

    指摘された部分についてはおっしゃるとおりでした。

    この部分については確認不足でした。(すみません、自分で気付ける内容ですね・・・)

     

    もう一点お伺いしたかった事がありまして

    処理ロジックは一緒なのですが、変換するXamlファイルの内容が以下の通りの場合、

     

    ***Xamlファイル ここから***

    <UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SilverlightApplication2.Page" Width="640" Height="872"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" FontFamily="Trebuchet MS">
    <Grid x:Name="LayoutRoot" Background="White" Height="855" Width="605" >

    (以下略)

    ***Xamlファイル ここまで***

     

    x:Class="SilverlightApplication2.Page"の部分が

    'Class'属性がXML名前空間"http://schemas.microsoft.com/winfx/2006/xaml"名前空間にありません

    というエラーになってしまいます。

    この部分をXamlファイル上から削除すると変換は正常に行えるのですが

    削除せず変換を行う事は可能なのでしょうか?

    可能なのであればその対処法をお教え願えないでしょうか

     

    2008年12月9日 10:20
  •  ino_zest さんからの引用

    私がこのプロジェクトに携わった時点で帳票レイアウト(兼入力フォーム)がExpression Blendにて作成されており、

    その帳票レイアウト(兼入力フォーム)を利用して印刷機能を実現する方法を調査・実装するよう指示されております。

    レイアウト作成(システムのベース)にExpression Blend(Silverlight)を選択したのは

    マルチプラットフォーム上で同一の動作を実現させる為という事でした。

    データの結合についてですが、入力値のDBへの保存についてはWebサービスが用いられるそうなので、

    DBへ格納された値を取得してレイアウトのXamlファイルを読み込んで

    Xaml上の入力項目の値をDBの値で置き換えてからXPSへ変換できないかと考えております。

    (変換処理自体はサーバーサイドで行い、作成したXPSをクライアントのブラウザへ出力できればと考えています)

    ということは、Silverlightのアプリケーションとして入力フォームを実行し、帳票については実現可能性を含めて調査するという話になるのでしょうね。

     

    XPSをサーバー側で生成して、何らかの方法でブラウザから読み込むのであれば、どうにかなりそうではありますが、サーバー側でXAMLとデータの結合をどのようにするのかが新たな課題になるかもしれません。

     

     ino_zest さんからの引用

    x:Class="SilverlightApplication2.Page"の部分が

    'Class'属性がXML名前空間"http://schemas.microsoft.com/winfx/2006/xaml"名前空間にありません

    というエラーになってしまいます。

    この部分をXamlファイル上から削除すると変換は正常に行えるのですが

    削除せず変換を行う事は可能なのでしょうか?

    削除すれば変換が正常であるならば、それが回避策だと思います。

    なお、x:Class属性は、分離コードにかかわらないのであれば省略可能です。WPFだと次に解説があります。今回のようにXAML -> XPS変換をする際には特になくても問題ないと思います。

    http://msdn.microsoft.com/ja-jp/library/ms752309.aspx

     

     


    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年12月10日 8:34
  • 大西 様

     

     Akira Onishi - MSFT さんからの引用

    ということは、Silverlightのアプリケーションとして入力フォームを実行し、帳票については実現可能性を含めて調査するという話になるのでしょうね。

     

    XPSをサーバー側で生成して、何らかの方法でブラウザから読み込むのであれば、どうにかなりそうではありますが、サーバー側でXAMLとデータの結合をどのようにするのかが新たな課題になるかもしれません。

    データの結合についてはXPSへの変換処理が確定してから悩むつもりです。

    現段階ではサーバーサイドでXamlファイルをテキストベースで読み込み、

    入力項目の部分をReplaceをかけて別名で保存。

    保存したファイルをXPSに変換、クライアントのブラウザへ出力する方法を考えています。

    (このままだと入力項目ごとにReplace処理を記述しなければいけないので、さらに改良する必要はありますが・・・)

     

     Akira Onishi - MSFT さんからの引用

    削除すれば変換が正常であるならば、それが回避策だと思います。

    なお、x:Class属性は、分離コードにかかわらないのであれば省略可能です。WPFだと次に解説があります。今回のようにXAML -> XPS変換をする際には特になくても問題ないと思います。

    http://msdn.microsoft.com/ja-jp/library/ms752309.aspx

    了解しました。

     

     

    拙い質問ばかりしてすみません、

    なんとか作業を進める事ができそうです。

     

    これにて回答済みにさせて頂きます。

    ありがとうございました。

    2008年12月11日 2:49