web-dev-qa-db-ja.com

PDFsharp:ページのヘッダーに「Page X of Y」を生成する方法はありますか?

かなりシンプルに見えますが、APIでgetPageCount()のようなものが見つかりません。現在のページを返すことはできますが、ページの総数は取得できません。おそらく私はそれを逃していますか?

どういうわけか、すべてのページの上部に「Page 1 of 9」を印刷できるようにしたいと思います。「1」はもちろん現在のページ番号です。

29
mkautzm

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 16 cmのボディを持つA 4と仮定):

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

リンクされたサイトから取得された両方のスニペット。サンプルコードもダウンロードできます。

28

クラスには必ず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);
30
Kidquick

私はこの質問が古く、受け入れられた答えがあることを知っていますが、PDFsharpソリューションを検索するときに最初に質問が出てきます。

実際、PDFsharpでこれを実現するのは簡単です。 _PdfSharp.Pdf_名前空間の下にあるPdfDocumentクラスには、ページのコレクション(_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);
_
13
DAAlex