使用iTextSharp修改PDF

时间:2011-12-08 16:10:59

标签: c# pdf itextsharp

我有一个拦截PDF文档请求的HttpModule,我想在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文件错误“文件已损坏且无法修复”,例如

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 个答案:

答案 0 :(得分:2)

您继续在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);