Мы создаем приложение ASP.Net MVC, которое должно иметь возможность создавать PDF-файлы и отображать их на экране или сохранять их где-то легко для пользователя. Мы используем PdfSharp для создания документа. Как только мы закончим, как мы разрешим пользователю сохранять документ или открывать его в читателе? Меня особенно смущает, потому что PDF создается серверной стороной, но мы хотим, чтобы он отображался на стороне клиента.Как показать PDF с помощью PdfSharp в ASP.Net MVC?
Вот контроллер MVC, чтобы создать отчет, который мы написали до сих пор:
public class ReportController : ApiController
{
private static readonly string filename = "report.pdf";
[HttpGet]
public void GenerateReport()
{
ReportPdfInput input = new ReportPdfInput()
{
//Empty for now
};
var manager = new ReportPdfManagerFactory().GetReportPdfManager();
var documentRenderer = manager.GenerateReport(input);
documentRenderer.PdfDocument.Save(filename); //Returns a PdfDocumentRenderer
Process.Start(filename);
}
}
Когда это работает, я получаю UnauthorizedAccessException
в documentRenderer.PdfDocument.Save(filename);
, который говорит, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied.
Я также не уверен, что произойдет, когда будет выполнена строка Process.Start(filename);
.
Это код в manager.GenerateReport(input)
:
public class ReportPdfManager : IReportPdfManager
{
public PdfDocumentRenderer GenerateReport(ReportPdfInput input)
{
var document = CreateDocument(input);
var renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
renderer.Document = document;
renderer.RenderDocument();
return renderer;
}
private Document CreateDocument(ReportPdfInput input)
{
//Put content into the document
}
}
Существует веб-образец который показывает, как получить массив байтов и вернуть его пользователю без MVC. С MVC вам нужен только код для получения байтового массива (из потока памяти, без файла). Пример: http://www.pdfsharp.net/wiki/Clock-sample.ashx –
Для новых пользователей это становится немного запутанным, так что бы вы (NickAlbrecht) потрудились обновить ответ, чтобы сделать то же самое, что и @PDFsharpTeam. вспомогательная ссылка. [** поток MemoryStream = новый MemoryStream(); //// document.Save (поток, ложь); //// Байт [] documentBytes = stream.ToArray(); //// return File (documentBytes, «application/pdf»); **] (Это очень помогло мне. Спасибо!) –