Current number page and document's number page

好久不见. 提交于 2019-12-12 06:46:47

问题


I'm trying to make a PDF document with iTextSharp.

I don't know how to make a header with "currentPageNumber/documentsNumberOfPages" like that :

Follow-up question

For the moment, based on the original answers, I have this :

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);
    }
}

But, I don't understant why, it's just show the "templateNumPage" and doesn't show the first and second cells which contains "Header" and "Page {0} of"...

I declare my document like this :

// 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();

Please, help me. Thanks ;)


回答1:


I can't help you with the page header thing (also my computer's not showing the image for some reason...) but to get the page number in iTextSharp you can do:

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;

Where documentImage is of type byte[], but you could use any of PdfReader's overloads.




回答2:


The iText in Action — 2nd Edition example MovieCountries1.java / MovieCountries1.cs illustrates how to create a document with Page X/Y information.

The central construction brick is a PdfPageEventHelper adding header information:

/**
 * 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
    );
  }
}

It is employed like this:

// 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();
  [...]
}

Beware: The table written by the OnEndPage code above is formatted for a portrait A4 document. If you use a landscape document size, you have to adjust some of the values, namely the TotalWidth value 527 and the writing coordinates 34, 803 of table.WriteSelectedRows as otherwise your header may be partially off-page.

There is also an alternative. Cf. Keyword: Page numbers > page X of Y.



来源:https://stackoverflow.com/questions/17275761/current-number-page-and-documents-number-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!