2013-02-27 62 views
7

我们正在制作一个ASP.Net MVC应用程序,该应用程序需要能够生成PDF并将其显示在屏幕上或将其保存在用户易于访问的地方。我们使用PdfSharp来生成文档。一旦完成,我们如何让用户保存文档或在阅读器中打开文档?我特别困惑,因为PDF是在服务器端生成的,但我们希望它显示在客户端。如何在ASP.Net MVC中使用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); 
    } 
} 

在运行此,我得到一个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 
    } 
} 

回答

6

我不familar与PDF尖锐但MVC主要是通过做内置的功能。您需要将您的pdf文档表示为一个字节数组。然后,您只需使用MVC的File方法将其返回给浏览器并让它处理下载。他们班有什么方法可以做到吗?

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

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

} 
+3

有一个网页样本它显示了如何获取字节数组并将其返回给没有使用MVC的用户。使用MVC,只需要获取字节数组的代码(来自内存流,不需要文件)。示例:http://www.pdfsharp.net/wiki/Clock-sample.ashx – 2013-02-28 09:15:40

+2

对于新用户来说,它变得有点令人困惑,所以你(尼克阿尔布雷希特)麻烦地更新答案来做像@PDFsharpTeam这样的确切事情。帮手链接。 [** MemoryStream stream = new MemoryStream(); //// document.Save(stream,false); //// Byte [] documentBytes = stream.ToArray(); //// return文件(documentBytes,“application/pdf”); **](它对我有很大的帮助,谢谢!!!) – 2016-03-15 17:16:18

11

使用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 
} 
+0

FYI:'document.Save(stream,false)'这一行取参数'false'表示不应该关闭'stream'作为调用'Save'的副作用。这个行为是必须的,所以我们可以在下一行调用'stream.ToArray',这样我们使用的'using'块就可以按预期工作。 – Kevin 2014-07-18 18:49:25

+0

我已经下载并引用了DLL,但它说它找不到ReportPdfInput ..? – Murphybro2 2017-08-17 11:23:08

+0

@ Murphybro2'ReportPdfInput'是我们写的一个类,其中包含了我们需要的所有渲染PDF所需的信息。它不是图书馆的一部分。对困惑感到抱歉! – Kevin 2017-08-17 14:47:35

相关问题