字节数组转换为PDF

43

我正在尝试将存储在 SQL 列中的文件内容转换为 PDF。

我使用以下代码:

byte[] bytes;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, fileContent);
bytes = ms.ToArray();
System.IO.File.WriteAllBytes("hello.pdf", bytes);

生成的PDF文件存在损坏,当我在Notepad++中打开PDF时,我看到一些垃圾头部(无论文件内容如何都是相同的)。这个垃圾头部是NUL SOH NUL NUL NUL ....


5
BinaryFormatter与PDF毫无关系。在同一句话中同时使用这两个词是一个大错误。这里的fileContent指的是什么?(即它的类型是什么?) - Marc Gravell
你的 SQL 列是否存储序列化的 PDF 文件,或者它可以是任何二进制数据? - Tim Croydon
我使用了类似的方法,但是在移动版Adobe Reader中无法打开PDF文件。 - Mukund Thakkar
2个回答

86

针对此操作,不应该使用BinaryFormatter - 它是用于将.NET类型序列化为二进制文件,以便可以按照.NET类型再次读取。

如果它被存储在数据库中,希望是以varbinary的形式 - 那么你只需要从中获取字节数组(这将取决于你的数据访问技术 - 例如EF和Linq to Sql将创建一个映射,使得获取字节数组变得微不足道),然后像你在最后一行代码中所做的那样将其写入文件。

幸运的是 - 我希望这里的fileContent是字节数组?如果是的话,你只需要执行:

System.IO.File.WriteAllBytes("hello.pdf", fileContent);

谢谢。你是对的。我已经将fileContent定义为ds.Tables [0] .Rows [0] ["fileData"]。所以我所做的就是byte [] b =(byte [])fileContent。没有必要使用BinaryFormatter。谢谢Mark和Tim! - blue piranha
我一直在寻找解决方案,但是我在这里找到了。请问变量类型“fileContent”是什么?先谢谢了。 - sidhewsar
嗨@sidhewsar - 这是byte[] - Andras Zoltan
这个程序可以正常工作并完成了它需要做的事情,将字节内容保存为PDF文件。请注意,这不是一个“真正”的PDF文件,因为其结构不符合PDF文件的结构。这意味着如果您稍后需要将其作为PDF文档打开,它将无法被识别为PDF文件。这只是一个提示。 - tanuk

2
通常情况下,这是由于字节数组出现问题所致。
File.WriteAllBytes("filename.PDF", Byte[]);

这将创建一个新文件,将指定的字节数组写入文件,然后关闭文件。如果目标文件已经存在,则会被覆盖。
这个操作也有异步实现。
public static System.Threading.Tasks.Task WriteAllBytesAsync 
(string path, byte[] bytes, System.Threading.CancellationToken cancellationToken = null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接