使用ASP.net,C#,MVC在模板中生成pdf

时间:2011-12-08 15:20:40

标签: asp.net-mvc asp.net-mvc-3 entity-framework-4 pdf-generation

我是MVC的初学者,需要在提供的模板上生成发票的PDF。在做了一些谷歌搜索之后,现在我能够生成一个pdf而不是模板。任何身体都可以帮助我。我在下面写下我的代码:

public ActionResult pdfStatement(string InvoiceNumber)
{
    InvoiceNumber = InvoiceNumber.Trim();
    ObjectParameter[] parameters = new ObjectParameter[1];
    parameters[0] = new ObjectParameter("InvoiceNumber", InvoiceNumber);
    var statementResult = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters);
    Models.Statement statement = statementResult.SingleOrDefault();

    return ViewPdf("Invoice", "pdfStatement", statement);
}

public class PdfViewController : Controller
{
    private readonly HtmlViewRenderer htmlViewRenderer;
    private readonly StandardPdfRenderer standardPdfRenderer;

    public PdfViewController()
    {
        this.htmlViewRenderer = new HtmlViewRenderer();
        this.standardPdfRenderer = new StandardPdfRenderer();
    }

    protected ActionResult ViewPdf(string pageTitle, string viewName, object model)
    {
        // Render the view html to a string.
        string htmlText = this.htmlViewRenderer.RenderViewToString(this, viewName, model);
        // Let the html be rendered into a PDF document through iTextSharp.
        byte[] buffer = standardPdfRenderer.Render(htmlText, pageTitle);

        // Return the PDF as a binary stream to the client.
        return new BinaryContentResult(buffer, "application/pdf");
    }
}

public class BinaryContentResult : ActionResult
{
    private readonly string contentType;
    private readonly byte[] contentBytes;

    public BinaryContentResult(byte[] contentBytes, string contentType)
    {
        this.contentBytes = contentBytes;
        this.contentType = contentType;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.Clear();
        response.Cache.SetCacheability(HttpCacheability.Public);
        response.ContentType = this.contentType;

        using (var stream = new MemoryStream(this.contentBytes))
        {
            stream.WriteTo(response.OutputStream);
            stream.Flush();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

我会推荐iTextSharp库。

使用该库从c#中查看此 tutorial on how to populate a pdf 。使用Adobe Acrobat中的字段创建pdf,然后从代码中填充字段。

// Open the template pdf
PdfReader pdfReader = new PdfReader(Request.MapPath("~/assets/form.pdf")); 
PdfStamper pdfStamper = new PdfStamper(pdfReader, Response.OutputStream);
pdfStamper.FormFlattening = true; // generate a flat PDF 

// Populate the fields
AcroFields pdfForm = pdfStamper.AcroFields;
pdfForm.SetField("InvoiceRef", "00000");
pdfForm.SetField("DeliveryAddress", "Oxford Street, London");
pdfForm.SetField("Email", "anon@anywhere.com");
pdfStamper.Close(); 

答案 1 :(得分:3)

这不是问题的答案,而是我在asp.net中关于pdf生成的经验。也许它会节省你的时间。 不幸的是,我没有找到足够的免费工具来生成pdf文件。

我尝试使用HtmlViewRenderer,但它对我来说对复杂的css不起作用。 比我找到pdfsharp。有很多关于StackOverFlow使用的好文章。

这有助于我创建发票 - 简单的表格,但我想警告,你会用手添加行。而且该代码看起来不太好。它也不适用于复杂的CSS。

对于丰富多彩的报道,我们正在使用PdfCrowd。 这是一种将您的html呈现为pdf的服务。它运作完美,但不是免费的,最便宜的计划每年花费10美元。

在官方网站上,您可以找到ASP.NET的.net库和示例。

答案 2 :(得分:0)

试试这个ejsreport

它使用JSON和Javascript但完成工作。

我一直在尝试在MVC中寻找一个更简单的报告工具,这是我发现的最好的。