我正在尝试使用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();
请帮帮我。谢谢;)
答案 0 :(得分: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
的任何重载。
答案 1 :(得分:0)
iText in Action — 2nd Edition示例MovieCountries1.java / MovieCountries1.cs说明了如何使用 Page 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
值527
和34, 803
的书写坐标table.WriteSelectedRows
,否则您的标题可能会部分离页。
还有另一种选择。参看Keyword: Page numbers > page X of Y