PDFsharp: есть ли способ создать страницу X из Y в заголовке страницы?

Это кажется довольно простым, но я не могу найти что-то вроде getPageCount() в API. Я могу заставить его возвращать текущую страницу, но не общее количество страниц. Возможно, я пропускаю это?

Я хотел бы как-то иметь возможность печатать «Страница 1 из 9» вверху каждой страницы, где «1», конечно же, — это текущий номер страницы.


person mkautzm    schedule 21.10.2013    source источник
comment
Не могли бы вы показать код, пожалуйста?   -  person sarseyn    schedule 21.10.2013


Ответы (5)


С PDFsharp все зависит от вас.

Я предполагаю, что вы используете MigraDoc: с помощью MigraDoc вы можете добавить заголовок страницы. Добавьте paragraph.AddPageField() для текущего номера страницы и paragraph.AddNumPagesField() для общего количества страниц.

Пример, использующий AddPageField

Фрагмент кода из примера:

// Create a paragraph with centered page number. See definition of style "Footer".
Paragraph paragraph = new Paragraph();
paragraph.AddTab();
paragraph.AddPageField();

// Add paragraph to footer for odd pages.
section.Footers.Primary.Add(paragraph);
// Add clone of paragraph to footer for odd pages. Cloning is necessary because an object must
// not belong to more than one other object. If you forget cloning an exception is thrown.
section.Footers.EvenPage.Add(paragraph.Clone());

Фрагмент кода, который устанавливает позицию табуляции (при условии, что DIN A 4 с корпусом 16 см):

style = document.Styles[StyleNames.Footer]; 
style.ParagraphFormat.AddTabStop("8cm", TabAlignment.Center); 

Оба фрагмента взяты со связанного сайта. Пример кода также доступен для скачивания.

person I liked the old Stack Overflow    schedule 21.10.2013
comment
Образец, показанный на этой странице, не работает. Я имею в виду, что номер страницы не меняется. - person Marek Bar; 01.05.2014
comment
@Marek Bar: AddNumPagesField добавляет количество страниц в документе (и не меняется между страницами), AddPageField добавляет текущий номер страницы и изменяется от страницы к странице. - person I liked the old Stack Overflow; 05.05.2014
comment
@PDFsharpTeam ... если я хочу отображать номер страницы, ТОЛЬКО если PDF-файл БОЛЕЕ длины страницы ... как мне это сделать? Теперь мой PDF-файл отображает страницу: 1, даже если у меня всего одна страница. - person Romias; 20.12.2014
comment
@Romias: при первом запуске создайте документ для наиболее вероятного случая (например, без нижнего колонтитула, если одна страница более вероятна, чем несколько страниц). Если PDF-файл не такой, как ожидалось (например, более одной страницы), выбросьте его и создайте новый документ с нижним колонтитулом. Или всегда создавайте его с нижним колонтитулом и используйте PDFsharp, чтобы нарисовать белый прямоугольник над нижним колонтитулом, если это одна страница (это хак). Или всегда создавайте его без нижнего колонтитула и используйте PDFsharp, чтобы нарисовать нижний колонтитул, если это необходимо. - person I liked the old Stack Overflow; 12.01.2015
comment
Работает отлично :) - person FranzHuber23; 07.03.2019

Обязательно включите оператор using MigraDoc.DocumentObjectModel; в свой класс.

Document document = new Document();
Section section = document.AddSection();

Paragraph paragraph = new Paragraph();
paragraph.AddText("Page ");
paragraph.AddPageField();
paragraph.AddText(" of ");
paragraph.AddNumPagesField();

section.Headers.Primary.Add(paragraph);
person Kidquick    schedule 18.06.2015
comment
Что это за MigraDoc и где его взять? Я использую PdfSharp, как указано в вопросах. У меня нет Document, только PdfDocument - person sLw; 12.10.2018
comment
@sLw MigraDoc — это слой поверх PDFsharp, который обеспечивает объектно-ориентированный подход к созданию PDF-файлов. Упрощает дизайн PDF IMO. См. pdfsharp.net для получения дополнительной информации. - person Kidquick; 22.04.2019

Я знаю, что этот вопрос старый и на него есть принятый ответ, однако этот вопрос возникает одним из первых при поиске решения PDFsharp.

Для справки, добиться этого в PDFsharp очень просто. Класс PdfDocument, находящийся в пространстве имен PdfSharp.Pdf, содержит набор страниц (PdfDocument.Pages). Все, что вам нужно сделать, это перебрать коллекцию и добавить счетчик страниц где-нибудь на каждой странице, используя объект XGraphics, который вы можете создать с помощью XGraphics.FromPdfPage(PdfPage).

using PdfSharp.Pdf; // PdfDocument, PdfPage
using PdfSharp.Drawing; // XGraphics, XFont, XBrush, XRect
                        // XStringFormats

// Create a new PdfDocument.
PdfDocument document = new PdfDocument();
// Add five pages to the document.
for(int i = 0; i < 5; ++i)
    document.AddPage();

// Make a font and a brush to draw the page counter.
XFont font = new XFont("Verdana", 8);
XBrush brush = XBrushes.Black;

// Add the page counter.
string noPages = document.Pages.Count.ToString();
for(int i = 0; i < document.Pages.Count; ++i)
{
    PdfPage page = document.Pages[i];

    // Make a layout rectangle.
    XRect layoutRectangle = new XRect(0/*X*/, page.Height-font.Height/*Y*/, page.Width/*Width*/, font.Height/*Height*/);

    using (XGraphics gfx = XGraphics.FromPdfPage(page))
    {
        gfx.DrawString(
            "Page " + (i+1).ToString() + " of " + noPages,
            font,
            brush,
            layoutRectangle,
            XStringFormats.Center);
    }
}

Стоит отметить, что если объект XGraphics уже существует для данной страницы, перед созданием нового необходимо удалить старый. Это не удастся:

PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();

XGraphics gfx1 = XGraphics.FromPage(page);
XGraphics gfx2 = XGraphics.FromPage(page);
person DAAlex    schedule 25.01.2016

Стоит отметить, что AddSectionPagesField() тоже существует. Таким образом, «Y» будет количеством страниц раздела, а не количеством страниц всего документа.

Он находит свое применение, когда вы создаете много разных документов для одной печати и хотите разделить подсчет страниц. Надеюсь понятно.

Итак, вы также можете использовать:

            Paragraph paragraph = new Paragraph();
            paragraph.AddText("Page");
            paragraph.AddPageField();
            paragraph.AddText(" of ");
            paragraph.AddSectionPagesField();

            // Add paragraph to header for odd pages.
            section.Headers.Primary.Add(paragraph);
            // Add clone of paragraph to header for odd pages. Cloning is necessary because an object must
            // not belong to more than one other object. If you forget cloning an exception is thrown.
            section.Headers.EvenPage.Add(paragraph.Clone());

Точно так же только для использования нижнего колонтитула:

            section.Footers.Primary.Add(paragraph);
            section.Footers.EvenPage.Add(paragraph.Clone());
person Kamil Z    schedule 15.06.2020

вот как это можно исправить

        Paragraph foot = sec.Footers.Primary.AddParagraph();
        foot.AddText("Page ");
        foot.AddPageField();
        foot.AddText(" of ");
        foot.AddNumPagesField();
person user3308595    schedule 07.12.2020