PdfStamper 是否正在处理输出流? (iTextSharp)
Is PdfStamper disposing output stream? (iTextSharp)
我正在使用 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 但以防万一其他人看到这个,几乎从来没有("almost never" 我的意思是 "never")一个很好的理由 not 关闭底层流。您可以通过抓取原始字节并再次写入来从流中读取,这毫无意义。
以下允许我在压模关闭后保持 MemoryStream 打开:
pdfStamper.Writer.CloseStream = false;
我正在使用 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 但以防万一其他人看到这个,几乎从来没有("almost never" 我的意思是 "never")一个很好的理由 not 关闭底层流。您可以通过抓取原始字节并再次写入来从流中读取,这毫无意义。
以下允许我在压模关闭后保持 MemoryStream 打开:
pdfStamper.Writer.CloseStream = false;