从asp.net mvc生成PDF文件

hmi*_*aya 10 pdf asp.net asp.net-mvc

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

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

还有其他选择吗?

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

Gil*_*rts 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");
    }
Run Code Online (Sandbox Code Playgroud)

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

要将响应作为页面而不是下载返回,请将RT.ViewPDF行替换为

RT.ResponsePDF(report, System.Web.HttpContext.Current.Response);
Run Code Online (Sandbox Code Playgroud)

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

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

在这里下载Report.NET .

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

在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");
        }
    }  
Run Code Online (Sandbox Code Playgroud)

另一个编辑如果您对使用表生成大部分基于文本的文档感兴趣,那么非常值得查看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;
    }
Run Code Online (Sandbox Code Playgroud)

总结看了很多C#MVC的PDF解决方案后,我正在使用PDFSharp/MigraDoc.我已经打折iTextSharp并基于它进行项目,因为如果你在商业上使用它会花费很高的许可费用(在我的情况下为2500欧元).Report.NET是在考虑ASP.NET经典的情况下开发的,自2006年以来一直没有收到更新.


And*_*gan 7

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

额外奖励:他们都是免费的!

  • 如果您在商业上使用它们,则版本4.7之后的iTextSharp版本不是免费的.许可证已更改. (2认同)