从asp.net mvc生成PDF文件

时间:2009-11-19 02:05:04

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

我想从我的asp.net mvc应用程序打印收据。目前我认为我最好的选择是创建PDF文件,这些文件在打印时更容易处理,因为边距/页眉/页脚/等等。

我不想让他们配置他们的浏览器只是为了打印我的收据,其中一些不是那么聪明。

还有其他选择吗?

从asp.net mvc应用程序生成PDF的最佳(免费)库/ api是什么

5 个答案:

答案 0 :(得分:9)

使用Report.NET代码在MVC操作中返回他们的hello world示例:

    public void MyPDFAction()
    {
        Root.Reports.Report report = new Root.Reports.Report(new PdfFormatter());
        FontDef fd = new FontDef(report, "Helvetica");
        FontProp fp = new FontPropMM(fd, 25);
        Page page = new Page(report);
        page.AddCB_MM(80, new RepString(fp, "Hello World!")); 
        RT.ViewPDF(report, "HelloWorld.pdf");
    }

操作的返回类型为void,因为Report.NET代码直接更新响应,默认情况下会为void操作返回该响应。这将直接从浏览器打开一个pdf查看器。

要将响应作为页面而不是下载返回,请使用

替换RT.ViewPDF行
RT.ResponsePDF(report, System.Web.HttpContext.Current.Response);

但是,此方法被标记为已弃用,而有利于处理System.Web.UI.Page的方法。不幸的是,我不知道如何在MVC应用程序的上下文中处理Page对象。

我无法让Report.NET开始下载PDF文件。

下载Report.NET here

编辑我最近发现PDFSharp似乎比Report.NET更新。它也可以在MIT许可下使用。您可以从here下载。还有一个广泛的wiki,有很多例子。

在MVC中作为下载文件返回的基本代码:

    [HttpGet]
    public ActionResult MyPdfAction()
    {
        using (MemoryStream stream = new MemoryStream())
        {
            PdfDocument document = new PdfDocument();
            PdfPage page = document.AddPage();
            XGraphics gfx = XGraphics.FromPdfPage(page);
            XFont font = new XFont("Verdana", 20, XFontStyle.Bold);
            gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);
            document.Save(stream, false);
            return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf");
        }
    }  

另一个编辑如果您对使用表生成大部分基于文本的文档感兴趣,那么值得查看MigraDoc,因为它在PDFSharp原语之上提供了一个有用的抽象层。 MigraDoc包含在PDFSharp下载中。您需要将PDFSharp,PDFSharp.Charting,MigraDoc.DocumentObjectModel和MigraDoc.Rendering项目添加到您的项目中,以使其全部正常工作。

生成PDF以供下载的代码:

    [HttpGet]
    public ActionResult MyPdfAction()
    {
        using (MemoryStream stream = new MemoryStream())
        {
            Document document = CreateDocument();
            document.UseCmykColor = true;
            const bool unicode = false;
            const PdfFontEmbedding embedding = PdfFontEmbedding.Always;
            PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(unicode, embedding);
            pdfRenderer.Document = document;
            pdfRenderer.RenderDocument();
            pdfRenderer.PdfDocument.Save(stream, false);
            return File(stream.ToArray(), "application/pdf", "HelloWorld.pdf");
        }
    }


    /// <summary>
    /// Creates an absolutely minimalistic document.
    /// </summary>
    static Document CreateDocument()
    {
        Document document = new Document();
        Section section = document.AddSection();
        Paragraph paragraph = section.AddParagraph();
        paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50);
        paragraph.AddFormattedText("Hello, World!", TextFormat.Bold);
        return document;
    }

摘要在研究了C#MVC的大量PDF解决方案之后,我正在使用PDFSharp / MigraDoc。我已经打折iTextSharp并基于它进行项目,因为如果你在商业上使用它会产生昂贵的许可成本(在我的情况下为2500欧元)。 Report.NET是在考虑ASP.NET经典的情况下开发的,自2006年以来一直没有收到更新。

答案 1 :(得分:7)

我使用Report.net以及iTextSharp以PDF格式创建条形码标签取得了很大成功。特别是对于iTextSharp,API看起来很简单,并且在我们的ASP.NET MVC应用程序中运行良好。没有很多关于iTextSharp的文档,所以你必须查找iText的java文档(它是它的端口)。

奖金:他们都是自由的!

答案 2 :(得分:2)

如果您使用的是MVC 4,请查看:http://www.nyveldt.com/blog/post/Introducing-RazorPDF

答案 3 :(得分:0)

如果您希望生成可以打印的PDF,我会使用iTextSharp,但就其他选项而言,为什么不使用css来设置页面的打印机友好选项呢?

答案 4 :(得分:0)

 public ActionResult Index()
        {
            DiplomaModel objdb = new DiplomaModel();
            return View(from Diploma in objdb.DiplomaList.Take(10)
                        select Diploma);
        }

        [HttpPost]
        [ValidateInput(false)]
        public FileResult Export(string GridHtml)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                StringReader sr = new StringReader(GridHtml);
                Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
                PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
                pdfDoc.Open();
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
                pdfDoc.Close();
                return File(stream.ToArray(), "application/pdf", "Grid.pdf");
            }
        }

@查看部分

@model AUC.CommonUtility.DiplomaModel


    @{
        Layout = null;
    }

    <!DOCTYPE html>

    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>PDF Generate</title>
        <style type="text/css">
            body {
                font-family: Arial;
                font-size: 9pt;
            }
        </style>
    </head>
    <body>
        <h4>Student</h4>
        <hr />
        <div id="Grid">
            <table cellpadding="5" cellspacing="0" style="border: 1px solid #ccc;font-size: 9pt;">
                <tr>
                    <th style="background-color: #B8DBFD;border: 1px solid #ccc">Student Name</th>
                    <th style="background-color: #B8DBFD;border: 1px solid #ccc">Father Name</th>

                </tr>
                @foreach (var item in Model.DiplomaList)
                {
                    <tr>
                        <td style="width:120px;border: 1px solid #ccc">@item.DiplomaStudentName</td>
                        <td style="width:120px;border: 1px solid #ccc">@item.DSFatherName</td>

                    </tr>
                }
            </table>
        </div>
        <br />
        <br />
        @using (Html.BeginForm("Export", "ExportPDF", FormMethod.Post))
        {
            <input type="hidden" name="GridHtml" />
            <input type="submit" id="btnSubmit" value="Export" />
        }
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script type="text/javascript">
            $(function () {
                $("#btnSubmit").click(function () {
                    $("input[name='GridHtml']").val($("#Grid").html());
                });
            });
        </script>
    </body>
</html>