Генерация PDF файлов из asp.net mvc - PullRequest
9 голосов
/ 19 ноября 2009

Я хочу распечатать квитанции из моего приложения asp.net mvc. Сейчас я думаю, что мой лучший вариант - это создавать PDF-файлы, которые легче обрабатывать, когда они собираются их печатать, из-за полей / верхних колонтитулов / нижних колонтитулов / и т.д.

Я не хочу, чтобы они настраивали свои браузеры только для того, чтобы они могли распечатывать мои чеки, некоторые из них просто не такие умные.

Есть ли другие варианты?

Какая лучшая (бесплатная) библиотека / API для создания PDF-файлов из приложения asp.net mvc

Ответы [ 5 ]

9 голосов
/ 08 октября 2013

Использование Report.NET код для возврата их Привет мир пример в действии MVC:

    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");
    }

Тип возврата действия недействителен, поскольку код Report.NET напрямую обновляет ответ, который возвращается по умолчанию для недействительных действий. Это открывает программу просмотра PDF прямо из браузера.

Чтобы получить ответ, возвращенный в виде страницы, а не загрузки, замените строку RT.ViewPDF на

RT.ResponsePDF(report, System.Web.HttpContext.Current.Response);

Однако этот метод помечен как устаревший в пользу того, который работает с System.Web.UI.Page. К сожалению, я не знаю, как обращаться с объектом Page в контексте приложения MVC.

Мне не удалось заставить 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");
        }
    }  

Другое редактирование Если вам интересно создавать в основном текстовые документы с таблицами, стоит проверить 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;
    }

Резюме Изучив ряд решений PDF для C # MVC, я использую PDFSharp / MigraDoc. Я обесценил iTextSharp и проекты на его основе из-за дорогостоящих затрат на лицензирование, если вы используете его в коммерческих целях (2500 евро в моем случае). Report.NET был разработан с учетом классики ASP.NET и не обновлялся с 2006 года.

7 голосов
/ 19 ноября 2009

Я успешно справился с созданием меток штрих-кода в формате PDF с использованием Report.net , а также iTextSharp . В частности, для iTextSharp API выглядел достаточно простым и хорошо работал в нашем приложении ASP.NET MVC. Не так много документации для iTextSharp, поэтому вам нужно поискать документацию по Java для iText (которая является портом).

Бонус: они оба бесплатны!

2 голосов
/ 20 мая 2013

Если вы используете MVC 4, проверьте это: http://www.nyveldt.com/blog/post/Introducing-RazorPDF

0 голосов
/ 15 марта 2019
 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>
0 голосов
/ 19 ноября 2009

Я бы использовал iTextSharp, если вы хотите создавать PDF-файлы для печати, но, если говорить о других параметрах, почему бы просто не использовать CSS для стилизации варианта страницы для печати?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...