当前一些页面和文档的页面数 [英] Current number page and document's number page

查看:143
本文介绍了当前一些页面和文档的页面数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图与iTextSharp的PDF文档。

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

我不知道如何使currentPageNumber / documentsNumberOfPages这样一个标题:

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

后续问题

目前,在原有基础上的答案,我有这样的:

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

不过,我不understant为什么,它只是显示templateNumPage,并没有显示其中包含页眉,并在第一和第二单元页面{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();

请,帮助我。谢谢;)

推荐答案

借助的iText在行动 - 第二版例如 MovieCountries1.java /的 MovieCountries1.cs 说明如何创建的页X / Y 的信息的文档。

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

中央建筑砖是 PdfPageEventHelper 添加标题信息:

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

请注意:的由的OnEndPage code以上被格式化的肖像A4文档编写表。如果您使用的是横向文档的大小,你必须调整一些值,即 TotalWidth 527 和中写坐标 34,803 table.WriteSelectedRows 的,否则你的头可能会部分关闭页。

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.

有也是一种选择。参看关键词:页码>ÿ页面X

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

这篇关于当前一些页面和文档的页面数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆