Как отобразить PDF-файл с помощью PdfSharp в ASP.Net MVC?

мы делаем ASP.Net MVC приложение, которое должно быть в состоянии генерировать PDF и отображать его на экране или сохранить его где-то легко для доступа пользователя. Мы используем PdfSharp для создания документа. После того, как он будет завершен, как мы позволим пользователю сохранить документ или открыть его в читателе? Я особенно смущен, потому что PDF генерируется на стороне сервера, но мы хотим, чтобы он отображался на стороне клиента.


вот контроллер 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 at documentRenderer.PdfDocument.Save(filename); говорит, Access to the path 'C:Program Files (x86)Common FilesMicrosoft SharedDevServer.0report.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
    }
}

2 ответов


Я не знаком с PDF sharp, но для MVC в основном выполняется через встроенные функции. Вам нужно получить pdf-документ, представленный в виде массива байтов. Затем вы просто используете метод файла MVC, чтобы вернуть его в браузер и позволить ему обрабатывать загрузку. Есть ли какие-либо методы в их классе для этого?

public class PdfDocumentController : Controller
{
    public ActionResult GenerateReport(ReportPdfInput input)
    {
        //Get document as byte[]
        byte[] documentData;

        return File(documentData, "application/pdf");
    }

}

используя предложение Yarx и руководство команды PDFsharp, это код, который мы получили:

:
[HttpGet]
public ActionResult GenerateReport(ReportPdfInput input)
{
    using (MemoryStream stream = new MemoryStream())
    {
        var manager = new ReportPdfManagerFactory().GetReportPdfManager();
        var document = manager.GenerateReport(input);
        document.Save(stream, false);
        return File(stream.ToArray(), "application/pdf");
    }
}

ReportPdfManager:

public PdfDocument GenerateReport(ReportPdfInput input)
{
    var document = CreateDocument(input);
    var renderer = new PdfDocumentRenderer(true,
        PdfSharp.Pdf.PdfFontEmbedding.Always);
    renderer.Document = document;
    renderer.RenderDocument();

    return renderer.PdfDocument;
}

private Document CreateDocument(ReportPdfInput input)
{
    //Creates a Document and puts content into it
}