Reputation: 89
I am using itext to generate a pdf document but I am trying to use the existing solutions to add page number to the pdf document that is being generated but none of them seems to be working for me.
I tried using something like
using (MemoryStream stream = new MemoryStream())
{
PdfReader reader = new PdfReader(bytes);
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
int pages = reader.NumberOfPages;
for (int i = 1; i <= pages; i++)
but my code doesnt recognize PdfStamper and asks me to create a class. Similarly, I tried using
MemoryStream ms = new MemoryStream();
PdfReader reader = new PdfReader(pdf);
int n = reader.NumberOfPages;
Rectangle psize = reader.GetPageSize(1);
There is error on .NumberOfPages and .GetPageSize.
I also tried creating a separate PageEventHandler class but the problem remains same.
Right now, I am able to generate pdf but I want to add page number and I have a code like
private MemoryStream MakeDocument(Application application)
{
MemoryStream ms = new MemoryStream();
PdfWriter writer = new PdfWriter(ms);
PdfDocument pdfDocument = new PdfDocument(writer);
using (var document = new Document(pdfDocument))
{
var sections = new List<IDocumentSection>
{
new Header(),
new Projects(application.Projects),
//Footer
};
foreach (var section in sections)
section.AddTo(document);
Rectangle pageSize;
PdfCanvas canvas;
int n = pdfDocument.GetNumberOfPages();
for (int i = 1; i <= n; i++)
{
PdfPage page = pdfDocument.GetPage(i);
pageSize = page.GetPageSize();
canvas = new PdfCanvas(page);
canvas.BeginText()
.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.HELVETICA), 7)
.MoveText(pageSize.GetWidth() / 2 - 7, 10)
.ShowText(i.ToString())
.ShowText(" of ")
.ShowText(n.ToString())
.EndText();
}
}
return ms;
var outputStream = MakeDocument(application);
var response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new ByteArrayContent(outputStream.ToArray())
};
response.Content.Headers.Add("Content-Type", "application/pdf");
return response;
But it is complaining at GetPageSize Object reference not set to an instance of an object. Even if I set page size as A4, it starts to complain at canvas = new PdfCanvas(page);
Upvotes: 0
Views: 845
Reputation: 77528
It seems that you are using iText 7. Or rather, that's what I assume when I see:
PdfWriter writer = new PdfWriter(ms);
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
The PdfStamper
class is an iText 5 class. It doesn't exist in iText 7. See Chapter 5 of the jump-start tutorial. You probably want something like this:
MemoryStream stream = new MemoryStream();
PdfWriter writer = new PdfWriter(stream);
PdfReader reader = new PdfReader(bytes);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
Document document = new Document(pdfDoc);
Rectangle pageSize;
PdfCanvas canvas;
int n = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= n; i++) {
PdfPage page = pdfDoc.GetPage(i);
pageSize = page.GetPageSize();
canvas = new PdfCanvas(page);
// draw page numbers on the canvas
}
pdfDoc.close();
If you aren't using iText 7, then there's something wrong in your question. In that case you should clarify what you mean when you use the concepts PdfStamper
and PdfEventHandler
in the same sentence, because that doesn't make any sense.
Upvotes: 1