Silverlight:业务应用程序需要访问要打印和移动的文件

时间:2012-04-19 14:47:38

标签: silverlight mvvm printing

我对业务应用程序有以下要求:

(所有这些都可以在本地或服务器上)

  • 允许用户选择文件夹位置
  • 显示文件夹的内容
  • 从文件夹(* .pdf)
  • 打印所选项目
  • 显示已打印的文件
  • 可能将打印文件移动到新位置(打印的子文件夹)

如何在Silverlight中实现这一目标?

亲切的问候,

下流

1 个答案:

答案 0 :(得分: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
    };
    }
    

    如果您注意到,在我的示例中,一旦检索到文件,我建议将其上传到网络服务器或具有临时公共访问权限的地方。我建议通过网络服务这样做。 E.g

    //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方法存在。 E.g:

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的代码超出了我的答案范围,因为它根据需要而变化,只会延长这篇文章(很多)。但是从我给出的内容来看,它将“适用于”您正在寻找的东西,但可能并不完全符合您的预期。但请记住,这主要是由于银光限制。这种方法的作用不是强迫您在应用程序中查看pdf文件,而是允许用户计算机通过使用现有的adobe pdf阅读器来播放它。在Silverlight中,大多数打印,至少据我所知,使用你所称的和“ImageVisual”来完成,这是一个UIElement。要直接从silverlight打印pdf,您需要在silverlight控件中查看该PDF,或者要求Web服务将PDF呈现为图像,然后将该图像放在控件中。只有这样才能直接打印。我提出这种方法是一种更加干净和直接的方法。

一个注意事项 - 对于临时目录,我建议每次添加文件时,在服务器端的某些时间段进行清理。为您节省定期运行某些任务的工作,以检查文件夹并删除旧文件。 ;)