我在 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/