我想在控制器上调用一个动作.让控制器从模型中获取数据.然后该视图将运行并生成PDF.我找到的唯一例子是Lou的一篇文章http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action.他的代码非常优雅.该视图使用ITextSharp生成PDF.唯一的缺点是他的例子使用了Spark View引擎.有没有办法用标准的Microsoft视图引擎做类似的事情?
Dav*_*vid 83
我使用iTextSharp在MVC中生成动态PDF.您需要做的就是将PDF放入Stream对象,然后ActionResult返回FileStreamResult.我还设置了内容配置,以便用户可以下载它.
public FileStreamResult PDFGenerator() { Stream fileStream = GeneratePDF(); HttpContext.Response.AddHeader("content-disposition", "attachment; filename=form.pdf"); return new FileStreamResult(fileStream, "application/pdf"); }
我也有代码,使我能够获取模板PDF,写文本和图像等(如果你想这样做).
private Stream GeneratePDF() { //create your pdf and put it into the stream... pdf variable below //comes from a class I use to write content to PDF files MemoryStream ms = new MemoryStream(); byte[] byteInfo = pdf.Output(); ms.Write(byteInfo, 0, byteInfo.Length); ms.Position = 0; return ms; }
Eri*_*Cal 24
我们对这个问题的最终答案是使用Rotativa.
它像其他一些解决方案一样包装了WKhtmltopdf.exe,但到目前为止我发现它是最容易使用的
我上去投了所有其他答案,这也很好地解决了问题,但这就是我们用来解决上述问题中提出的问题.它与其他答案不同.
这是一个Rotativa教程.
安装后,这就是您的需要
public ActionResult PrintInvoice(int invoiceId)
{
return new ActionAsPdf(
"Invoice",
new { invoiceId= invoiceId })
{ FileName = "Invoice.pdf" };
}
Run Code Online (Sandbox Code Playgroud)
非常非常简单.
在html中创建布局并在之后打印成pdf是最快的方法.
html into pdf转换由phantomjs,wkhtmltopdf或jsreport提供
jsreport提供与asp.net mvc视图的直接集成,您可以在其中使用属性标记控制器操作,它将为您打印pdf而不是html.
更多关于此博客文章
免责声明:我是jsreport的作者
这是一个古老的问题,但仍然具有相关性,我认为我只是分享我已经实施的哪个效果很好.
安装NuGet包TuesPechkin - 基于WkHtmlToPdf的Pechkin库中的一个fork,它使用Webkit引擎将HTML页面转换为PDF.
写一个小助手来读取视图并将其转换为HTML字符串(mvcContext是this.HttpContext).替换当然是可选的!:
public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string viewName, object model)
{
var context = System.Web.HttpContext.Current;
var contextBase = mvcContext;
var routeData = new RouteData();
if (area == null) area = "";
routeData.DataTokens.Add("area", area);
routeData.Values.Add("controller", controllerName);
var controllerContext = new ControllerContext(contextBase,
routeData,
new EmptyController());
var razorViewEngine = new RazorViewEngine();
var razorViewResult = razorViewEngine.FindView(controllerContext,
viewName,
"",
false);
var writer = new StringWriter();
var viewContext = new ViewContext(controllerContext,
razorViewResult.View,
new ViewDataDictionary(model),
new TempDataDictionary(),
writer);
razorViewResult.View.Render(viewContext, writer);
string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority;
return writer.ToString()
.Replace("src=\"/", "src=\"" + hostAddress + "/")
.Replace("<link href=\"/", "<link href=\"" + hostAddress + "/");
}
class EmptyController : ControllerBase
{
protected override void ExecuteCore() { }
}
Run Code Online (Sandbox Code Playgroud)以上的辛勤工作来自:http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment = 1414603363455 #c7863520150405064571
创建MVC操作以生成文档
public ActionResult DownloadPDF(long CentreID)
{
var model = GetModel()
IPechkin converter = Factory.Create();
byte[] result = converter.Convert(Helpers.PDF.RenderViewToString(this.HttpContext, "area", "controller", "action", model);
MemoryStream outputStream = new MemoryStream();
outputStream.Write(result, 0, result.Length);
outputStream.Position = 0;
return File(outputStream, "application/pdf", "filename.pdf");
}
Run Code Online (Sandbox Code Playgroud)我也遇到了这个http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3.它简单快捷,适合MVC.
然而,到目前为止唯一的缺点是它不是很灵活,你想要有一个像样的布局,例如,你没有很多控制表,和通过HTML的单元格边框.它有点支持强制新页面,但你必须在iTextsharp上应用补丁.
归档时间: |
|
查看次数: |
83370 次 |
最近记录: |