iT邦幫忙

1

ITEXTSHART PDF每一個頁尾顯示「第O頁,共O頁」

各位前輩好

目前要寫出一個PDF產出時,在頁尾可以顯示「第O頁,共O頁」,

現在有個問題,我目前的程式會變成如果假設我有第1~第10頁,只會顯示第1頁、第2頁…至第9頁,最後一頁才會變成「第10頁,共10頁」

程式如下,請問我哪裡寫錯了??或者沒寫好??如果資訊上有不足,再麻煩跟我說,我再補充,謝謝

public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
string chFontPath = XXXXX;
bf = XXXXXX;
cb = writer.DirectContent;
template = cb.CreateTemplate(50, 50);
int pageN = writer.PageNumber;
String text = "第" + pageN + "頁";
float len = bf.GetWidthPoint(text, 8);
Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(bf, 8);

        cb.SetTextMatrix(pageSize.GetLeft(280), pageSize.GetBottom(30));    //第x頁位置
        cb.ShowText(text);
        cb.EndText();
        cb.AddTemplate(template, pageSize.GetLeft(280) + len, pageSize.GetBottom(30));  //共x頁位置
        //OnCloseDocument(writer, document);  //test
    }

    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        string chFontPath = XXXXX;
        bf = XXXXXXX;
        template.BeginText();
        template.SetFontAndSize(bf, 8);
        template.SetTextMatrix(0, 0);
        template.ShowText(",共 " + writer.PageNumber + " 頁");
        template.EndText();

        base.OnCloseDocument(writer, document);
    }

2 個回答

0
ckp6250
iT邦好手 1 級 ‧ 2020-07-06 20:06:51

OnEndPage 和 OnCloseDocument 是否宜合併成一個函數?
程式一開頭,先計算好總頁數,然後當作參數傳進去。

 SetFooter(PdfWriter writer, Document document,All_pages){

int pageN = writer.PageNumber;
String text = "第" + pageN + "頁,共 " + All_pages + " 頁"";

}

klm2242 iT邦研究生 1 級 ‧ 2020-07-06 21:33:10 檢舉

謝謝你

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-07-06 20:50:51

OnEndPage 是每一頁的結尾
OnCloseDocument 是整份文件的結束

String text = "第" + pageN + "頁"; 寫在 OnEndPage
自然在「每一頁的結尾」都會出現「第 x 頁」

template.ShowText(",共 " + writer.PageNumber + " 頁"); 寫在 OnCloseDocument
才會在「最後一頁」多了個「,共 10 頁」

這都是小問題
最大的問題是 PdfWriter 只有 PageNumber(頁碼) 這個值
不像 PdfReader 有 NumberOfPages(總頁數) 可以用
原因是:在寫 pdf 的過程時,不會知道最後會寫幾頁

總之
要做出 Page 1 of 10 的效果
不是目前這樣就可以做到的

klm2242 iT邦研究生 1 級 ‧ 2020-07-06 21:32:59 檢舉

謝謝你....這樣看來....我不就要PdfWriter後再做PdfReader?

BMG50 iT邦新手 5 級 ‧ 2020-07-06 22:50:20 檢舉

可以自建一個新的class, 繼承PdfWriter後, 再在你自己的class加入你要的屬性。

謝謝你....這樣看來....我不就要PdfWriter後再做PdfReader?

有兩種做法,其中一種是
「先寫一次檔案以取得總頁數,第二次再寫真正要的檔案」
以下是網友提供兩種做法

我要發表回答

立即登入回答