2013-06-24 57 views
-1

我正在嘗試使用iTextSharp製作PDF文檔。當前編號頁面和文檔編號頁面

我不知道如何使 「currentPageNumber/documentsNumberOfPages」 像這樣的標題:

sample

後續問題

目前,在原有基礎上我有這個:

public class StockComp : iTextSharp.text.pdf.PdfPageEventHelper 
{ 
    PdfTemplate templateNumPage; 

    public string Header 
    { 
     get; 
     set; 
    } 

    public override void OnOpenDocument(PdfWriter writer, Document document) 
    { 
     templateNumPage = writer.DirectContent.CreateTemplate(30, 250); 
    } 

    public override void OnEndPage(PdfWriter writer, Document document) 
    { 
     PdfPTable table = new PdfPTable(3); 
     try 
     { 
      table.SetWidths(new int[] { 10, 10, 2 }); 
      table.TotalWidth = 800; 
      table.LockedWidth = true; 
      table.DefaultCell.FixedHeight = 20; 
      table.DefaultCell.Border = Rectangle.BOTTOM_BORDER; 
      table.AddCell(Header); 
      table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT; 
      table.AddCell(string.Format("Page {0} of", writer.PageNumber)); 
      PdfPCell cell = new PdfPCell(Image.GetInstance(templateNumPage)); 
      cell.Border = Rectangle.BOTTOM_BORDER; 
      table.AddCell(cell); 
      table.WriteSelectedRows(0, -1, 34, 803, writer.DirectContent); 
     } 
     catch (DocumentException de) 
     { 
      throw de; 
     } 
    } 

    public override void OnCloseDocument(PdfWriter writer, Document document) 
    { 
     ColumnText.ShowTextAligned(templateNumPage, Element.ALIGN_LEFT, new Phrase((writer.PageNumber - 1).ToString()), 2, 2, 0); 
    } 
} 

但是,我不明白爲什麼,這只是顯示「templateNumPage」並沒有顯示其中包含「頁眉」和第一,第二單元「頁面{0}的」 ......

我宣佈我的文件是這樣的:

// On récupère le n ombre de lignes et de colonne de la GridView 
     int noOfColumns = gvReportingStockComp.Columns.Count; 
     int noOfRows = gvReportingStockComp.Rows.Count; 

     // On fixe les informations concernant les tailles de police du document PDF 
     float HeaderTextSize = 8; 
     float ReportNameSize = 10; 
     float ReportTextSize = 8; 
     float ApplicationNameSize = 7; 

     // --- On crée le document final --- \\ 
     Document document = null; 
     // Le document final sera-t-il en mode paysage ou non 
     bool LandScape = true; 
     if (LandScape == true) 
     { 
      // Comme le document est en mode paysage, on execute une rotation sur ces dimensions 
      // Les 4 derniers paramètres de la fonction correspondent aux marges du document sur les bords 
      document = new Document(PageSize.A4.Rotate(), -50, -50, 50, 30); 
     } 
     else 
     { 
      // On spécifie les dimensions du document 
      // Les 4 derniers paramètres de la fonction correspondent aux marges du document sur les bords 
      document = new Document(PageSize.A4, 0, 0, 0, 0); 
     } 

     // --- On instancie le Writer et la classe d'evenement associée --- \\ 
     // Le flux de sortie 
     PdfWriter pdfW = PdfWriter.GetInstance(document, Response.OutputStream); 
     // La classe évenement associée 
     StockComp evenement = new StockComp(); 
     pdfW.PageEvent = evenement; 

     // --- Ouverture du document --- \\ 
     document.Open(); 

     // --- On ajoute les valeurs dans le document --- \\ 

     // On créer un PdfTable qui contient le même nombre de colonne que la GridView 
     // On ajoute 3 car l'on souahite que la cellule composant ait une taille de 4 
     // et le autre cellule une taille de 1. 
     PdfPTable mainTable = new PdfPTable(noOfColumns+3); 

     // Notre document sera composé de au minimum 4 lignes : 
     // 1 : Nom appli + Date 
     // 2 : Titre du tableau 
     // 3 : Saut de ligne 
     // 4 : Headers du tableau 
     // X : Lignes du tableau 
     mainTable.HeaderRows = 4; 

     evenement.Header = "Trèves"; 

     // On génère les noms de colonnes et on les insèrent 
     for (int i = 0; i < noOfColumns; i++) 
     { 
      PdfPCell cell = null; 

      Phrase ph = null; 

      ph = new Phrase(gvReportingStockComp.Columns[i].HeaderText, FontFactory.GetFont("Tahoma", HeaderTextSize, iTextSharp.text.Font.BOLD)); 

      cell = new PdfPCell(ph); 

      cell.HorizontalAlignment = Element.ALIGN_CENTER; 

      if (i == 1) 
      { 
       cell.Colspan = 4; 
      } 

      mainTable.AddCell(cell); 
     } 

document.Add(mainTable); 

//pdfW.PageNumber*/ 
document.Close(); 

請, 幫我。感謝;)

+0

http://bit.ly/18aEkqL – Smartis

+0

[Y問題的頁面X]可能重複(http://stackoverflow.com/questions/9845367/page-x-of-y-issue) –

+0

Smartis,它是不好笑... 謝謝布魯諾,我會讀它。 – user2265252

回答

0

我不能幫你的頁頭的事情(也是我的電腦沒有顯示圖像出於某種原因...),但得到的iTextSharp的頁碼,你可以這樣做:

iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(documentImage); 
// may want to check if pdfReader is null before doing below 
int numPages = pdfReader.NumberOfPages; 

其中documentImage類型爲byte[],但您可以使用任何PdfReader的重載。

0

iText in Action — 2nd Edition示例MovieCountries1.java/MovieCountries1.cs說明如何創建一個文件與頁X/Y信息。

中央結構磚是PdfPageEventHelper添加報頭信息:

/** 
* Inner class to add a table as header. 
*/ 
protected class TableHeader : PdfPageEventHelper { 
    /** The template with the total number of pages. */ 
    PdfTemplate total; 

    /** The header text. */ 
    public string Header { get; set; } 

    /** 
    * Creates the PdfTemplate that will hold the total number of pages. 
    */ 
    public override void OnOpenDocument(PdfWriter writer, Document document) { 
    total = writer.DirectContent.CreateTemplate(30, 16); 
    } 

    /** 
    * Adds a header to every page 
    */ 
    public override void OnEndPage(PdfWriter writer, Document document) { 
    PdfPTable table = new PdfPTable(3); 
    try { 
     table.SetWidths(new int[]{24, 24, 2}); 
     table.TotalWidth = 527; 
     table.LockedWidth = true; 
     table.DefaultCell.FixedHeight = 20; 
     table.DefaultCell.Border = Rectangle.BOTTOM_BORDER; 
     table.AddCell(Header); 
     table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT; 
     table.AddCell(string.Format("Page {0} of", writer.PageNumber)); 
     PdfPCell cell = new PdfPCell(Image.GetInstance(total)); 
     cell.Border = Rectangle.BOTTOM_BORDER; 
     table.AddCell(cell); 
     table.WriteSelectedRows(0, -1, 34, 803, writer.DirectContent); 
    } 
    catch(DocumentException de) { 
     // ... 
     throw de; 
    } 
    } 

    /** 
    * Fills out the total number of pages before the document is closed. 
    */ 
    public override void OnCloseDocument(PdfWriter writer, Document document) { 
    ColumnText.ShowTextAligned(
     total, Element.ALIGN_LEFT, 
// NewPage() already called when closing the document; subtract 1 
     new Phrase((writer.PageNumber - 1).ToString()), 
     2, 2, 0 
    ); 
    } 
} 

它採用這樣的:

// step 1 
using (Document document = new Document(PageSize.A4, 36, 36, 54, 36)) { 
    // step 2 
    PdfWriter writer = PdfWriter.GetInstance(document, stream); 
    TableHeader tevent = new TableHeader(); 
    writer.PageEvent = tevent; 
    // step 3 
    document.Open(); 
    [...] 
} 

當心:OnEndPage代碼寫入上面的表格的格式爲一幅肖像A4文檔。如果您使用橫向文檔大小,則必須調整一些值,即TotalWidth的值52734, 80334, 803的寫作座標,否則您的頁眉可能部分爲頁外。

還有一個選擇。參看Keyword: Page numbers > page X of Y

+0

謝謝,我編輯我的文章,因爲我有其他問題:/ – user2265252

+0

編輯這樣的問題是非常糟糕的風格。現在沒有任何評論和答案似乎適合了。無論何時您有其他問題,請創建一個新問題。或者至少,如果問題連接起來,請保留原始問題文本並添加另一個標題爲例如下面是「後續問題」。 – mkl

+0

但是,關於你的問題,我在關於表格寬度和位置硬編碼到樣本中的回答中增加了一個警告;如果您使用的是不同的文檔格式,則還必須調整這些硬編碼的值。您的代碼目前使用A4風景。因此,您很可能丟失的單元格位於頁面邊界之上。此外,您使用負邊距。我懷疑你長期以來會對他們感到滿意。 – mkl