razorPDF - автоматическая нумерация страниц

Используя С# MVC, я создаю отчет, передавая частичное представление HTML через PdfResult. Это обеспечивает именно то, что необходимо, за исключением отсутствия номеров страниц.

GetDetails просто вызывает службу, которая возвращает список результатов. Затем вызывается представление printlist, используя список результатов в качестве модели (см. ниже).

Предоставляет ли RazorPDF способ указать номера страниц в отчете?

    public ActionResult PrintReport(DateTime printDate)
    {
        var printModel = printController.GetDetails(printDate);
        var pdfDoc = new PdfResult(printModel , "printlist");

        return pdfDoc;
    }

Вид:

<paragraph style="font-family:Arial;font-size:18;">
    <table width="100%" cellpadding="1.0" cellspacing="1.0" widths="5;5">
        <row>
            <cell borderwidth="0.5" left="false" right="false" top="false" bottom="false">
                <chunk style="font-size:14;font-weight:bold;">@ViewBag.Title</chunk>
            </cell>
            <cell borderwidth="0.5" left="false" right="false" top="false" bottom="false" horizontalalign="Right">
                <chunk style="font-size:14;font-weight:bold;">@Model.First().appointment_date.ToString().Substring(0,10)</chunk>
            </cell>
        </row>
    </table>
</paragraph>

<table width="100%" cellpadding="1.0" cellspacing="1.0" widths="4;10;7;14;4;4;4;3;4;4;4;4">
    <row>
        <cell borderwidth="0.5" left="false" right="false" top="true" bottom="true"><chunk>Time</chunk></cell>
        <cell borderwidth="0.5" left="false" right="false" top="true" bottom="true"><chunk>Name</chunk></cell>
        <cell borderwidth="0.5" left="false" right="false" top="true" bottom="true"><chunk>Number</chunk></cell>
        <cell borderwidth="0.5" left="false" right="false" top="true" bottom="true"><chunk>Reason</chunk></cell>
    </row>

        @foreach (var item in Model)
        {
            <row>
                <cell>@item.appointmentStart</cell>
                <cell>@item.surname,@item.forename</cell>
                <cell>@item.customerIdentifier</cell>
                <cell>@item.reason</cell>
            </row>
        }
</table>       

person J-Man    schedule 29.09.2014    source источник
comment
У вас есть какое-нибудь решение для этого?   -  person Girish Sakhare    schedule 15.12.2014
comment
Боюсь, нет решения!   -  person J-Man    schedule 14.04.2015
comment
Связанный вопрос: stackoverflow.com/q/25164257/715292. У этого вопроса есть лучшее решение, хотя он не отвечает на этот. .   -  person Chad    schedule 01.05.2015


Ответы (2)


RazorPDF не имеет возможности устанавливать номера страниц в файле PDF. Это связано с тем, что у него есть свойства, доступные из Object -> ActionResult -> ViewResultBase -> ViewResult (вы можете просмотреть их в Visual Studio, развернув ссылки и дважды щелкнув RazorPDF).

Чтобы добавить номера страниц, вам нужно будет произвести расчеты в самом представлении, чтобы определить, где должны быть разрывы страниц, и поместить их. Потенциально вы можете сделать это, передав в представление параметр, обозначающий, используется ли он для создайте PDF и покажите только номера страниц в то время.

У меня была аналогичная проблема, и я пробовал разные пакеты (RazorPDF, iTextSharp и HiQPdf). Если вы не ограничены RazorPDF, я бы рекомендовал изучить HiQPdf. Вы можете в основном настроить ActionResult, который определяет элементы верхнего и нижнего колонтитула, передать ему HTML-код представления, и он отобразит PDF с тем, что вы хотите для своего верхнего и нижнего колонтитула (если вы их установите). Для нумерации страниц это было так же просто, как:

 var pdfWorker = new HtmlToPdf();
 var html = "Html as string including tags";
 var url = "Whatever url you are converting - still works if empty string";
 pdfWorker.Document.Footer.Enabled = true;
 var pageNumberFont = new Font(new FontFamily("Arial"), 8, GraphicsUnit.Point);
 var pageNumberText = new PdfText(x-position, y-position, "Page {CrtPage} of {PageCount}, pageNumberFont);
 pdfWorker.Document.Footer.Layout(pageNumberText);
 return pdfWorker.ConvertHtmlToPdfDocument(html, url);

У меня есть некоторые дополнительные настройки в моем коде, но это должно быть основной суммой, чтобы дать вам нижний колонтитул с «Страница x из y» внизу каждой страницы.

РЕДАКТИРОВАТЬ: Поскольку решение ограничено только бесплатными вариантами, я бы рекомендовал посмотреть iTextSharp. Если вы используете NuGet, вы можете получить его через пакет NuGet.

Что касается использования iTextSharp, хорошими местами для начала будут:

Учебное пособие по iTextSharp

Как преобразовать HTML в PDF с помощью iTextSharp

Как добавить номер страницы в нижний колонтитул в PDF с помощью Itextsharp

person Bardicer    schedule 22.04.2015
comment
Ограничено решениями, которые не требуют платы за использование. - person Chad; 22.04.2015
comment
Хм.. Я поищу тебя. У HiQ есть бесплатная версия, но она помечает все водяными знаками. RazorPdf не имеет никаких функций, кроме рендеринга в формате pdf. - person Bardicer; 22.04.2015

Быстрый ответ, предложенный Ником, - НЕТ, RazorPDF не поддерживает возможность автоматического добавления номеров страниц в ваш документ.

RazorPDF использует более старую версию iTextSharp, которая, как мне кажется, была последней бесплатной версией iTextSharp. Последняя версия (5.5.5) доступна по лицензии AGPL.

Последняя версия iTextSharp в RazorPDF

идентификатор пакета = "iTextSharp" версия = "4.1.2" targetFramework = "net40"

Если рендеринг HTML не является проблемой, вы можете взглянуть на PDFsharp & MigraDoc. MigraDoc предоставляет функции нумерации страниц, как показано здесь

Надеюсь это поможет.

person lopezbertoni    schedule 23.04.2015