web-dev-qa-db-fra.com

PDFsharp: Existe-t-il un moyen de générer "Page X de Y" dans l'en-tête de la page?

Cela semble assez simple, mais je ne trouve pas quelque chose comme getPageCount () dans l'API. Je peux l'obtenir pour renvoyer la page actuelle, mais pas le nombre total de pages. Peut-être que ça me manque?

J'aimerais pouvoir d'une manière ou d'une autre imprimer la "Page 1 sur 9" en haut de chaque page, où "1" est bien sûr le numéro de page actuel.

29
mkautzm

Avec PDFsharp, c'est à vous.

Je suppose que vous utilisez MigraDoc: Avec MigraDoc, vous pouvez ajouter un en-tête de page. Ajoutez paragraph.AddPageField() pour le numéro de page actuel et paragraph.AddNumPagesField() pour le nombre total de pages.

exemple qui utilise AddPageField

Extrait de code de l'exemple:

// 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());

Extrait de code qui définit le taquet de tabulation (en supposant DIN A 4 ​​avec un corps de 16 cm):

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

Les deux extraits extraits du site lié. Un exemple de code est également disponible en téléchargement.

28
Vive la déraison

Assurez-vous d'inclure le using MigraDoc.DocumentObjectModel; déclaration dans votre classe.

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);
30
Kidquick

Je sais que cette question est ancienne et a une réponse acceptée, mais la question se pose parmi les premières lors de la recherche d'une solution PDFsharp.

Pour mémoire, il est facile d'y parvenir dans PDFsharp. La classe PdfDocument, située sous l'espace de noms PdfSharp.Pdf Contient une collection de pages (PdfDocument.Pages). Tout ce que vous avez à faire est de parcourir la collection et d'ajouter le compteur de pages quelque part sur chaque page, à l'aide d'un objet XGraphics, que vous pouvez instancier à l'aide de 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);
    }
}

Il convient de noter que si un objet XGraphics existe déjà pour une page donnée, avant d'en créer un nouveau, l'ancien doit être supprimé. Cela échouerait:

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

XGraphics gfx1 = XGraphics.FromPage(page);
XGraphics gfx2 = XGraphics.FromPage(page);
13
DAAlex