代码之家  ›  专栏  ›  技术社区  ›  queen3

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

  •  3
  • queen3  · 技术社区  · 16 年前

    我以HTML和打印机友好版本显示收据。HTML版本执行jquery选项卡等操作,而打印机友好型则没有脚本和外部依赖项,没有主布局,没有其他按钮,内联CSS,可以保存为HTML而不会出现问题。

    因为我使用了Spark View引擎,所以我认为使用ITextSharp引擎生成PDF可能是个好主意。但是在几段之后,我觉得这太麻烦了,因为a)我必须重写整个收据(源Spark视图大约有5页长)b)我从一开始就有ITextSharp的问题-例如,编号列表保持项目符号,没有缩进,indenticationLeft=“20”不起作用-可能是因为缺少文档,但是请参阅(a)

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

    有没有一种简单的方法可以从View/HTML生成PDF而不使用奇怪的 半文件化的 发动机?

    更新:尝试了CommunityHTMLDoc版本;没有使用我的内联CSS样式,货币的Unicode符号显示不正确。 wkhtmltopdf 确实选择了CSS,但货币符号失败; 我想编码有问题 通过将charset设置为utf-8来解决。wkhtmltopdf看起来不错,但我还没弄清楚如何设置分页符…

    3 回复  |  直到 14 年前
        1
  •  1
  •   Darin Dimitrov    16 年前

    如果您可以将HTML保存在内存中,那么您可以将其转换为PDF格式。我曾经用类似的方法 xhtmlrenderer . 它是一个捆绑ItEXT的Java框架,它能够将HTML流转换成PDF。因为它是用Java编写的,所以我使用了 ikvmc.exe 将JAR文件转换为.NET程序集,并直接从托管代码中使用它。

        2
  •  1
  •   Omu    15 年前
     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");
                }
            }
        }
    
        3
  •  0
  •   queen3    16 年前

    最后使用了wkhtmltopdf,它在我设置编码时工作得很好,我发现了如何设置分页符,它处理我的CSS非常好。有问题的是,它无法在Windows版本中正确处理stdin/out(不记得它是否在in或out中不起作用),可能在最新版本中得到修复,但我对temp文件没问题。