1

ビジネスアプリケーションには次の要件があります。

(これはすべてローカルまたはサーバー上にある可能性があります)

  • ユーザーがフォルダの場所を選択できるようにする
  • フォルダの内容を表示
  • フォルダから選択したアイテムを印刷 (*.pdf)
  • 印刷されたファイルを表示する
  • 印刷済みファイルを新しい場所 (印刷済みのサブフォルダー) に移動する可能性があります

Silverlight でこれを実現するにはどうすればよいですか?

敬具、

リバルド

4

1 に答える 1

3

まず、最後の項目を除くすべてを(期待どおりに)実行できます。セキュリティプロトコルにより、Silverlightはユーザーのドライブにアクセスして操作することはできません。最も近い方法は、silverlightのアプリケーションストレージにアクセスすることです。この場合、これはまったく役に立ちません。最初の4つの項目の実行方法を強調します。

  • ユーザーがフォルダの場所を選択してフォルダの内容を表示できるようにする

    public void OnSelectPDF(object sender)
    {
    //create the open file dialog
    OpenFileDialog ofg = new OpenFileDialog();
        //filter to show only pdf files
    ofg.Filter = "PDF Files|*.pdf";
    ofg.ShowDialog();
    byte[] _import_file = new byte[0];
    //once a file is selected proceed
    if (!object.ReferenceEquals(ofg.File, null))
    {
    
        try
        {
            fs = ofg.File.OpenRead();
            _import_file = new byte[fs.Length];
            fs.Read(_import_file, 0, (int)fs.Length);
        }
        catch (Exception ex)
        {
        }
        finally
        {
            if (!object.ReferenceEquals(fs, null))
                fs.Close();
        }
        //do stuff with file - such as upload the file to the server
    };
    }
    

    私の例では、ファイルが取得されたら、それをWebサーバーまたは一時的にパブリックアクセスできる場所にアップロードすることをお勧めします。Webサービスを介してこれを行うことをお勧めします。例えば

    //configure the system file (customn class)
    TSystemFile objFile = new TNetworkFile().Initialize();
    //get the file description from the Open File Dialog (ofg)
    objFile.Description = ofg.File.Extension.Contains(".") ? ofg.File.Extension : "." +  ofg.File.Extension;
    objFile.FileData = _import_file;
    objFile.FileName = ofg.File.Name;
    //upload the file
    MasterService.ToolingInterface.UploadTemporaryFileAsync(objFile);
    

このファイルがアップロードされると、非同期の結果で、おそらく一時ファイル名とアップロード場所が返されます。ブラウザでjavascriptメソッドを呼び出して、一般的な「download.aspx?fileName=givenFileName」手法を使用します。新しい場所への保存印刷の両方を処理するユーザーシステムへのダウンロードを強制します。それがあなたが求めているものです。

javascriptテクニックの例(System.Windows.Browserを含めることを忘れないでください):

public void OnInvokeDownload(string _destination)
{
    //call the browser method/jquery method 
    //(I use constants to centralize the names of the respective browser methods)
    try
    {
        HtmlWindow window = HtmlPage.Window;
        //where BM_INVOKE_DOWNLOAD is something like "invokeDownload"
        window.Invoke(Constants.TBrowserMethods.BM_INVOKE_DOWNLOAD, new object[] { _destination});
    }
    catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); }
}

含まれているjavaScriptファイルまたはSilverlightアプリと同じホスティングページにjavascriptメソッドが存在することを確認してください。例えば:

function invokeDownload(_destination) {
//some fancy jquery or just the traditional document.location change here
//open a popup window to http://www.myurl.com/downloads/download.aspx?    fileName=_destination
}

download.aspxのコードは、必要に応じて異なり、この投稿が長くなるだけなので、私の答えの範囲外です(もっとたくさん)。しかし、私が与えたものから、それはあなたが探しているもののために「働く」でしょう、しかし多分あなたが期待したように正確にはそうではありません。ただし、これは主にSilverlightの制限によるものであることを忘れないでください。このアプローチでは、アプリでpdfファイルを表示するためにプラグインが必要になるのではなく、既存のadobepdfリーダーを使用してユーザーのコンピューターがその役割を果たすことができます。Silverlightでは、ほとんどの印刷は、少なくとも私の知る限り、あなたが呼ぶものとUIElementである「ImageVisual」を使用して行われます。Silverlightから直接PDFを印刷するには、SilverlightコントロールでそのPDFを表示している必要があります。または、WebサービスにPDFを画像としてレンダリングしてから、その画像をコントロールに配置するように依頼します。そうして初めて、直接印刷できます。私はこのアプローチをもっとクリーンで直接的なアプローチとして提示しました。

注-tempディレクトリでは、ファイルが追加されるたびに、サーバー側のファイルのタイムスパンごとにクリーンアップを実行することをお勧めします。フォルダをチェックして古いファイルを削除するために定期的にタスクを実行する作業を節約できます。;)

于 2012-04-20T11:29:11.533 に答える