Изменение PDF с помощью iTextSharp - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть HttpModule, который перехватывает запросы на документы PDF, и я хотел бы добавить дату в PDF и передать обратно клиенту.

Мой код пока что

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

Приведенный выше код работает нормально, но как только я пытаюсь изменить PDF, я получаю ошибку PDF Reader «Файл поврежден и не может быть восстановлен», например

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

Кто-нибудь знает, как я могу решить эту проблему?

1 Ответ

2 голосов
/ 08 декабря 2011

Вы продолжаете посылать материал после PDF, добавляете

context.Response.End();

после:

context.Response.Flush();

Теперь вы будете отправлять только PDF, а не всю страницу.Иногда это решает эту проблему.

Вы также дважды читаете буфер:

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

попробуйте добавить

byte[] bytes = ms.ToArray();

, а затем

context.Response.OutputStream.BinaryWrite(bytes);
...