Member 14192879 Ответов: 1

Как открыть pdf в iframe из двоичных данных(в виде байтов)?


Я работаю над этим asp.net веб-приложение. Я извлекаю список pdf-файлов в виде сетки. теперь я хочу показать pdf в iframe, а также получить pdf в байтах при нажатии на вид сетки.

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

	cmd.Connection = con;
	con.Open();

	using (MySqlDataReader dr = cmd.ExecuteReader())
	{
		dr.Read();
		bytes = (byte[])dr["Data"];
		contentType = dr["ContentType"].ToString();
	}

	con.Close();
}

string base64 = Convert.ToBase64String(bytes, 0, bytes.Length);

string pdfframesrc = "data:Application/pdf;base64,{0}" + base64;

myiframe.Attributes["Src"] = pdfframesrc;

MadMyche

И что же происходит? Это работает? Выкинуть ошибку? Вы получаете контент, который хотите, когда отладка?

Member 14192879

нет, он не работает, он не показывает pdf в iframe. а также он не показывает никаких ошибок

MadMyche

Что бы я сделал, так это запустил бы это в Отладчик установите Точка прерывания, а затем шагайте по строке за строкой, чтобы увидеть, какие значения, чтобы увидеть, какая строка вызывает проблему.

1 Ответов

Рейтинг:
7

Richard Deeming

URL-Адреса Данных[^] имеют максимальную длину, которая варьируется в зависимости от браузера. Например, в Chrome ограничение составляет 2 Мб. В опере, ограничение в 64кб.

PDF-файлы могут легко превысить этот предел.

Лучше всего было бы создать универсальный обработчик для загрузки PDF-файла для определенной строки и указать свой <iframe> к этому куратору.

myiframe.Attributes["src"] = ResolveUrl("~/loadPdfFile.ashx?id=" + idOfTheRecordToLoad);
LoadPdfFile.ashx:
public class LoadPdfFileHandler : IHttpHandler
{
    public bool IsResuable => false;
    
    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        // TODO: Verify that the user is allowed to view the specified record.
        
        using (var connection = new MySqlConnection("..."))
        using (var command = new MySqlCommand("SELECT Data, ContentType FROM SomeTable WHERE ID = @ID", connection))
        {
            command.Parameters.AddWithValue("@ID", id);
            
            connection.Open();
            using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
            {
                if (!reader.Read())
                {
                    context.Response.StatusCode = 404;
                    return;
                }

                string contentType = (string)dr["ContentType"];
                if (string.IsNullOrEmpty(contentType)) contentType = "application/octet-stream";
                context.Response.ContentType = contentType;
                
                byte[] bytes = (byte[])dr["Data"];
                context.Response.BinaryWrite(bytes);
            }
        }
    }
}


Member 14192879

Большое спасибо. Это решение решило мою проблему. можем ли мы сохранить тот же pdf-файл обратно в базу данных после некоторых изменений в pdf-файле?

Richard Deeming

Вы не можете редактировать PDF-файл в браузере. Вам нужно будет позволить пользователю загрузить PDF-файл, отредактировать его с помощью программного обеспечения, установленного на его компьютере, а затем снова загрузить обновленный файл.