ASP.NET MVC:渲染视图以生成PDF:使用iTextSharp或更好的解决方案?

时间:2009-12-07 12:25:35

标签: html asp.net-mvc pdf-generation

我在HTML和适合打印的版本中显示收据。 HTML版本执行jQuery选项卡等,而打印机友好的零脚本和外部依赖项,没有主布局,没有其他按钮,内联CSS,并且可以毫无问题地保存为HTML。

由于我使用的是Spark View引擎,我认为使用iTextSharp引擎生成PDF是个好主意。但经过几段后我觉得它太麻烦了,因为a)我必须重写整个收据(源Spark视图长约5页)b)我从头开始遇到iTextSharp的问题 - 例如,编号列表保持项目符号,没有缩进和indentationLeft =“20”不起作用 - 可能是因为缺少文档,但是看(a)。

因此,我对PDF的要求非常简单:我希望保留相同的HTML,但在单个收据之间插入分页符(是的,我在单个文档中有几个)。

是否有一种简单的方法可以从视图/ HTML生成PDF而无需使用奇怪的半文档引擎重写视图?

更新:尝试过社区HTMLDoc版本;没有使用我的内联CSS样式,错误地显示货币的Unicode符号。 wkhtmltopdf确实选择了CSS,但没有使用货币符号; 我认为通过将字符集设置为utf-8解决了编码的问题。 wkhtmltopdf似乎很好,但我还没弄明白如何设置分页符......

3 个答案:

答案 0 :(得分:1)

如果您可以在内存中使用HTML,则可以将其转换为PDF。我曾经使用xhtmlrenderer做过类似的事情。它是一个捆绑iText的JAVA框架,能够将HTML流转换为PDF。由于它是用JAVA编写的,我使用ikvmc.exe将jar文件转换为.NET程序集,并直接从托管代码中使用它。

答案 1 :(得分:1)

 public class Pdf : IPdf
    {
        public FileStreamResult Make(string s)
        {
            using (var ms = new MemoryStream())
            {
                using (var document = new Document())
                {
                    PdfWriter.GetInstance(document, ms);
                    document.Open();
                    using (var str = new StringReader(s))
                    {

                        var htmlWorker = new HTMLWorker(document);

                        htmlWorker.Parse(str);
                    }
                    document.Close();
                }

                HttpContext.Current.Response.ContentType = "application/pdf";
                HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=MyPdfName.pdf");
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
                HttpContext.Current.Response.OutputStream.Flush();
                HttpContext.Current.Response.End();

                return new FileStreamResult(HttpContext.Current.Response.OutputStream, "application/pdf");
            }
        }
    }

答案 2 :(得分:0)

最后使用了wkhtmltopdf,当我设置编码时工作正常,我发现了如何设置分页符,并且它处理我的CSS非常好。问题在于它无法正确处理Windows版本中的stdin / out(不记得它是否进入或不运行) - 可能在最新版本中修复,但我对临时文件没问题。 / p>