2011-12-08 117 views
2

我有一個攔截PDF文檔請求的HttpModule,我想向PDF添加一個日期並將其返回給客戶端。使用iTextSharp修改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); 

有誰知道我該如何解決這個問題?

回答

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

感謝您的建議,試過了,但並仍然得到同樣的錯誤 – Dave

+0

同樣的錯誤,當使用您的字節代碼太 – Dave

+3

我知道你說,它didn不工作,但我只是想確保清楚你**從不**在'MemoryStream'上使用'GetBuffer()'並且總是**使用'ToArray()'代替。前者返回額外的未初始化字節,就PDF呈現器而言,該字節將被視爲垃圾。後者只給你「使用過的」字節。 http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx#remarksToggle –