31

看起来很简单,但我在 API 中找不到类似 getPageCount() 的东西。我可以让它返回当前页面,但不能返回总页数。也许我错过了它?

我希望能够以某种方式在每一页的顶部打印“第 1 页,共 9 页”,其中“1”当然是当前页码。

4

5 回答 5

34

确保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);
于 2015-06-18T20:09:32.330 回答
30

使用 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); 

两个片段均取自链接站点。示例代码也可供下载。

于 2013-10-21T15:55:10.833 回答
22

我知道这个问题很老,并且有一个公认的答案,但是在搜索 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);
于 2016-01-25T17:10:12.543 回答
0

值得注意的是,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());
于 2020-06-15T12:45:38.090 回答
-2

这是您可以解决的方法

        Paragraph foot = sec.Footers.Primary.AddParagraph();
        foot.AddText("Page ");
        foot.AddPageField();
        foot.AddText(" of ");
        foot.AddNumPagesField();
于 2020-12-07T03:13:45.130 回答