RKparmar Ответов: 1

Sql varbinary(MAX) to webbrowser control конвертирует PDF-данные без создания PDF-файла


Всем Привет.

У меня есть проблема с преобразованием данных Varbinary в WebBrowser. у меня есть загрузить pdf-файл в sql server.

Код Загрузки :
FileInfo f = new FileInfo(ofg.FileName);
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
br.Close();
fs.Close();
if (bytes.Length > 0)
{
        try
        {
        string strQuery = "INSERT INTO DOC_DET (DOC_FILE) VALUES(@DOC_FILE)";
        SqlCommand cmd = new SqlCommand(strQuery);
        cmd.Parameters.Add("@DOC_FILE", SqlDbType.Binary).Value = bytes;
        cmd.CommandType = CommandType.Text;
        cmd.Connection = con;
        con.Open();
        cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            ex.Message.ToString();
        }
        finally { con.Close(); }
}


Теперь я хочу получить эти данные Varbinary в элемент управления WebBrowser

string sql_string = "SELECT DOC_FILE FROM DOC_DET where SEQ_NO = 1;
using (SqlCommand cmd = new SqlCommand(sql_string, con))
             {
                 con.Open();
                 Byte[] bytes = (Byte[])cmd.ExecuteScalar();
                 con.Close();

                 if (drv["DOC_TYPE"].ToString() == ".pdf")
                 {
                     MemoryStream stream = new MemoryStream(bytes);
                     webBrowser1.DocumentStream = stream;
                     webBrowser1.Show();
                 }
             }


Что я уже пробовал:

Я получаю этот тип отображения юникода в webbrowser control

output code : "%PDF-1.4 %ÿÿÿÿ 34 0 obj <> stream 2017-10-10T08:36:21Z Nitro Pro 7 (7. 0. 2. 8) 2017-10-10T08:36:22Z 2017-10-10T08:36:22Z application/pdf Nitro Pro 7 (7. 0. 2. 8) uuid:4308e8b5-94b6-42d8-b4f7-4b74a08537af endstream endobj 33 0 obj <> endobj 32 0 obj <> stream xÚl»Â0 E÷~…G˜ÂClˆ„ԁ‡¨Äb·ŠDÈIþž¤- ±|}®eGíëCÍ6‚ºŠ3 Eh-£PpI Áƒ:ËÕrhMœªá5½ö•Êææ"õ5·Ö#…ÉO¤ºå¢¼`Ö¸§Åƒ3©'ŽaHm¥.‚$–;˜ÝIP³žô&yÿ¤BÂfPˆqÈËq°qHÁkC¢¹£j»È±ƒí1Ç®°?ýÉõhÿà0VÅõé—åºýIû³î LÉ» Ç©¢–],Ó÷—Þÿÿ*È/é;ÿÿ)jq& endstream endobj 31 0 obj <> stream xÚbÿÿb``h¸ÿÿAýÿý/êïï=ÿÿ> stream xÚ¤ËEPч»»»»ßÿfü lé¢I'þLägGÅBÇ%$¥¤edåä•”UTÕ¾Œº†¦–¶Ž®ž¾¡‘±‰©YxÌ-,­¬mlíì;|ü£“³‹«›»‡g`/oÿÿ²`°d°b°f°òlìì€,G'gÿÿñ™ç endstream endobj 29 0 obj <> stream xÚl[HaÇÿ3»Š†•—¤¥ü†I‹\" i©õAÔ4gIav]u/ë%Q‰RºX£T†‰X„I%]¨O{ñÒÖ Ò ¤· P(¢— ª·Øí̪¥äïr~ÿsÎwÎ×Ör² ±è†ÎÊö6}d,ÀM@®Ô4œk|Ó ˆhÍÔÔwVg5ÝX¿EKz•×_?"mŽ¿¥œÀP(.(³’¿[ohëÈ–c<"

Не показывать PDF должным образом.

я не сохраняю pdf файл файл прямого отображения

1 Ответов

Рейтинг:
2

an0ther1

Первый вопрос у вас есть, вы с помощью executescalar. ExecuteScalar возвращает только первые 2033 символа - см. MSDN; Свойство sqlcommand.Метод ExecuteScalar ()[^]

Лучший вариант-вернуть Datatable/DataSet, содержащий ваши данные.
Тогда код, который я использую, который работает в IE и Chrome, выглядит следующим образом;

// get the data from the datatable
byte[] bytFile = (byte[])dataTable.Rows[0][VarbinaryFieldName];
// you need to pass the file extension and MIME type & ContentType - hardcoded for brevity
// note the \ characters are to escape the " quote marks
this.Context.Response.ContentType = "\".pdf\",\"application/pdf\"";
// add Header
this.Context.Response.AddHeader("Content-disposition","attachment; filename=filename.pdf");
this.Context.Response.BinaryWrite(bytFile);
Response.End(); 


с уважением


RKparmar

Спасибо за решение.
Но в приложении winform нет свойства contentType.
так как же мне это сделать ?

Объекта datarowview ДРВ = dgvDocument.Ряды[электронный.RowIndex].DataBoundItem как DataRowView;
string sql_string = "SELECT DOC_FILE FROM DOC_DET where SEQ_NO =" + drv["SEQ_NO"];
используя (sqlcommand, который команду cmd = новый sqlcommand объект(sql_string, кон))
{
против.Открыть();

SqlDataReader dr = cmd.Метода executereader();
DataTable dt = новый DataTable();
ДТ.Нагрузки(др);
Byte[] bytes = (Byte[])dt.Rows[0]["DOC_FILE"];
против.Закрывать();

if (drv["DOC_TYPE"].Метод toString() == ".формат PDF")
{
MemoryStream stream = Новый Поток памяти(байты);
метода webbrowser1.DocumentStream = поток;
метода webbrowser1.Показать();
}
}

an0ther1

После быстрого исследования вы не можете сделать это с помощью Acrobat - он не может заполнить документ из потока. Даже если использовался элемент управления браузера, Acrobat никогда не выводится из потока. Поток сохраняется во временных Интернет-файлах и затем отображается.
По - видимому, есть пакет NuGet, который может отображать PDF-файл из потока, выполнять поиск PDFium. Я не могу поручиться за функциональность, и я не рекомендую ее или одобряю, но это может решить вашу проблему.
Возможно, вам нужно пересмотреть свой дизайн здесь.

с уважением