Dave
Dave

Reputation: 531

Modifying a PDF using iTextSharp

I have a HttpModule that intercepts requests for PDF documents and I would like to add a date to the PDF and stream back to the client.

My code so far is

context.Response.ClearContent();

using (MemoryStream ms = new MemoryStream())
{
  PdfReader reader = new PdfReader(document.Url + "&a=1");
  PdfStamper stamper = new PdfStamper(reader, ms);
  // *** Modify PDF here
  stamper.Close();

  context.Response.ContentType = "application/pdf";
  context.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
  context.Response.OutputStream.Flush();
  context.Response.OutputStream.Close();
  context.Response.Flush();
  context.Response.End();
}

HttpContext.Current.ApplicationInstance.CompleteRequest();

The code above works fine, but as soon as I try to modify the PDF I get a PDF Reader error 'The file is damaged and cannot be repaired', for example

TextField textField = new TextField(stamper.Writer, new Rectangle(0, 1000, 90, 600), name);
textField.Font = FontFactory.GetFont(FontFactory.HELVETICA, DEFAULT_FONT_SIZE, Font.NORMAL).BaseFont;
textField.FontSize = DEFAULT_FONT_SIZE;
textField.Rotation = 90;
PdfFormField field = textField.GetTextField();

stamper.AddAnnotation(field, page);

Does anyone know how I can solve this issue?

Upvotes: 2

Views: 1218

Answers (1)

Peter
Peter

Reputation: 27934

You continue sending stuff after the pdf, add

context.Response.End();

after:

context.Response.Flush();

Now you will send only the pdf, instead of the whole page. This sometimes fixes this issue.

You are also reading the buffer twice:

context.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);

try to add

byte[] bytes = ms.ToArray();

and then

context.Response.OutputStream.BinaryWrite(bytes);

Upvotes: 2

Related Questions