Add Header and Footer for PDF using iTextsharp - c#

How can I add header and footer for each page in the pdf.
Headed will contain just a text
Footer will contain a text and pagination for pdf (Page : 1 of 4)
How is this possible ? I tried to add the below line, but header does not show up in pdf.
document.AddHeader("Header", "Header Text");
This the code I am using for generation PDF :
protected void GeneratePDF_Click(object sender, EventArgs e)
{
DataTable dt = getData();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Locations.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Document document = new Document();
PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.COURIER , 8);
PdfPTable table = new PdfPTable(dt.Columns.Count);
PdfPRow row = null;
float[] widths = new float[] { 6f, 6f, 2f, 4f, 2f };
table.SetWidths(widths);
table.WidthPercentage = 100;
int iCol = 0;
string colname = "";
PdfPCell cell = new PdfPCell(new Phrase("Locations"));
cell.Colspan = dt.Columns.Count;
foreach (DataColumn c in dt.Columns)
{
table.AddCell(new Phrase(c.ColumnName, font5));
}
foreach (DataRow r in dt.Rows)
{
if (dt.Rows.Count > 0)
{
table.AddCell(new Phrase(r[0].ToString(), font5));
table.AddCell(new Phrase(r[1].ToString(), font5));
table.AddCell(new Phrase(r[2].ToString(), font5));
table.AddCell(new Phrase(r[3].ToString(), font5));
table.AddCell(new Phrase(r[4].ToString(), font5));
}
}
document.Add(table);
document.Close();
Response.Write(document);
Response.End();
}
}

As already answered by #Bruno you need to use pageEvents.
Please check out the sample code below:
private void CreatePDF()
{
string fileName = string.Empty;
DateTime fileCreationDatetime = DateTime.Now;
fileName = string.Format("{0}.pdf", fileCreationDatetime.ToString(#"yyyyMMdd") + "_" + fileCreationDatetime.ToString(#"HHmmss"));
string pdfPath = Server.MapPath(#"~\PDFs\") + fileName;
using (FileStream msReport = new FileStream(pdfPath, FileMode.Create))
{
//step 1
using (Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 140f, 10f))
{
try
{
// step 2
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, msReport);
pdfWriter.PageEvent = new Common.ITextEvents();
//open the stream
pdfDoc.Open();
for (int i = 0; i < 10; i++)
{
Paragraph para = new Paragraph("Hello world. Checking Header Footer", new Font(Font.FontFamily.HELVETICA, 22));
para.Alignment = Element.ALIGN_CENTER;
pdfDoc.Add(para);
pdfDoc.NewPage();
}
pdfDoc.Close();
}
catch (Exception ex)
{
//handle exception
}
finally
{
}
}
}
}
And create one class file named ITextEvents.cs and add following code:
public class ITextEvents : PdfPageEventHelper
{
// This is the contentbyte object of the writer
PdfContentByte cb;
// we will put the final number of pages in a template
PdfTemplate headerTemplate, footerTemplate;
// this is the BaseFont we are going to use for the header / footer
BaseFont bf = null;
// This keeps track of the creation time
DateTime PrintTime = DateTime.Now;
#region Fields
private string _header;
#endregion
#region Properties
public string Header
{
get { return _header; }
set { _header = value; }
}
#endregion
public override void OnOpenDocument(PdfWriter writer, Document document)
{
try
{
PrintTime = DateTime.Now;
bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb = writer.DirectContent;
headerTemplate = cb.CreateTemplate(100, 100);
footerTemplate = cb.CreateTemplate(50, 50);
}
catch (DocumentException de)
{
}
catch (System.IO.IOException ioe)
{
}
}
public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
{
base.OnEndPage(writer, document);
iTextSharp.text.Font baseFontNormal = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLACK);
iTextSharp.text.Font baseFontBig = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12f, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK);
Phrase p1Header = new Phrase("Sample Header Here", baseFontNormal);
//Create PdfTable object
PdfPTable pdfTab = new PdfPTable(3);
//We will have to create separate cells to include image logo and 2 separate strings
//Row 1
PdfPCell pdfCell1 = new PdfPCell();
PdfPCell pdfCell2 = new PdfPCell(p1Header);
PdfPCell pdfCell3 = new PdfPCell();
String text = "Page " + writer.PageNumber + " of ";
//Add paging to header
{
cb.BeginText();
cb.SetFontAndSize(bf, 12);
cb.SetTextMatrix(document.PageSize.GetRight(200), document.PageSize.GetTop(45));
cb.ShowText(text);
cb.EndText();
float len = bf.GetWidthPoint(text, 12);
//Adds "12" in Page 1 of 12
cb.AddTemplate(headerTemplate, document.PageSize.GetRight(200) + len, document.PageSize.GetTop(45));
}
//Add paging to footer
{
cb.BeginText();
cb.SetFontAndSize(bf, 12);
cb.SetTextMatrix(document.PageSize.GetRight(180), document.PageSize.GetBottom(30));
cb.ShowText(text);
cb.EndText();
float len = bf.GetWidthPoint(text, 12);
cb.AddTemplate(footerTemplate, document.PageSize.GetRight(180) + len, document.PageSize.GetBottom(30));
}
//Row 2
PdfPCell pdfCell4 = new PdfPCell(new Phrase("Sub Header Description", baseFontNormal));
//Row 3
PdfPCell pdfCell5 = new PdfPCell(new Phrase("Date:" + PrintTime.ToShortDateString(), baseFontBig));
PdfPCell pdfCell6 = new PdfPCell();
PdfPCell pdfCell7 = new PdfPCell(new Phrase("TIME:" + string.Format("{0:t}", DateTime.Now), baseFontBig));
//set the alignment of all three cells and set border to 0
pdfCell1.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell2.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell3.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell4.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell5.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell6.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell7.HorizontalAlignment = Element.ALIGN_CENTER;
pdfCell2.VerticalAlignment = Element.ALIGN_BOTTOM;
pdfCell3.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfCell4.VerticalAlignment = Element.ALIGN_TOP;
pdfCell5.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfCell6.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfCell7.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfCell4.Colspan = 3;
pdfCell1.Border = 0;
pdfCell2.Border = 0;
pdfCell3.Border = 0;
pdfCell4.Border = 0;
pdfCell5.Border = 0;
pdfCell6.Border = 0;
pdfCell7.Border = 0;
//add all three cells into PdfTable
pdfTab.AddCell(pdfCell1);
pdfTab.AddCell(pdfCell2);
pdfTab.AddCell(pdfCell3);
pdfTab.AddCell(pdfCell4);
pdfTab.AddCell(pdfCell5);
pdfTab.AddCell(pdfCell6);
pdfTab.AddCell(pdfCell7);
pdfTab.TotalWidth = document.PageSize.Width - 80f;
pdfTab.WidthPercentage = 70;
//pdfTab.HorizontalAlignment = Element.ALIGN_CENTER;
//call WriteSelectedRows of PdfTable. This writes rows from PdfWriter in PdfTable
//first param is start row. -1 indicates there is no end row and all the rows to be included to write
//Third and fourth param is x and y position to start writing
pdfTab.WriteSelectedRows(0, -1, 40, document.PageSize.Height - 30, writer.DirectContent);
//set pdfContent value
//Move the pointer and draw line to separate header section from rest of page
cb.MoveTo(40, document.PageSize.Height - 100);
cb.LineTo(document.PageSize.Width - 40, document.PageSize.Height - 100);
cb.Stroke();
//Move the pointer and draw line to separate footer section from rest of page
cb.MoveTo(40, document.PageSize.GetBottom(50) );
cb.LineTo(document.PageSize.Width - 40, document.PageSize.GetBottom(50));
cb.Stroke();
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
headerTemplate.BeginText();
headerTemplate.SetFontAndSize(bf, 12);
headerTemplate.SetTextMatrix(0, 0);
headerTemplate.ShowText((writer.PageNumber - 1).ToString());
headerTemplate.EndText();
footerTemplate.BeginText();
footerTemplate.SetFontAndSize(bf, 12);
footerTemplate.SetTextMatrix(0, 0);
footerTemplate.ShowText((writer.PageNumber - 1).ToString());
footerTemplate.EndText();
}
}
I hope it helps!

For iTextSharp 4.1.6, the last version of iTextSharp that was licensed as LGPL, the solution provided by Alvaro Patiño is both simple and effective.
Because documentation is somewhat scarse I'd like to extend his answer with this code snippet that can be used to change the appearance of the header and footer. By default they have a rather large font-size and a thick border, which many people will want to change.
// Parameters passed on to the function that creates the PDF
String headerText = "Your header text";
String footerText = "Page";
// Define a font and font-size in points (plus f for float) and pick a color
// This one is for both header and footer but you can also create seperate ones
Font fontHeaderFooter = FontFactory.GetFont("arial", 8f);
fontHeaderFooter.Color = Color.GRAY;
// Apply the font to the headerText and create a Phrase with the result
Chunk chkHeader = new Chunk(headerText, fontHeaderFooter);
Phrase p1 = new Phrase(chkHeader);
// create a HeaderFooter element for the header using the Phrase
// The boolean turns numbering on or off
HeaderFooter header = new HeaderFooter(p1, false);
// Remove the border that is set by default
header.Border = Rectangle.NO_BORDER;
// Align the text: 0 is left, 1 center and 2 right.
header.Alignment = 1;
// add the header to the document
document.Header = header;
// The footer is created in an similar way
// If you want to use numbering like in this example, add a whitespace to the
// text because by default there's no space in between them
if (footerText.Substring(footerText.Length - 1) != " ") footerText += " ";
Chunk chkFooter = new Chunk(footerText, fontHeaderFooter);
Phrase p2 = new Phrase(chkFooter);
// Turn on numbering by setting the boolean to true
HeaderFooter footer = new HeaderFooter(p2, true);
footer.Border = Rectangle.NO_BORDER;
footer.Alignment = 1;
document.Footer = footer;
// Open the Document for writing and continue creating its content
document.Open();
For more info check Creating PDFs with iTextSharp and iTextSharp - Adding Text with Chunks, Phrases and Paragraphs. The source code on GitHub may also be useful.

We don't talk about iTextSharp anymore. You are using iText 5 for .NET. The current version is iText 7 for .NET.
Obsolete answer:
The AddHeader has been deprecated a long time ago and has been removed from iTextSharp. Adding headers and footers is now done using page events. The examples are in Java, but you can find the C# port of the examples here and here (scroll to the bottom of the page for links to the .cs files).
Make sure you read the documentation. A common mistake by many developers have made before you, is adding content in the OnStartPage. You should only add content in the OnEndPage. It's also obvious that you need to add the content at absolute coordinates (for instance using ColumnText) and that you need to reserve sufficient space for the header and footer by defining the margins of your document correctly.
Updated answer:
If you are new to iText, you should use iText 7 and use event handlers to add headers and footers. See chapter 3 of the iText 7 Jump-Start Tutorial for .NET.
When you have a PdfDocument in iText 7, you can add an event handler:
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler());
This is an example of the hard way to add text at an absolute position (using PdfCanvas):
protected internal class MyEventHandler : IEventHandler {
public virtual void HandleEvent(Event #event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent)#event;
PdfDocument pdfDoc = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
int pageNumber = pdfDoc.GetPageNumber(page);
Rectangle pageSize = page.GetPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
//Add header
pdfCanvas.BeginText()
.SetFontAndSize(C03E03_UFO.helvetica, 9)
.MoveText(pageSize.GetWidth() / 2 - 60, pageSize.GetTop() - 20)
.ShowText("THE TRUTH IS OUT THERE")
.MoveText(60, -pageSize.GetTop() + 30)
.ShowText(pageNumber.ToString())
.EndText();
pdfCanvas.Release();
}
}
This is a slightly higher-level way, using Canvas:
protected internal class MyEventHandler : IEventHandler {
public virtual void HandleEvent(Event #event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent)#event;
PdfDocument pdfDoc = docEvent.GetDocument();
PdfPage page = docEvent.GetPage();
int pageNumber = pdfDoc.GetPageNumber(page);
Rectangle pageSize = page.GetPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
//Add watermark
Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize());
canvas.setFontColor(Color.WHITE);
canvas.setProperty(Property.FONT_SIZE, 60);
canvas.setProperty(Property.FONT, helveticaBold);
canvas.showTextAligned(new Paragraph("CONFIDENTIAL"),
298, 421, pdfDoc.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
pdfCanvas.Release();
}
}
There are other ways to add content at absolute positions. They are described in the different iText books.

The answers to this question, while they are correct, are very unnecessarily complicated. It doesn't take that much code for text to show up in the header/footer. Here is a simple example of adding text to the header/footer.
The current version of iTextSharp works by implementing a callback class which is defined by the IPdfPageEvent interface. From what I understand, it's not a good idea to add things during the OnStartPage method, so instead I will be using the OnEndPage page method. The events are triggered depending on what is happening to the PdfWriter
First, create a class which implements IPdfPageEvent. In the:
public void OnEndPage(PdfWriter writer, Document document)
function, obtain the PdfContentByte object by calling
PdfContentByte cb = writer.DirectContent;
Now you can add text very easily:
ColumnText ct = new ColumnText(cb);
cb.BeginText();
cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f);
//Note, (0,0) in this case is at the bottom of the document
cb.SetTextMatrix(document.LeftMargin, document.BottomMargin);
cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this"));
cb.EndText();
So the full for the OnEndPage function will be:
public void OnEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.DirectContent;
ColumnText ct = new ColumnText(cb);
cb.BeginText();
cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12.0f);
cb.SetTextMatrix(document.LeftMargin, document.BottomMargin);
cb.ShowText(String.Format("{0} {1}", "Testing Text", "Like this"));
cb.EndText();
}
This will show up at the bottom of your document. One last thing. Don't forget to assign the IPdfPageEvent like this:
writter.PageEvent = new PDFEvents();
To the PdfWriter writter object
For the header it is very similar. Just flip the SetTextMatrix y coordinate:
cb.SetTextMatrix(document.LeftMargin, document.PageSize.Height - document.TopMargin);

Just add this line before opening the document (must be before):
document.Header = new HeaderFooter(new Phrase("Header Text"), false);
document.Open();

For those just needing headers!!!
All of these answers are way too complicated if you are designing your page via PdfPTables (which is the easiest way IMO)! If you are working with PdfPTables you can literally just define your first x number of table rows as header rows. They will then repeat on every page.
No need to invoke bulky page events.
1 line of code:
myPdfPTable.HeaderRows = myHeaderRowsAmount

Easy codes that work successfully:
protected void Page_Load(object sender, EventArgs e)
{
.
.
using (MemoryStream ms = new MemoryStream())
{
.
.
iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 36, 36, 54, 54);
iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms);
writer.PageEvent = new HeaderFooter();
doc.Open();
.
.
// make your document content..
.
.
doc.Close();
writer.Close();
// output
Response.ContentType = "application/pdf;";
Response.AddHeader("Content-Disposition", "attachment; filename=clientfilename.pdf");
byte[] pdf = ms.ToArray();
Response.OutputStream.Write(pdf, 0, pdf.Length);
}
.
.
.
}
class HeaderFooter : PdfPageEventHelper
{
public override void OnEndPage(PdfWriter writer, Document document)
{
// Make your table header using PdfPTable and name that tblHeader
.
.
tblHeader.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, page.Top, writer.DirectContent);
.
.
// Make your table footer using PdfPTable and name that tblFooter
.
.
tblFooter.WriteSelectedRows(0, -1, page.Left + document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using DataLayer;
namespace DataMngt.MyCode
{
public class HeaderFooter : PdfPageEventHelper
{
#region Startup_Stuff
private string[] _headerLines;
private string _footerLine;
private DefineFont _boldFont;
private DefineFont _normalFont;
private iTextSharp.text.Font fontTxtBold;
private iTextSharp.text.Font fontTxtRegular;
private int _fontPointSize = 0;
private bool hasFooter = false;
private bool hasHeader = false;
private int _headerWidth = 0;
private int _headerHeight = 0;
private int _footerWidth = 0;
private int _footerHeight = 0;
private int _leftMargin = 0;
private int _rightMargin = 0;
private int _topMargin = 0;
private int _bottomMargin = 0;
private PageNumbers NumberSettings;
private DateTime runTime = DateTime.Now;
public enum PageNumbers
{
None,
HeaderPlacement,
FooterPlacement
}
// This is the contentbyte object of the writer
PdfContentByte cb;
PdfTemplate headerTemplate;
PdfTemplate footerTemplate;
public string[] headerLines
{
get
{
return _headerLines;
}
set
{
_headerLines = value;
hasHeader = true;
}
}
public string footerLine
{
get
{
return _footerLine;
}
set
{
_footerLine = value;
hasFooter = true;
}
}
public DefineFont boldFont
{
get
{
return _boldFont;
}
set
{
_boldFont = value;
}
}
public DefineFont normalFont
{
get
{
return _normalFont;
}
set
{
_normalFont = value;
}
}
public int fontPointSize
{
get
{
return _fontPointSize;
}
set
{
_fontPointSize = value;
}
}
public int leftMargin
{
get
{
return _leftMargin;
}
set
{
_leftMargin = value;
}
}
public int rightMargin
{
get
{
return _rightMargin;
}
set
{
_rightMargin = value;
}
}
public int topMargin
{
get
{
return _topMargin;
}
set
{
_topMargin = value;
}
}
public int bottomMargin
{
get
{
return _bottomMargin;
}
set
{
_bottomMargin = value;
}
}
public int headerheight
{
get
{
return _headerHeight;
}
}
public int footerHeight
{
get
{
return _footerHeight;
}
}
public PageNumbers PageNumberSettings
{
get
{
return NumberSettings;
}
set
{
NumberSettings = value;
}
}
#endregion
#region Write_Headers_Footers
public override void OnEndPage(PdfWriter writer, Document document)
{
if (hasHeader)
{
// left side is the string array passed in
// right side is a built in string array (0 = date, 1 = time, 2(optional) = page)
float[] widths = new float[2] { 90f, 10f };
PdfPTable hdrTable = new PdfPTable(2);
hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin);
hdrTable.WidthPercentage = 95;
hdrTable.SetWidths(widths);
hdrTable.LockedWidth = true;
for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx ++)
{
string leftLine = (hdrIdx < _headerLines.Length ? _headerLines[hdrIdx] : string.Empty);
Paragraph leftPara = new Paragraph(5, leftLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
switch (hdrIdx)
{
case 0:
{
leftPara.Font.Size = _fontPointSize;
PdfPCell leftCell = new PdfPCell(leftPara);
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
leftCell.Border = 0;
string rightLine = string.Format(SalesPlanResources.datePara, runTime.ToString(SalesPlanResources.datePrintMask));
Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
rightPara.Font.Size = _fontPointSize;
PdfPCell rightCell = new PdfPCell(rightPara);
rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
rightCell.Border = 0;
hdrTable.AddCell(leftCell);
hdrTable.AddCell(rightCell);
break;
}
case 1:
{
leftPara.Font.Size = _fontPointSize;
PdfPCell leftCell = new PdfPCell(leftPara);
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
leftCell.Border = 0;
string rightLine = string.Format(SalesPlanResources.timePara, runTime.ToString(SalesPlanResources.timePrintMask));
Paragraph rightPara = new Paragraph(5, rightLine, (hdrIdx == 0 ? fontTxtBold : fontTxtRegular));
rightPara.Font.Size = _fontPointSize;
PdfPCell rightCell = new PdfPCell(rightPara);
rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
rightCell.Border = 0;
hdrTable.AddCell(leftCell);
hdrTable.AddCell(rightCell);
break;
}
case 2:
{
leftPara.Font.Size = _fontPointSize;
PdfPCell leftCell = new PdfPCell(leftPara);
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
leftCell.Border = 0;
string rightLine;
if (NumberSettings == PageNumbers.HeaderPlacement)
{
rightLine = string.Concat(SalesPlanResources.pagePara, writer.PageNumber.ToString());
}
else
{
rightLine = string.Empty;
}
Paragraph rightPara = new Paragraph(5, rightLine, fontTxtRegular);
rightPara.Font.Size = _fontPointSize;
PdfPCell rightCell = new PdfPCell(rightPara);
rightCell.HorizontalAlignment = Element.ALIGN_LEFT;
rightCell.Border = 0;
hdrTable.AddCell(leftCell);
hdrTable.AddCell(rightCell);
break;
}
default:
{
leftPara.Font.Size = _fontPointSize;
PdfPCell leftCell = new PdfPCell(leftPara);
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
leftCell.Border = 0;
leftCell.Colspan = 2;
hdrTable.AddCell(leftCell);
break;
}
}
}
hdrTable.WriteSelectedRows(0, -1, _leftMargin, document.PageSize.Height - _topMargin, writer.DirectContent);
//Move the pointer and draw line to separate header section from rest of page
cb.MoveTo(_leftMargin, document.Top + 10);
cb.LineTo(document.PageSize.Width - _leftMargin, document.Top + 10);
cb.Stroke();
}
if (hasFooter)
{
// footer line is the width of the page so it is centered horizontally
PdfPTable ftrTable = new PdfPTable(1);
float[] widths = new float[1] {100 };
ftrTable.TotalWidth = document.PageSize.Width - 10;
ftrTable.WidthPercentage = 95;
ftrTable.SetWidths(widths);
string OneLine;
if (NumberSettings == PageNumbers.FooterPlacement)
{
OneLine = string.Concat(_footerLine, writer.PageNumber.ToString());
}
else
{
OneLine = _footerLine;
}
Paragraph onePara = new Paragraph(0, OneLine, fontTxtRegular);
onePara.Font.Size = _fontPointSize;
PdfPCell oneCell = new PdfPCell(onePara);
oneCell.HorizontalAlignment = Element.ALIGN_CENTER;
oneCell.Border = 0;
ftrTable.AddCell(oneCell);
ftrTable.WriteSelectedRows(0, -1, _leftMargin, (_footerHeight), writer.DirectContent);
//Move the pointer and draw line to separate footer section from rest of page
cb.MoveTo(_leftMargin, document.PageSize.GetBottom(_footerHeight + 2));
cb.LineTo(document.PageSize.Width - _leftMargin, document.PageSize.GetBottom(_footerHeight + 2));
cb.Stroke();
}
}
#endregion
#region Setup_Headers_Footers_Happens_here
public override void OnOpenDocument(PdfWriter writer, Document document)
{
// create the fonts that are to be used
// first the hightlight or Bold font
fontTxtBold = FontFactory.GetFont(_boldFont.fontFamily, _boldFont.fontSize, _boldFont.foreColor);
if (_boldFont.isBold)
{
fontTxtBold.SetStyle(Font.BOLD);
}
if (_boldFont.isItalic)
{
fontTxtBold.SetStyle(Font.ITALIC);
}
if (_boldFont.isUnderlined)
{
fontTxtBold.SetStyle(Font.UNDERLINE);
}
// next the normal font
fontTxtRegular = FontFactory.GetFont(_normalFont.fontFamily, _normalFont.fontSize, _normalFont.foreColor);
if (_normalFont.isBold)
{
fontTxtRegular.SetStyle(Font.BOLD);
}
if (_normalFont.isItalic)
{
fontTxtRegular.SetStyle(Font.ITALIC);
}
if (_normalFont.isUnderlined)
{
fontTxtRegular.SetStyle(Font.UNDERLINE);
}
// now build the header and footer templates
try
{
float pageHeight = document.PageSize.Height;
float pageWidth = document.PageSize.Width;
_headerWidth = (int)pageWidth - ((int)_rightMargin + (int)_leftMargin);
_footerWidth = _headerWidth;
if (hasHeader)
{
// i basically dummy build the headers so i can trial fit them and see how much space they take.
float[] widths = new float[1] { 90f };
PdfPTable hdrTable = new PdfPTable(1);
hdrTable.TotalWidth = document.PageSize.Width - (_leftMargin + _rightMargin);
hdrTable.WidthPercentage = 95;
hdrTable.SetWidths(widths);
hdrTable.LockedWidth = true;
_headerHeight = 0;
for (int hdrIdx = 0; hdrIdx < (_headerLines.Length < 2 ? 2 : _headerLines.Length); hdrIdx++)
{
Paragraph hdrPara = new Paragraph(5, hdrIdx > _headerLines.Length - 1 ? string.Empty : _headerLines[hdrIdx], (hdrIdx > 0 ? fontTxtRegular : fontTxtBold));
PdfPCell hdrCell = new PdfPCell(hdrPara);
hdrCell.HorizontalAlignment = Element.ALIGN_LEFT;
hdrCell.Border = 0;
hdrTable.AddCell(hdrCell);
_headerHeight = _headerHeight + (int)hdrTable.GetRowHeight(hdrIdx);
}
// iTextSharp underestimates the size of each line so fudge it a little
// this gives me 3 extra lines to play with on the spacing
_headerHeight = _headerHeight + (_fontPointSize * 3);
}
if (hasFooter)
{
_footerHeight = (_fontPointSize * 2);
}
document.SetMargins(_leftMargin, _rightMargin, (_topMargin + _headerHeight), _footerHeight);
cb = writer.DirectContent;
if (hasHeader)
{
headerTemplate = cb.CreateTemplate(_headerWidth, _headerHeight);
}
if (hasFooter)
{
footerTemplate = cb.CreateTemplate(_footerWidth, _footerHeight);
}
}
catch (DocumentException de)
{
}
catch (System.IO.IOException ioe)
{
}
}
#endregion
#region Cleanup_Doc_Processing
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
if (hasHeader)
{
headerTemplate.BeginText();
headerTemplate.SetTextMatrix(0, 0);
if (NumberSettings == PageNumbers.HeaderPlacement)
{
}
headerTemplate.EndText();
}
if (hasFooter)
{
footerTemplate.BeginText();
footerTemplate.SetTextMatrix(0, 0);
if (NumberSettings == PageNumbers.FooterPlacement)
{
}
footerTemplate.EndText();
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace DataMngt.MyCode
{
// used to define the fonts passed into the header and footer class
public struct DefineFont
{
public string fontFamily { get; set; }
public int fontSize { get; set; }
public bool isBold { get; set; }
public bool isItalic { get; set; }
public bool isUnderlined { get; set; }
public BaseColor foreColor { get; set; }
}
}
To Use:
Document pdfDoc = new Document(PageSize.LEGAL.Rotate(), 10, 10, 25, 25);
System.IO.MemoryStream mStream = new System.IO.MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, mStream);
MyCode.HeaderFooter headers = new MyCode.HeaderFooter();
writer.PageEvent = headers;
..
..
Build the string array for the headers
...
DefineFont passFont = new DefineFont();
// always set this to the largest font used
headers.fontPointSize = 8;
// set up the highlight or bold font
passFont.fontFamily = "Helvetica";
passFont.fontSize = 8;
passFont.isBold = true;
passFont.isItalic = false;
passFont.isUnderlined = false;
passFont.foreColor = BaseColor.BLACK;
headers.boldFont = passFont;
// now setup the normal text font
passFont.fontSize = 7;
passFont.isBold = false;
headers.normalFont = passFont;
headers.leftMargin = 10;
headers.bottomMargin = 25;
headers.rightMargin = 10;
headers.topMargin = 25;
headers.PageNumberSettings = HeaderFooter.PageNumbers.FooterPlacement;
headers.footerLine = "Page";
headers.headerLines = parmLines.ToArray();
pdfDoc.SetMargins(headers.leftMargin, headers.rightMargin, headers.topMargin + headers.headerheight, headers.bottomMargin + headers.footerHeight);
pdfDoc.Open();
// the new page is necessary due to a bug in in the current version of itextsharp
pdfDoc.NewPage();
... now your headers and footer will be handled automatically

This link will help you out completely(the Shortest and Most Elegant way):
Header Footer with PageEvent
PdfPTable tbheader = new PdfPTable(3);
tbheader.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
tbheader.DefaultCell.Border = 0;
tbheader.AddCell(new Paragraph());
tbheader.AddCell(new Paragraph());
var _cell2 = new PdfPCell(new Paragraph("This is my header", arial_italic));
_cell2.HorizontalAlignment = Element.ALIGN_RIGHT;
_cell2.Border = 0;
tbheader.AddCell(_cell2);
float[] widths = new float[] { 20f, 20f, 60f };
tbheader.SetWidths(widths);
tbheader.WriteSelectedRows(0, -1, document.LeftMargin, writer.PageSize.GetTop(document.TopMargin), writer.DirectContent);
PdfPTable tbfooter = new PdfPTable(3);
tbfooter.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
tbfooter.DefaultCell.Border = 0;
tbfooter.AddCell(new Paragraph());
tbfooter.AddCell(new Paragraph());
var _cell2 = new PdfPCell(new Paragraph("This is my footer", arial_italic));
_cell2.HorizontalAlignment = Element.ALIGN_RIGHT;
_cell2.Border = 0;
tbfooter.AddCell(_cell2);
tbfooter.AddCell(new Paragraph());
tbfooter.AddCell(new Paragraph());
var _celly = new PdfPCell(new Paragraph(writer.PageNumber.ToString()));//For page no.
_celly.HorizontalAlignment = Element.ALIGN_RIGHT;
_celly.Border = 0;
tbfooter.AddCell(_celly);
float[] widths1 = new float[] { 20f, 20f, 60f };
tbfooter.SetWidths(widths1);
tbfooter.WriteSelectedRows(0, -1, document.LeftMargin, writer.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);

pdfDoc.Open();
Paragraph para = new Paragraph("Hello World", new Font(Font.FontFamily.HELVETICA, 22));
para.Alignment = Element.ALIGN_CENTER;
pdfDoc.Add(para);
pdfDoc.Add(new Paragraph("\r\n"));
htmlparser.Parse(sr);
pdfDoc.Close();

Related

iTextSharp in MVC, how to add image on 3rd page of pdf with custom x,y margins?

I am creating a PDF in MVC project using iTextSharp on .NET platform. I am sending a HTML div in "Download PDF" function and adding image from c# code using iTextSharp classes, but now I want to add an Image on 3rd page but unfortunately I am unable to do that. Please help me.
Please find the below code that I wrote for adding image on first page, last page and a loop for adding image on each page... (BUT I CAN NOT ADD AN IMAGE ONLY ON 3RD PAGE)...
using (MemoryStream stream = new System.IO.MemoryStream())
{
string Grid = GridHtml.Replace("<br>", "\n\r");
StringReader sr = new StringReader(Grid);
iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document(PageSize.A4, 10f, 10f, 100f, 0f);
pdfDoc.SetMargins(50f, 50f, 90f, 0f);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
MyEvent events = new MyEvent();
writer.PageEvent = events;
pdfDoc.Open();
string imageURL1 = Server.MapPath("~/UploadedFiles/Calibehr.png");
iTextSharp.text.Image jpg12 = iTextSharp.text.Image.GetInstance(imageURL1);
////Resize image depend upon your need
jpg12.ScaleToFit(140f, 120f);
jpg12.SpacingBefore = 10f;
//////Give some space after the image
jpg12.SpacingAfter = 1f;
jpg12.Alignment = Element.ALIGN_CENTER;
jpg12.SetAbsolutePosition(40, 750);
pdfDoc.Add(jpg12);
if ((fc["hdnFormatType"] != "ManageService"))
{
string imageURL3 = Server.MapPath("~/UploadedFiles/Swati-Sign.png");
iTextSharp.text.Image jpgSign = iTextSharp.text.Image.GetInstance(imageURL3);
////Resize image depend upon your need
jpgSign.ScaleToFit(140f, 120f);
jpgSign.SpacingBefore = 10f;
//////Give some space after the image
jpgSign.SpacingAfter = 1f;
jpgSign.Alignment = Element.ALIGN_LEFT;
jpgSign.SetAbsolutePosition(40, 160);
//jpg12.
pdfDoc.Add(jpgSign);
}
string imageURL2 = Server.MapPath("~/UploadedFiles/footer.jpg");
iTextSharp.text.Image jpgFooter = iTextSharp.text.Image.GetInstance(imageURL2);
////Resize image depend upon your need
jpgFooter.ScaleToFit(140f, 120f);
jpgFooter.SpacingBefore = 10f;
//////Give some space after the image
jpgFooter.SpacingAfter = 1f;
jpgFooter.Alignment = Element.ALIGN_LEFT;
jpgFooter.ScaleAbsoluteWidth(510);
jpgFooter.ScaleAbsoluteHeight(70);
jpgFooter.SetAbsolutePosition(40, 0);
//jpg12.
pdfDoc.Add(jpgFooter);
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
string imageURL4 = Server.MapPath("~/UploadedFiles/Swati-Sign.png");
iTextSharp.text.Image jpgFooterSign = iTextSharp.text.Image.GetInstance(imageURL4);
////Resize image depend upon your need
jpgFooterSign.ScaleToFit(140f, 120f);
jpgFooterSign.SpacingBefore = 10f;
//////Give some space after the image
jpgFooterSign.SpacingAfter = 1f;
jpgFooterSign.Alignment = Element.ALIGN_LEFT;
if ((fc["hdnFormatType"] == "ManageService"))
{
jpgFooterSign.SetAbsolutePosition(20, 150);
}
else
{
jpgFooterSign.SetAbsolutePosition(20, 450);
}
writer.DirectContent.AddImage(jpgFooterSign, false);
pdfDoc.Close();
return File(stream.ToArray(), "application/pdf", CandName + "-" + empId + ".pdf");
}
}
Try this one:- set positions also what you want.
public void AddImage(int pageNumber)
{
if (pageNumber > 0)
{
string pdfTemplate =
#"D:\Input.pdf";
string newFile = #"D:\Output.pdf";
PdfReader pdfReader = new PdfReader(pdfTemplate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(
newFile, FileMode.Create));
AcroFields pdfFormFields = pdfStamper.AcroFields;
string chartLoc = string.Empty;
chartLoc = #"C:\img.png";
iTextSharp.text.Image chartImg = iTextSharp.text.Image.GetInstance(chartLoc);
iTextSharp.text.pdf.PdfContentByte underContent;
iTextSharp.text.Rectangle rect;
try
{
Single X, Y; int pageCount = 0;
rect = pdfReader.GetPageSizeWithRotation(1);
if (chartImg.Width > rect.Width || chartImg.Height > rect.Height)
{
chartImg.ScaleToFit(rect.Width, rect.Height);
X = (rect.Width - chartImg.ScaledWidth) / 2;
Y = (rect.Height - chartImg.ScaledHeight) / 2;
}
else
{
X = (rect.Width - chartImg.Width) / 2;
Y = (rect.Height - chartImg.Height) / 2;
}
chartImg.SetAbsolutePosition(X, Y);
pageCount = pdfReader.NumberOfPages;
//Below to add image to all pages
//for (int i = 1; i < pageCount; i++)
//{
// underContent = pdfStamper.GetOverContent(i);//.GetUnderContent(i);
// underContent.AddImage(chartImg);
//}
if (pageCount >= pageNumber)
{
underContent = pdfStamper.GetOverContent(pageNumber);//.GetUnderContent(i);
underContent.AddImage(chartImg);
}
pdfStamper.Close();
pdfReader.Close();
}
catch (Exception ex)
{
throw ex;
}
}
}

How to print One Record Per Page With a Header for each page in PDF document with iTextSharp in C#

I am new to iTextSharp.
How can I print one record per page?
Could anyone provide me with some sample code to show me how I can achieve my objective?
Try this Solution :
using (var output = new MemoryStream())
{
using (var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 40, 40, 30, 90))
{
using (var writer = PdfWriter.GetInstance(document, output))
{
Phrase phrase = null;
PdfPCell cell = null;
PdfPTable table = null;
try
{
document.Open();
document.PageCount = 1;
writer.PageEvent = new Footer(data);
foreach (var item in data)
{
table = new PdfPTable(1);
table.SpacingBefore = 20;
table.WidthPercentage = PageSize.A4.Width;
float[] ProfessionalServices = new float[1];
ProfessionalServices[0] = (float)(1 * PageSize.A4.Width);
table.SetWidthPercentage(ProfessionalServices, PageSize.A4);
phrase = new Phrase("Record :" + item);
cell = new PdfPCell(phrase);
cell.Border = 0;
cell.Padding = 2;
cell.Colspan = 3;
cell.HorizontalAlignment = Element.ALIGN_RIGHT;
table.AddCell(cell);
table.WriteSelectedRows(0, -1, document.Left, document.Top - (100 + 20), writer.DirectContent);
document.Add(table);
document.ResetPageCount();
document.NewPage();
}
document.Close();
}
catch (Exception ex)
{
}
if (!Directory.Exists(current.Server.MapPath("~/bill-pdf/")))
Directory.CreateDirectory(current.Server.MapPath("~/bill-pdf/"));
string pdfFilePath = current.Server.MapPath("~/bill-pdf/" + guid + ".pdf");
File.WriteAllBytes(pdfFilePath, output.ToArray());
if (File.Exists(filePath))
File.Delete(filePath);
}
}
}
Footer Method code :
#region Footer Class
public partial class Footer : PdfPageEventHelper
{
#region Constructor
public Footer()
{
}
#endregion
#region OnStartPage
public override void OnStartPage(PdfWriter writer, Document document)
{
if (document.PageNumber > 1)
{
string footerMessage = "Page " + document.PageNumber;
Paragraph footer = new Paragraph(footerMessage, FontFactory.GetFont(FontFactory.HELVETICA, 9));
footer.Alignment = Element.ALIGN_RIGHT;
PdfPTable footerTbl = new PdfPTable(numColumns: 1);
footerTbl.WidthPercentage = 100;
footerTbl.TotalWidth = PageSize.A4.Width;
PdfPCell cell = new PdfPCell(new Phrase(footer));
cell.Border = 0;
cell.HorizontalAlignment = Element.ALIGN_RIGHT;
footerTbl.AddCell(cell);
footerTbl.WriteSelectedRows(0, -1, document.RightMargin - 80, document.Top + 30, writer.DirectContent);
}
}
#endregion
#region OnEndPage
public override void OnEndPage(PdfWriter writer, Document doc)
{
string footerMessage = "Footer Text";
Paragraph footer = new Paragraph(footerMessage, FontFactory.GetFont(FontFactory.HELVETICA, 9));
footer.Alignment = Element.ALIGN_CENTER;
PdfPTable footerTbl = new PdfPTable(numColumns: 1);
footerTbl.TotalWidth = PageSize.A4.Width;
PdfPCell cell = new PdfPCell(new Phrase(footer));
cell.Border = 0;
cell.HorizontalAlignment = Element.ALIGN_CENTER;
footerTbl.AddCell(cell);
//footerTbl.WriteSelectedRows(0, 10, 50, 55, writer.DirectContent);
footerTbl.WriteSelectedRows(0, -1, 0, 55, writer.DirectContent);
}
#endregion
}
#endregion
Try code you can set header and footer your own content For header modify OnStartPage() and for footer modify OnEndPage()

iTextSharp PdfPCell align image to bottom of cell

I'm trying to align an image to the bottom-right of a cell.
I'm basically creating a table with two cells for each row. The cell contains text and an image, which I want to be aligned to the right bottom of the cells. Please refer to image
This is my code
PdfPTable table = new PdfPTable(2);
table.TotalWidth = 400f;
table.LockedWidth = true;
float[] widths = new float[] { 1.5f, 1.5f };
table.SetWidths(widths);
table.HorizontalAlignment = 0;
table.SpacingBefore = 50f;
table.SpacingAfter = 30f;
iTextSharp.text.Image logoImage = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("~/Images/MyImage.png"));
logoImage.ScaleAbsolute(40, 40);
logoImage.Alignment = iTextSharp.text.Image.ALIGN_BOTTOM;
logoImage.Alignment = iTextSharp.text.Image.RIGHT_ALIGN;
foreach (EmployeeModel employee in employees)
{
PdfPCell cell = new PdfPCell();
cell.FixedHeight = 140f;
cell.PaddingLeft = 30f;
cell.PaddingRight = 10f;
cell.PaddingTop = 20f;
cell.PaddingBottom = 5f;
Paragraph p = new Paragraph(GetLabelCellText(Employee), NormalFont);
p.Alignment = Element.ALIGN_LEFT;
p.Alignment = Element.ALIGN_TOP;
cell.AddElement(p);
cell.AddElement(logoImage);
table.AddCell(cell);
}
How do I place the image at the bottom right of each cell (without affecting the position of the text of course).
The question is a bit ambiguous because you create a Table with two columns, but add cells without verifying the employees collection has an even number of elements, which will throw if not....
Assuming you really do want both the text and the image in a single cell, probably the simplest way to get the layout you want is to implement IPdfPCellEvent:
public class BottomRightImage : IPdfPCellEvent
{
public Image Image { get; set; }
public void CellLayout(
PdfPCell cell,
Rectangle position,
PdfContentByte[] canvases)
{
if (Image == null) throw new InvalidOperationException("image is null");
PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
Image.SetAbsolutePosition(
position.Right - Image.ScaledWidth - cell.PaddingRight,
position.Bottom + cell.PaddingBottom
);
canvas.AddImage(Image);
}
}
Then set the CellEvent property on the PdfPCell. Here's a simple working example:
using (var stream = new MemoryStream())
{
using (var document = new Document())
{
PdfWriter.GetInstance(document, stream);
document.Open();
var table = new PdfPTable(2)
{
HorizontalAlignment = Element.ALIGN_LEFT,
TotalWidth = 400f,
LockedWidth = true
};
var image = Image.GetInstance(imagePath);
image.ScaleAbsolute(40, 40);
var cellEvent = new BottomRightImage() { Image = image };
var testString =
#"first name: {0}
last name: {0}
ID no: {0}";
for (int i = 0; i < 2; ++i)
{
var cell = new PdfPCell()
{
FixedHeight = 140f,
PaddingLeft = 30f,
PaddingRight = 10f,
PaddingTop = 20f,
PaddingBottom = 5f
};
cell.CellEvent = cellEvent;
var p = new Paragraph(string.Format(testString, i))
{
Alignment = Element.ALIGN_TOP | Element.ALIGN_LEFT
};
cell.AddElement(p);
table.AddCell(cell);
}
document.Add(table);
}
File.WriteAllBytes(outputFile, stream.ToArray());
}
And PDF output:
An all-black square image is used to show the PdfPCell padding is taken into account.

How to print the details in landscape in pdf using itextsharp?

My requirement is to print the details in landscape,not the page rotation.i need content printed in landscape.
Document doc = new Document(iTextSharp.text.PageSize.A4, (float)MarginLeft, (float)MarginRight, (float)MarginTop, (float)MarginBottom);
//210 mm width * 297 mm height
PaperWidthAvailable = iTextSharp.text.Utilities.MillimetersToPoints(210f) - ((float)MarginLeft + (float)MarginRight);
PaperHeightAvailable = iTextSharp.text.Utilities.MillimetersToPoints(297f) - ((float)MarginTop + (float)MarginBottom);
wdtOFcell = (float)BarcodeWidth + (float)BarcodeSpaceHorizontal;
colNo = (int)Math.Floor(PaperWidthAvailable / wdtOFcell);
TableWidth = wdtOFcell * colNo;
htOFcell = (float)BarcodeHeight + (float)BarcodeSpaceVertical;
PdfWriter writer = PdfWriter.GetInstance(doc, memStream);
doc.Open();
int noOfColumns = colNo;
// int additionalRow = imageBarcodeLists.Count % noOfColumns;
int i = 1;
PdfPTable table = new PdfPTable(noOfColumns);
table.DefaultCell.Border = iTextSharp.text.Rectangle.NO_BORDER;
table.HorizontalAlignment = 0;
table.TotalWidth = TableWidth;
table.LockedWidth = true;
float[] widths = new float[colNo];
for (int j = 0; j < colNo; j++)
{
widths[j] = wdtOFcell;
}
table.SetWidths(widths);
iTextSharp.text.Image itextBarcodeImage = null;
foreach (System.Drawing.Image barcodeImage in imageBarcodeLists)
{
var imageCompressor = new ImageCompressionUtility();
System.Drawing.Image barcodeImages = imageCompressor.TrimImageWhiteSpacesFromImage(barcodeImage);
itextBarcodeImage = iTextSharp.text.Image.GetInstance(barcodeImages, BaseColor.BLUE);
itextBarcodeImage.ScaleAbsolute((float)BarcodeWidth, (float)BarcodeHeight);
PdfPCell cells = new PdfPCell(itextBarcodeImage);
cells.Border = iTextSharp.text.Rectangle.NO_BORDER;
cells.PaddingTop = 0f;
cells.PaddingRight = 0f;
cells.PaddingBottom = 0f;
cells.PaddingLeft = 0f;
cells.UseAscender = true;
cells.FixedHeight = htOFcell;
cells.BackgroundColor = BaseColor.WHITE;
cells.Border = iTextSharp.text.Rectangle.NO_BORDER;
table.AddCell(cells);
i++;
}
doc.Add(table);
doc.Close();
The constant iTextSharp.text.PageSize.A4 is actually a Rectangle that is created like this:
public static readonly Rectangle A4 = new Rectangle(595,842);
If you want to rotate the page, you can use the Rotate() method as explained in my answer to this question: How to print custom page size as portrait in itextsharp
However, based on your comment "it rotates only the paper not the content written", you may be looking for a page size that is created like this:
Rectangle myA4 = new Rectangle(842,595);
Document doc = new Document(myA4);
If that doesn't work, please take a look at my answer to the question iText - Rotate page content while creating PDF
In that answer, I introduce a page rotation using a page event:
public class MyPdfPageEvent : iTextSharp.text.pdf.PdfPageEventHelper
{
public override void OnEndPage(PdfWriter writer, Document document)
{
writer.AddPageDictEntry(PdfName.ROTATE, PdfPage.SEASCAPE);
}
}
If none of the above has the effect you desire, you should improve your question (or it will be closed as "unclear what is asked").

How to maintain consistancy of Header being on page top throughout all Page Sizes?

I have set page header (using iTextSharp library) along with margins set only for A4 page size (according to its orientation) -because i have set the document's page size as A4 only- and so it works only for A4 page and shows it on top. Can anybody tell me that how to make this header consistant throughout all Page size whatever user selects? Like it should print the header on the top of each and every predefined page size as it does for A4 because when i select Pagesize.HALFLETTER, Header gets vanished as it goes out of the page boundaries. Any Help?
UPDATED QUESTION!
My code is:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.exceptions;
using System.Windows.Forms;
using System.IO;
namespace PDFGeneration
{
public class Events : iTextSharp.text.pdf.PdfPageEventHelper
{
private String header;
private iTextSharp.text.pdf.PdfTemplate total;
private PdfContentByte cb;
private PdfTemplate template;
protected Font footer
{
get
{
//BaseFont bfArialUniCode = BaseFont.CreateFont(#"fonts\\adobe-arabic-regular-1.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseColor grey = new BaseColor(128, 128, 128);
Font font = FontFactory.GetFont("Arial", 10.0f, Font.NORMAL, grey);
//Font font = new Font(bfArialUniCode, 10.0f, Font.NORMAL, grey);
return font;
}
}
protected Font watermark
{
get
{
BaseFont bfArialUniCode = BaseFont.CreateFont(#"fonts\\adobe-arabic-regular-1.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseColor grey = new BaseColor(128, 128, 128);
Font font = new Font(bfArialUniCode, 14.0f, Font.BOLDITALIC, grey);
return font;
}
}
public override void OnStartPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
{
PdfPTable headerTbl = new PdfPTable(1);
headerTbl.TotalWidth = document.PageSize.Width;
//Center the table on the page
headerTbl.HorizontalAlignment = Element.ALIGN_JUSTIFIED;
Paragraph para = new Paragraph(String.Format("Urdu Word Processor Date : {0:dd/MMM/yyyy} Page Number : {1}", DateTime.Now, writer.PageNumber), footer);
PdfPCell cell = new PdfPCell(para);
cell.Border = 0;
cell.PaddingLeft = 120.0f;
//cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
//add cell to table
headerTbl.AddCell(cell);
headerTbl.WriteSelectedRows(0, -1, 0, (document.BottomMargin + 790), writer.DirectContent);
}
public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
{
//PdfContentByte cb = writer.DirectContent;
//PdfPTable tablefooter = new PdfPTable(1);
////tablefooter.HeaderRows = 3;
//tablefooter.HorizontalAlignment = 1;
//float[] widthfooter = new float[] { 1f };
//tablefooter.SetWidths(widthfooter);
//tablefooter.SpacingBefore = 100f;
//PdfPCell headerfooter = new PdfPCell(new Phrase(String.Format("Urdu Word Processor Date : {0:dd/MMM/yyyy} Page Number : {1}", DateTime.Now, writer.PageNumber), new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12, iTextSharp.text.Font.NORMAL, BaseColor.BLACK)));
////Phrase headerfooter = new Phrase(new Phrase("Urdu Word Processor " + "Date: " + DateTime.Now.ToString("dd-MMM-yyyy-ss") + " " + "Page: " + writer.PageNumber, new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 12, iTextSharp.text.Font.NORMAL, BaseColor.BLACK)));
//headerfooter.HorizontalAlignment = 0; //0=Left, 1=Centre, 2=Right
//headerfooter.Border = iTextSharp.text.Rectangle.TOP_BORDER;
//tablefooter.AddCell(headerfooter);
////document.Add(tablefooter);
//ColumnText ct = new ColumnText(cb);
//ct.SetSimpleColumn(new Phrase(new Chunk("بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّحِيْمِ ", FontFactory.GetFont(FontFactory.HELVETICA, 18, Font.NORMAL))),
// 46, 190, 530, 36, 25, Element.ALIGN_LEFT | Element.ALIGN_TOP);
//ct.Go();
// water mark
//ColumnText.ShowTextAligned(writer.DirectContentUnder,Element.ALIGN_CENTER,
// new Phrase("بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّحِيْمِ", watermark),
// 297.5f, 421, ((writer.PageNumber % 2) == 1) ? 45 : -45); // have made a loop so to have multiple orientations.
ColumnText col = new ColumnText(writer.DirectContentUnder);
col.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
col.SetSimpleColumn(220, 810, 569, 36);
col.AddElement(new Paragraph("بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّحِيْمِ",watermark));
col.Go();
}
//public void setHeader(String header)
//{
// this.header = header;
//}
//public void onOpenDocument(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
//{
// total = writer.DirectContent.CreateTemplate(30,16);
//}
//public void onEndPage(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
//{
// iTextSharp.text.pdf.PdfPTable table = new PdfPTable(1);
// try
// {
// //table.SetWidths(new int[]{24, 24, 2});
// table.SetTotalWidth(new float[] {527.0f,527.0f,527.0f});
// //table.LockedWidth = true;
// table.DefaultCell.FixedHeight = 20;
// table.DefaultCell.Border = iTextSharp.text.Rectangle.ALIGN_BOTTOM;
// table.AddCell(header);
// table.DefaultCell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_RIGHT;
// table.AddCell( String.Format("Page:{0} of", writer.PageNumber));
// // MessageBox.Show(String.Format("Page:{0} of", writer.PageNumber));
// iTextSharp.text.pdf.PdfPCell cell = new iTextSharp.text.pdf.PdfPCell(iTextSharp.text.Image.GetInstance(total));
// cell.Border = iTextSharp.text.Rectangle.ALIGN_BOTTOM;
// table.AddCell(cell);
// table.WriteSelectedRows(0, -1,
// 34, 803, writer.DirectContent);
// }
// catch(Exception de)
// {
// // MessageBox.Show(de.Message.ToString());
// }
//}
//public void onCloseDocument(iTextSharp.text.pdf.PdfWriter writer, iTextSharp.text.Document document)
//{
// String pageNumber = (writer.PageNumber).ToString();
// pageNumber += " of " + (writer.PageNumber).ToString();
// iTextSharp.text.pdf.ColumnText.ShowTextAligned(writer.DirectContent, iTextSharp.text.Element.ALIGN_RIGHT, new iTextSharp.text.Phrase(pageNumber), 580, 10, -90);
//}
//override the OnPageEnd event handler to add our footer
//public override void OnOpenDocument(PdfWriter writer, Document document)
//{
// cb = writer.DirectContent;
// template = cb.CreateTemplate(50, 50);
//}
//public override void OnEndPage(PdfWriter writer, Document document)
//{
// base.OnEndPage(writer, document);
// int pageN = writer.PageNumber;
// String text = "Page " + pageN.ToString() + " of ";
// //float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);
// iTextSharp.text.Rectangle pageSize = document.PageSize;
// cb.SetRGBColorFill(100, 100, 100);
// cb.BeginText();
// //cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
// cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
// cb.ShowText(text);
// cb.EndText();
// cb.AddTemplate(template, document.LeftMargin + 10.0f, pageSize.GetBottom(document.BottomMargin));
//}
//public override void OnCloseDocument(PdfWriter writer, Document document)
//{
// base.OnCloseDocument(writer, document);
// BaseFont bfArialUniCode = BaseFont.CreateFont(#"fonts\\adobe-arabic-regular-1.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// template.BeginText();
// template.SetFontAndSize(bfArialUniCode, 14.0f);
// template.SetTextMatrix(0, 0);
// template.ShowText("" + (writer.PageNumber - 1));
// template.EndText();
//}
}// end of class
}
This code prints this output onl at the top of A4 page size and it should be because its hard coded values there inside this code to align the text.
Urdu Word Processor Date: 17-02-2013 Page Number: 1
بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّحِيْمِ
How can this be oriented so it should be same for all page sizes?

Categories

Resources