我正在使用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