2013-01-01 124 views
4

我试图将二进制数据转换为其原始格式“.PDF”,但是其中任何一种解决方案都有助于我的hed。第一个是一个小的,它创建一个PDF文件,但它看起来是空的。第二个也创建一个PDF文件,但我无法打开它。错误在哪里?将二进制数据转换为pdf文件

首先代码:

Conn.Open(); 
SqlCommand cmd = Conn.CreateCommand(); 
cmd.CommandText = "Select Artigo From Artigo WHERE (IDArtigo ='" + id + "')"; 
byte[] binaryData = (byte[])cmd.ExecuteScalar(); 

string s = Encoding.UTF8.GetString(binaryData); 

File.WriteAllText("algo.pdf", s); 

二码:

Conn.Open(); 
SqlCommand cmd = Conn.CreateCommand(); 
cmd.CommandText = "Select Artigo From Artigo WHERE (IDArtigo ='" + id + "')"; 
byte[] binaryData = (byte[])cmd.ExecuteScalar(); 

// Convert the binary input into Base64 UUEncoded output. 
string base64String; 
try 
{ 
    base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length); 
} 
catch (System.ArgumentNullException) 
{ 
    MessageBox.Show("Binary data array is null."); 
    return; 
} 

cmd.CommandText = "Select Titulo From Artigo WHERE (IDArtigo ='" + id + "')"; 
string titulo = (string)cmd.ExecuteScalar(); 

// Write the UUEncoded version to the output file. 
System.IO.StreamWriter outFile; 
try 
{ 
    outFile = new StreamWriter(titulo + ".pdf", false, System.Text.Encoding.ASCII); 
    outFile.Write(base64String); 
    outFile.Close(); 
} 
catch (System.Exception exp) 
{ 
    System.Console.WriteLine("{0}", exp.Message); 
} 
+0

如果你愿意,你可以看看[this](http://stackoverflow.com/questions/3961804/itextsharp-creation-of-a-pdf-from-a-list-of-byte-arrays)想从字节数组中创建PDF。 – Tilak

回答

6

你正在将文件写入文本,但您应该写入原始字节。 .PDF文件是一个二进制文件,而不是文本文件,因此实际上,您在第一个代码示例中填写了错误的数据。

尝试

Conn.Open(); 
    SqlCommand cmd = Conn.CreateCommand(); 
    cmd.CommandText = "Select Artigo From Artigo WHERE (IDArtigo ='" + id + "')"; 
    byte[] binaryData = (byte[])cmd.ExecuteScalar(); 
    File.WriteAllBytes(("algo.pdf", binaryData); 
    string s = Encoding.UTF8.GetString(binaryData); 

System.IO.File.WriteAllBytes在http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx被记录在案,如果您有更多的问题。

+0

这是我在多个问题和搜索中找到的最佳答案。我只想建议参数化这个命令文本,而不是连接一个字符串。即使你的id变量被设置为int,并且你不关心安全性,但为了一致性,它仍然是一个好习惯。 – Brad

3

与原始数据尝试File.WriteAllBytes(binaryData)不要试图将其转换为别的

0
string sql = "select Lsn_File from Lessons_tbl where Lsn_name = '"TextBox1.Text + "'"; 

     cmd = new SqlCommand(sql, dal.cn()); 

     dal.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 

     dr.Read(); 
     if (dr.HasRows) 
      {    
       byte[] lesson = (byte[])(dr[0]); 
       spathfile = System.IO.Path.GetTempFileName(); 
       //move from soures to destination the extension until now is .temp 
      System.IO.File.Move(spathfile, 
       System.IO.Path.ChangeExtension(spathfile,".pdf")); 
       //make it real pdf file extension .pdf 
       spathfile = System.IO.Path.ChangeExtension(spathfile, ".pdf"); 
       System.IO.File.WriteAllBytes(spathfile, lesson); 

       this.axAcroPDF1.LoadFile(spathfile); 
     dal.close();