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)
当这个运行时,我得到一个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
}
}
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)
我不熟悉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)
归档时间: |
|
查看次数: |
16994 次 |
最近记录: |