Отображение сгенерированного 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 в источник данных объекта.