2013-10-21 10 views
12

Es scheint ziemlich einfach, aber ich kann etwas wie getPageCount() in der API nicht finden. Ich kann es erhalten, um die aktuelle Seite, aber nicht die Gesamtzahl der Seiten zurückzugeben. Vielleicht vermisse ich es?PDFsharp: Gibt es eine Möglichkeit, "Seite X von Y" in der Kopfzeile der Seite zu generieren?

Ich möchte irgendwie "Seite 1 von 9" oben auf jeder Seite drucken können, wobei "1" natürlich die aktuelle Seitennummer ist.

+0

Könnten Sie bitte einen Code anzeigen? – sarseyn

Antwort

21

Mit PDFsharp liegt es an Ihnen.

Ich nehme an, dass Sie MigraDoc verwenden: Mit MigraDoc können Sie einen Seitenkopf hinzufügen. Fügen Sie paragraph.AddPageField() für die aktuelle Seitenzahl und paragraph.AddNumPagesField() für die Gesamtzahl der Seiten hinzu.

Sample that uses AddPageField

Code-Schnipsel aus der Probe:

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

Code-Schnipsel, die den Tabulator (vorausgesetzt, DIN A 4 mit einem Körper mit von 16 cm) setzt:

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

Beide Snippets stammen von der verlinkten Seite. Beispielcode ist auch zum Download verfügbar.

+0

Das auf dieser Seite gezeigte Beispiel funktioniert nicht gut. Ich meine, diese Seitennummer ändert sich nicht. –

+1

@Marek Bar: AddNumPagesField fügt die Anzahl der Seiten im Dokument hinzu (und ändert nicht zwischen den Seiten), AddPageField fügt die aktuelle Seitennummer hinzu und ändert sich von Seite zu Seite. –

+0

@PDFsharpTeam ... wenn ich die Seitennummer NUR anzeigen möchte, wenn die PDF mehr als eine Seite lang ist ... wie soll ich das machen? Jetzt, mein PDF-Display "Pag: 1", auch wenn ich eine Seite insgesamt habe. – Romias

16

Stellen Sie sicher, dass die Anweisung using MigraDoc.DocumentObjectModel; in Ihrer Klasse enthalten ist.

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); 
+1

Das hat mit mir einwandfrei funktioniert. – ddz

6

Ich weiß, diese Frage ist alt und hat eine akzeptierte Antwort, aber die Frage kommt unter den ersten, wenn für eine PDFsharp Lösung zu suchen.

Für die Aufzeichnung, das in PDFsharp zu erreichen, ist einfach. Die PdfDocument-Klasse, die unter dem PdfSharp.Pdf-Namespace gefunden wird, enthält eine Sammlung von Seiten (PdfDocument.Pages). Sie müssen lediglich die Auflistung durchlaufen und den Seitenzähler irgendwo auf jeder Seite hinzufügen, indem Sie ein XGraphics Objekt verwenden, das Sie unter Verwendung von XGraphics.FromPdfPage(PdfPage) instanziieren können.

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

Es ist erwähnenswert, dass, wenn ein XGraphics bereits das Objekt für eine bestimmte Seite vorhanden ist, bevor Sie einen neuen zu schaffen, die alte entsorgt werden muss. Dies würde fehlschlagen:

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

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