Отображение сгенерированного ASP.NET pdf byte[] на веб-странице без сохранения файла

Я использую iTextSharp для создания PDF. Я могу сохранить файл PDF из PDF-байта [].

byte[] outputPDF = cnt.CreateBreakPDF();
File.WriteAllBytes(pdfOutPutPath, outputPDF);

Каков наилучший способ отобразить вывод byte[] на веб-страницу?

Я хочу показать PDF внутри div на моей странице. Не PDF как полный ответ.

Я видел ответы для MVC, но я использую веб-приложение ASP.NET.

Есть ли лучший способ, чем использовать обработчики HTTP для этого? Я не хочу отправлять все детали для создания PDF в виде строки запроса.

3 ответа

Решение

Я пробовал это в jsFiddle, и он хорошо работает в Chrome и FF, нужно проверить и в других браузерах.

Преобразовать byte[] в Base64 с помощью,

string base64PDF = System.Convert.ToBase64String(outputPDF, 0, outputPDF.Length);

Все, что мне нужно было сделать, это указать MIME type как data:application/pdf;base64, в источнике и дать Base64 версия PDF,

<object data="data:application/pdf;base64, JVBERi0xLjQKJeLjz9MKMyA..." type="application/pdf" width="160px">
    <embed src="data:application/pdf;base64, JVBERi0xLjQKJeLjz9MKMyA..." type="application/pdf" />
</object>

Я не смог скрыть верхнюю панель инструментов, которая появляется в FF, добавив #toolbar=0&navpanes=0&statusbar=0,

IE8 нуждается в сохраненном файле PDF для отображения.

Попробуй это

Response.ContentType = "application/pdf";
Response.AddHeader("content-length", outputPDF.Length.ToString());
Response.BinaryWrite(outputPDF);

Я использую Convert.ToBase64String(content)для некоторых проектов без каких-либо проблем, до сегодняшнего дня с файлом 18 страниц размером около 1 МБ. Ошибка консоли Chrome:Failed to load resource: net::ERR_INVALID_URL. Думаю, это из-за размера строки?!

В итоге я использовал веб-API и просто вернул его как FileStreamResult вместо строки Base64.

var stream = new MemoryStream();
await stream.WriteAsync(content, 0, content.Length);
stream.Position = 0;
return new FileStreamResult(stream, "application/pdf");

Обновление: это в основном то же самое, чтобы отобразить его на бритвенной странице. Я просто скопировал сюда свой код для получения содержимого факса с помощью RingCentral. А еще лучше просто используйте FileContentResult поскольку у вас уже есть byte[].

public async Task<IActionResult> OnGet(string messageId)
{
    try
    {
        using (var rc = new RingCentral.RestClient(setting.ClientId, setting.ClientSecret, setting.Production, "Fax"))
        {
            await rc.Authorize(setting.UserName, setting.Extension, setting.Password);
            var extension = rc.Restapi().Account().Extension();
            var outputPDF = await extension.MessageStore(messageId).Content(messageId).Get();

            return new FileContentResult(outputPDF, "application/pdf");
        }
        return Page();
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message);
        throw;
    }
}

Будет ли что-то вроде этой работы?

<div>
<object data="myPDF.pdf" type="application/pdf" width="200" height="500">
alt : <a href="myPDF.pdf">myPDF.pdf</a>
</object>
</div> 

Вам просто нужно передать свой PDF в источник данных объекта.

Другие вопросы по тегам