2013-06-24 58 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