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

发布于 2024-11-27 16:43:04 字数 1033 浏览 3 评论 0原文

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

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

观看者没有呈现任何内容。它显示了工具栏和滚动条,但内容是空白的,并且保存按钮呈灰色,表明没有加载文档。 我确信该文件已成功通过,因为客户端上的字节数组大小与服务器端的字节数组预转换相匹配。

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

SERVERSIDE

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

CLIENTSIDE

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

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

任何人都可以解释一下此 PDF 标头吗?

I'm working with a ComponentOne (C1) silverlight PDF viewer control.
It has a "LoadDocument" method that accepts a "Stream".

I'm making an HTTP get call from my client app to get a PDF document.
This document, on the server side, has been streamed in through File.ReadAllBytes(), then converted to a base64 string using Convert.ToBase64String().
This string is sent across the wire back to my silverlight app where it's then reversely converted back into a byte array with Convert.FromBase64String(val).
Then I'm creating a MemoryStream with that byte array and passing "LoadDocument()" that memory stream.

The viewer is rendering nothing. It shows the toolbar and scrollbars, but the contents are blank and the save button is grayed out, suggesting that no document loaded.
I know for certain the file made it across because the byte array size on the client matches teh byte array pre-conversion on the server side.

Here's my code: (in the interest of time/space, i've truncated, removing validation, etc.)

SERVERSIDE

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

CLIENTSIDE

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

edit As a potential workaround, I attempted to save the file into isolated storage with a ".pdf" extension. Then I use the IsolatedStorageFileStream to send to LoadDocument().
I've come to an actual error, it now says "PdfParserException was unhandled by user code: invalid file format (missing pdf header)"

Can anyone shed some light on this PDF header?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

韬韬不绝 2024-12-04 16:43:04

这是我要进行的一个实验。

在 Xaml 中添加一个按钮,然后单击使用 OpenFileDialog 获取 FileInfo。从该 FileInfo 使用其 Open 方法获取流并将其传递给 docViewer.LoadDocument

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

如果成功,您需要继续研究您的服务器流策略。另一方面,如果您仍然遇到同样的问题,那就没有比这更原始的了。尝试其他 PDF 文件并开始研究 PDF 组件。您是否真正成功地使用过它?如果是的话,当前的用法有何不同。

Here is an experiment I would conduct.

Add a button to your Xaml and on click use OpenFileDialog to get a FileInfo. From that FileInfo use its Open method to get a stream and pass that to docViewer.LoadDocument.

Now run it, click the button and select the same PDF document you are trying to send from the server.

If that succeeds you need to continue investigating your server streaming strategy. On the other hand if you still have the same problem, well it doesn't get more raw than that. Try other PDF files and start investigating the PDF component. Have you ever actually used it successfully, if so how does this current usage differ.

烟酉 2024-12-04 16:43:04

你应该让流指针回到0,所以这应该可以解决问题

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

you should get the stream pointer back to 0 ,so this should do the trick

byte[] image = null;
image = Convert.FromBase64String(stringFromServerCall);
MemoryStream stream = new MemoryStream(image);
stream.Position = 0;
docViewer.LoadDocument(stream);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文