PdfStamper是否处理输出流? (iTextSharp的)

时间:2015-03-19 10:13:38

标签: c# itextsharp itext code-analysis idisposable

我正在使用iTextSharp通过C#将页码添加到PDF。在运行代码分析时,怀疑输出的MemoryStream被多次丢弃。 See this warning generated by Visual Studio.这是API问题吗? PdfStamper的第二个参数是否应标记为out?我有办法解决这个警告吗?

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

2 个答案:

答案 0 :(得分:4)

这不是一个真正的答案,但要扩展@mkl所说的内容,切换到using指令,因为那些指令会自动执行try/finally

以下是我(以及可能使用iTextSharp的其他所有人)通常建议与iTextSharp交互的方式。外部using是BCL内容,在这种情况下,MemoryStream和内部using语句是iTextSharp内容。

//Will hold our raw PDF bytes
Byte[] result;

//BCL stuff first
using (var mem = new MemoryStream()) {

    //iText stuff in the middle
    using (var reader = new PdfReader(m_pdf)) {
        using (var stamper = new PdfStamper(reader, mem)) {
            // do stuff

        }
    }

    //iText is completely done and disposed of at this point
    //so we can now grab the raw bytes that represent a PDF
    result = mem.ToArray();
}

顺便说一句,不一定是OP,但为了防止其他人看到这个,几乎从来没有(并且“几乎从来没有”,我的意思是“从不”)是不关闭底层流。您可以通过抓取原始字节来读取流,然后再次写入它是没有意义的。

答案 1 :(得分:1)

以下内容使我可以在关闭压模后使MemoryStream保持打开状态:

pdfStamper.Writer.CloseStream = false;