如何在ASP.Net MVC中使用PdfSharp显示PDF?

Kev*_*ica 8 pdfsharp c#-4.0 asp.net-mvc-4

我们正在制作一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当这个运行时,我得到一个UnauthorizedAccessExceptiondocumentRenderer.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
    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*ica 12

使用Yarx的建议和PDFsharp Team的教程,这是我们最终得到的代码:

控制器:

[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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*cht 8

我不熟悉PDF sharp,但MVC主要是通过内置功能完成的.您需要将pdf文档表示为字节数组.然后你只需使用MVC的File方法将其返回给浏览器并让它处理下载.他们班上有没有办法做到这一点?

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • 有一个Web示例演示如何获取字节数组并将其返回给没有MVC的用户.使用MVC,您只需要代码来获取字节数组(来自内存流,无需文件).示例:http://www.pdfsharp.net/wiki/Clock-sample.ashx (3认同)
  • 对于新用户来说,它会变得有点混乱,所以你(NickAlbrecht)会更新答案来完成像@PDFsharpTeam添加辅助链接这样的确切事情.[**MemoryStream stream = new MemoryStream(); //// document.Save(stream,false); //// Byte [] documentBytes = stream.ToArray(); ////返回文件(documentBytes,"application/pdf");**](它给了我很多帮助.谢谢!!!) (2认同)