c# - PdfStamper正在处理输出流吗? (iTextSharp)

标签 c# 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();
    }
}

最佳答案

这并不是真正的答案,但为了扩展 @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,但以防万一其他人看到这个,几乎从来没有(“几乎从来没有”我真正的意思是“从来没有”)一个很好的理由 关闭底层流。您可以通过抓取原始字节来从流中读取数据,然后再次写入它是没有意义的。

关于c# - PdfStamper正在处理输出流吗? (iTextSharp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141804/

相关文章:

c# - 我如何创建一个可以从 c# 调用的 cpp 函数,并将函数作为参数

c# - 在 Linux 上导入和开发 WinForms 应用程序

java - 使用 iText 计算 PDF 上的附件数量

visual-studio - 您可以将VS2008代码分析配置为使用英式英语词典吗?

.net - Visual Studio 的 StyleCop 的替代品?

c++ - 计算快速排序算法中的基本操作?

c# - 如何使事件处理程序中的发件人成为我的自定义控件而不是其中的标签

c# - 使用 IMiddleware 时添加自定义中间件不起作用

c# - 使用 XMLWorker 将 HTML 解析为 PDF 时设置行间距 - ITextSharp C#

java - 使用 iText 从 Java 生成 RTF 时,条码字体未在 MS Word 中动态加载