将对象转换为ByteArray后,对象大小已更改

时间:2015-03-06 20:55:13

标签: c# pdf pdf-generation

我有一个将对象转换为byte []的方法,以便在浏览器中填充PDF。我可以完美地看到内联PDF,但是如果我点击了" Save"按钮并从我的本地打开下载的文件它将给我以下消息:

  

" Adob​​e Reader无法打开xx.pdf,因为它不是受支持的文件类型,或者因为文件已损坏(例如,它是作为电子邮件附件发送的,并且未正确解码)"

我发现在数据类型转换期间数据大小差异可能会导致问题。从数据库中提取的pdfDataObject的大小为{byte [1111161]},与存储到数据库之前的大小相同;转换后的pdfdata是{byte [1111189]},它在转换过程中增加了28个字节。

数据库中pdf的数据类型为varbinary(max)

public byte[] populated_PDF(string args)
{
    DataTable dt = new DataTable();

    //sqlconnection to get data

    var pdfDataObject = dt.Rows[0]["PDF_DATA"];   
    // get the Varbinary datatype from database
    // The Data Size of pdfDataObject is {byte[1111161]}

    byte[] pdfdata = ObjectToByteArray(pdfDataObject);
    // The Data Size of pdfdata is       {byte[1111189]}

    return pdfdata;
}

对象ByteArray方法

private byte[] ObjectToByteArray(Object obj)
{
    if (obj == null)
    {
        return null;
    }
    var bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

PDF可以在两种数据大小的浏览器中显示。但是,数据大小为{byte [1111189]}的那个不能从本地打开,如果"保存"适用于数据大小为{byte [1111161]}的那个。

似乎方法ObjectToByteArray添加了一些导致在转换过程中打开本地下载的PDF失败的东西。

不知道如何解决它。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您通过特定于.NET的序列化程序(BinaryFormatter)传递PDF字节...这样的操作会改变结果并不奇怪,因为它添加了一个序列化层PDF的顶部。脱掉它。

这应该做得很好:

return (byte[])dt.Rows[0]["PDF_DATA"];