将PDF文件原始源的byte []转换为MemoryStream以加载到PDF查看器中? (第一部分)

时间:2011-08-02 18:04:10

标签: silverlight file pdf stream

我正在使用ComponentOne(C1)silverlight PDF查看器控件。 它有一个“LoadDocument”方法,可以接受“Stream”。

我正在从我的客户端应用程序进行HTTP调用以获取PDF文档。 服务器端的此文档已通过File.ReadAllBytes()流式传输,然后使用Convert.ToBase64String()转换为base64字符串。 这个字符串通过电线发送回我的silverlight应用程序,然后通过Convert.FromBase64String(val)反向转换回字节数组。 然后我用该字节数组创建一个MemoryStream并传递“LoadDocument()”那个内存流。

观众没有任何渲染。它显示工具栏和滚动条,但内容为空白,保存按钮显示为灰色,表示未加载任何文档。 我肯定知道文件是通过的,因为客户端上的字节数组大小与服务器端的字节数组预转换相匹配。

这是我的代码:(为了时间/空间,我已经截断,删除验证等)

服务器侧

string sendingToClient = Convert.ToBase64String(File.ReadAllBytes(filePath))

客户机侧

byte[] image = null;
image = Convert.FromBase64String(stringFromServerCall);
MemoryStream stream = new MemoryStream(image);
docViewer.LoadDocument(stream);

编辑作为一种潜在的解决方法,我尝试将文件保存到扩展名为“.pdf”的独立存储中。然后我使用IsolatedStorageFileStream发送到LoadDocument()。 我发现了一个实际的错误,它现在说“用户代码未处理PdfParserException:文件格式无效(缺少pdf标题)”

有人能对这个PDF标题有所了解吗?

2 个答案:

答案 0 :(得分:2)

这是我要进行的实验。

向您的Xaml添加一个按钮,然后点击使用OpenFileDialog获取FileInfo。从FileInfo开始,使用其Open方法获取流并将其传递给docViewer.LoadDocument

现在运行它,单击按钮并选择您尝试从服务器发送的相同PDF文档。

如果成功,您需要继续调查您的服务器流式传输策略。另一方面,如果你仍然有同样的问题,那么它不会比那更原始。尝试其他PDF文件并开始调查PDF组件。您是否曾经成功使用过它,如果是这样,目前的使用情况有何不同。

答案 1 :(得分:0)

你应该将流指针返回到0,所以这应该是技巧

byte[] image = null;
image = Convert.FromBase64String(stringFromServerCall);
MemoryStream stream = new MemoryStream(image);
stream.Position = 0;
docViewer.LoadDocument(stream);