c# - 内存流与文件流 : Document Viewer rendering document from filestream successfully but not memorystream?

标签 c# silverlight pdf stream streaming

我在 silverlight 应用程序中使用 C1 的 PDF 查看器控件,并且正在测试最大 PDF 大小限制。 我有一个 35MB 的 PDF。

当我通过 OpenFileDialog 加载 PDF 查看器时,只需向它发送文件流,它就可以正常呈现。所有 900 页。

但是,当我尝试通过从 byte[] 创建的 MemoryStream 加载 PDF 查看器时,它什么也不呈现。它不会出错,它只是呈现空白。

这是完全相同的文件。 MemoryStream 进程可以成功处理小得多的 PDF 文档。然而,FileStream 方法适用于较大的文档,所以我知道这不是 PDF 查看器的限制,对吗?

文件流方法:

        OpenFileDialog ofd = new OpenFileDialog();
        bool? res = ofd.ShowDialog();
        if (res == true)
        {
            FileStream stream = ofd.File.OpenRead();
            docViewer.LoadDocument(stream);
        }

内存流方法:

       imageBytes = File.ReadAllBytes(path);
       MemoryStream stream = new MemoryStream();
       stream.Write(imageBytes, 0, imageBytes.Length);
       stream.Seek(0, SeekOrigin.Begin);
       docViewer.LoadDocument(stream);

这给了我相同的结果。空白查看器:

using (MemoryStream stream = new MemoryStream(imageBytes))
{
      docViewer.LoadDocument(stream);
}

再次...因失败而沮丧。 我重构了调用以使用“OpenReadAsync”,然后我更改了我的 API 调用(我们使用 MVC 作为伪 API)以返回流并且它仍然呈现空白。 结果内部流的长度也是正确的。

客户电话:

        string url = App.Server + "Document/RetrievePDFTest";
        try
        {
            WebClient wc = new WebClient();
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(delegate(object sender, OpenReadCompletedEventArgs e)
            {
                if (e.Result != null)
                {
                    docViewer.LoadDocument(e.Result);
                }
            });
            wc.OpenReadAsync(new Uri(url));
        }
        catch (Exception ex)
        {
            //TODO - handle exception
        }

服务器 API:

    public ActionResult RetrievePDFTest()
    {
        return File(System.IO.File.ReadAllBytes("D://temp//repositories//test35mb.PDF"), "application/pdf");
    }

更新!!!! 我相信我已经发现了可能存在的问题。

在我的 silverlight 应用程序中,我实际上是在一个新窗口中弹出该文档查看器,然后我向该新窗口发送用于从服务器检索 PDF 图像的信息。本质上,我是通过传递的 key 告诉它要检索哪个文档:

this.windowManager.NavigateToPageInNewWindow("/Views/pdfViewerUserControl.xaml");
                LocalMessageSender s = new LocalMessageSender("receiver", LocalMessageSender.Global);
                s.SendAsync(doc.Barcode);

现在,在我的 pdfViewerUserControl.xaml 的构造函数中,我正在创建并注册消息的监听器:

public pdfViewerUserControl()
    {
        LocalMessageReceiver messageReceiver = new LocalMessageReceiver("receiver", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
        messageReceiver.MessageReceived += messageReceiver_MessageReceived;
        try
        {
            messageReceiver.Listen();
        }
        catch (Exception ex)
        {

        }

        // Required to initialize variables
        InitializeComponent();
    }

在“messageReceiver_MessageReceived”事件处理程序中,这是我调用服务器以检索图像并加载查看器的地方。即使服务器返回图像,此过程也会导致空白 PDF 查看器。 (即使是大 pdf)

现在,作为一个测试工具,我在页面上也有一个测试按钮,这个按钮在后面的代码中触发一个事件,该事件进行完全相同的服务器调用,并以完全相同的方式加载结果,但这有效!! ! 35MB 的大 PDF 在查看器中成功呈现。

这让我相信在使用 LocalMessageSender/LocalMessageReceiver 对象时存在断开连接。

最佳答案

鉴于评论,我怀疑问题是您将其作为字符串下载,然后将其转换为字节。将字节数组中的数据与文件中的数据进行比较(例如采用 MD5 哈希)。

要下载二进制数据,您应该改用 DownloadData

关于c# - 内存流与文件流 : Document Viewer rendering document from filestream successfully but not memorystream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6929371/

相关文章:

c# - 将 TextBlock 的前景设置为 LinearGradientBrush 会导致意外行为

javascript - 嵌入 PDF,同时删除打印/保存/等。 。

c# - Asp Net core Controller URL参数

c# - 在 ASP.NET MVC 中将多个参数传递给 Controller ​​;此外,在 LINQ-to-SQL 中生成即时查询

c# - x 轴上的自定义标签

silverlight - wp7 中后台代理的工作

c# - HttpWebResponse 错误,未找到

c# - DatatemplateSelector,列表框拉伸(stretch)

在c中不使用任何第三方库创建pdf文件?

php - 如何使用 PHP 将 HTML + Javascript 转换为 PDF