0

我正在尝试使用 iTextSharp 制作 PDF 文档。

我不知道如何使用“currentPageNumber/documentsNumberOfPages”制作标题:

样本

后续问题

目前,根据原始答案,我有这个:

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”并且不显示包含“Header”和“Page {0} of”的第一个和第二个单元格......

我这样声明我的文件:

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

请帮我。谢谢 ;)

4

2 回答 2

0

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.

于 2013-06-24T13:54:33.077 回答
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;

wheredocumentImage是 type byte[],但你可以使用任何PdfReader's 重载。

于 2013-06-24T12:50:17.223 回答