我正在使用iTextSharp將頁碼添加到使用C#的PDF中。在運行代碼分析時,輸出的MemoryStream
被懷疑會被處理多次。 See this warning generated by Visual Studio.這是一個API問題嗎? PdfStamper
的第二個參數是否應該標記爲out
?有沒有辦法讓我解決這個警告?是PDF處理器處理輸出流嗎? (iTextSharp)
MemoryStream mem = null;
PdfReader reader = null;
PdfStamper stamper = null;
try
{
mem = new MemoryStream();
reader = new PdfReader(m_pdf);
stamper = new PdfStamper(reader, mem);
// do stuff
stamper.Close();
var result = mem.ToArray();
}
finally
{
if(stamper != null)
{
stamper.Dispose();
}
if (reader != null)
{
reader.Dispose();
}
if (mem != null)
{
mem.Dispose();
}
}
我是iText(其他人將它移植到C#)的開發人員,並且基於我對iText的瞭解,當我看到您的代碼時,我很擔心。我不知道'PdfStamper'中的Dispose()方法,但是我知道你總是需要'stamper.Close()'。 'Close()'方法也關閉了底層的輸出流。在關閉'stamper'之前關閉輸出流*是非常錯誤的,因爲這會導致截斷(不正確)的PDF文件。 – 2015-03-19 10:16:42
我在處理'stamper'之前處理'reader'的問題相同。如果'stamper'需要'reader'中的資源來完成PDF創建過程,則會拋出一個錯誤,因爲它將不再訪問關閉的'reader'。我更喜歡防禦性編程,所以我會切換這兩個,以便在處理'reader'之前處理'stamper'。 – 2015-03-19 10:20:39
@BrunoLowagie你說的對,'Close()'丟失了。我編輯了代碼,特別是處理對象的順序。我想這可以防止任何可能的問題雙重處置。 – aggsol 2015-03-19 10:27:54