1

ITextSharp を使用して PDF ドキュメントの下部にページ番号を追加しています。問題は、プロセスを通じて結合された 4 つまたは 5 つの異なる PDF で構成されており、動的に追加されたページがいくつかあるため、PDF のサイズが異なる場合があることです。「getアクセサーがない」ため、document.PageCountを呼び出すことができません。

現在のページを追跡するためにカウンターを作成しました。最終ページには「9/9 ページ」と表示されますが、残りは「7/7 ページ」としか表示されません。PdfReader を介してドキュメント全体を実行し、reader.NumberOfPages を呼び出して各ページを再実行し、最後の番号を下部に追加できると考えていましたが、iTextSharp.text.Document 型から作成する方法も方法もわかりません。後でそれについて行きます。

これは他の誰かによって開始されたプロジェクトであり、iTextSharp にほとんど触れたことがないため、クラスが大きすぎて作り直すことができません。

私に何ができるか知っている人はいますか?または、その 1 つの番号を iTextSharp.text.Document の各ページに追加するにはどうすればよいでしょうか?

4

1 に答える 1

0

みんな見つけた:D

したがって、ライターを作成するときはいつでも:

using (MemoryStream MS = new MemoryStream())
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, MS);
            writer.ViewerPreferences = PdfWriter.PageModeUseOutlines;
            PdfFooter eventHandler = new PdfFooter();
            writer.PageEvent = eventHandler;

ect.
}

PdfFooter の場合:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp.text.pdf;
using iTextSharp.text;

public class PdfFooter : PdfPageEventHelper
{
    // This is the contentbyte object of the writer
    PdfContentByte cb;

// we will put the final number of pages in a template
PdfTemplate template;

// this is the BaseFont we are going to use for the header / footer
BaseFont bf = null;

// This keeps track of the creation time
DateTime PrintTime = DateTime.Now;

#region Properties
private string _Title;
public string Title
{
    get { return _Title; }
    set { _Title = value; }
}

private string _HeaderLeft;
public string HeaderLeft
{
    get { return _HeaderLeft; }
    set { _HeaderLeft = value; }
}

private string _HeaderRight;
public string HeaderRight
{
    get { return _HeaderRight; }
    set { _HeaderRight = value; }
}

private Font _HeaderFont;
public Font HeaderFont
{
    get { return _HeaderFont; }
    set { _HeaderFont = value; }
}

private Font _FooterFont;
public Font FooterFont
{
    get { return _FooterFont; }
    set { _FooterFont = value; }
}
#endregion

// we override the onOpenDocument method
public override void OnOpenDocument(PdfWriter writer, Document document)
{
    try
    {
        PrintTime = DateTime.Now;
        bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        cb = writer.DirectContent;
        template = cb.CreateTemplate(50, 50);
    }
    catch (DocumentException de)
    {
    }
    catch (System.IO.IOException ioe)
    {
    }
}

public override void OnEndPage(PdfWriter writer, Document document)
{
    base.OnEndPage(writer, document);

    int pageN = writer.PageNumber;
    String text = "Page " + pageN + " of ";
    float len = bf.GetWidthPoint(text, 8);

    Rectangle pageSize = document.PageSize;

    cb.SetRGBColorFill(100, 100, 100);

    cb.BeginText();
    cb.SetFontAndSize(bf, 8);
    cb.SetTextMatrix(pageSize.GetRight(70), pageSize.GetBottom(15));
    cb.ShowText(text);
    cb.EndText();

    cb.AddTemplate(template, pageSize.GetRight(70) + len, pageSize.GetBottom(15));
}

public override void OnCloseDocument(PdfWriter writer, Document document)
{
    base.OnCloseDocument(writer, document);

    template.BeginText();
    template.SetFontAndSize(bf, 8);
    template.SetTextMatrix(0, 0);
    template.ShowText("" + (writer.PageNumber - 1));
    template.EndText();
}

}

これが将来誰かに役立つことを願っています:)

于 2012-06-12T16:10:41.527 に答える