PDFsharp:有没有办法在页面标题中生成“页面 X of Y”
本文关键字:页面 of 标题 有没有 PDFsharp | 更新日期: 2023-09-27 18:36:20
这看起来很简单,但我在API中找不到getPageCount()之类的东西。 我可以让它返回当前页面,但不能返回总页数。也许我错过了它?
我希望能够以某种方式在每页的顶部打印"第 1 页,共 9 页",其中"1"当然是当前页码。
确保在类中包含 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);
有了 PDFsharp,就由你决定。
我假设您正在使用MigraDoc:使用MigraDoc,您可以添加页面标题。为当前页码添加paragraph.AddPageField()
,为总页数添加paragraph.AddNumPagesField()
。
使用添加页面字段的示例
示例中的代码片段:
// 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);
两个代码段都取自链接的网站。示例代码也可供下载。
这个问题很老,并且有一个公认的答案,但是在寻找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);
,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());
您可以修复它的方法
Paragraph foot = sec.Footers.Primary.AddParagraph();
foot.AddText("Page ");
foot.AddPageField();
foot.AddText(" of ");
foot.AddNumPagesField();