iTextSharp应用中关于“Cannot access a closed Stream”问题的解决办法(附带提供如何在页面中显示PDF的流)-阿里云开发者社区

开发者社区> 小麋鹿666> 正文

iTextSharp应用中关于“Cannot access a closed Stream”问题的解决办法(附带提供如何在页面中显示PDF的流)

简介:
+关注继续查看
假设有这么一段代码:
        private void CreatePdf()
        
{
            Document doc
=new Document();
            MemoryStream ms
=new MemoryStream();
            PdfWriter writer 
=PdfWriter.GetInstance(doc,ms);
            doc.Open();
            doc.Add(
new Paragraph(DateTime.Now.ToLongDateString()));
            doc.Close();
            ViewPdf(ms);
        }


        
private void ViewPdf(Stream fs)
        
{
            
byte[] buffer=new byte[fs.Length];
            fs.Position
=0;            
            fs.Read(buffer,
0,(int)fs.Length);
            Response.Clear();
            Response.ContentType 
= "application/pdf";
            Response.BinaryWrite(buffer);
            Response.OutputStream.Flush();
            Response.OutputStream.Close();
        }

在调用CreatePdf()的时候碰到了如下错误:

Cannot access a closed Stream.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ObjectDisposedException: Cannot access a closed Stream.

Source Error:

Line 58:   private void ViewPdf(Stream fs)
Line 59: {
Line 61: fs.Position=0;
Line 62: fs.Read(buffer,0,(int)fs.Length);

问题出在哪里了呢?从错误我可以知道我们准备操作的Stream已经关闭,这是因为iTextSharp自动关闭生成的Stream了,那有没有办法不关闭呢?
看了下面这段代码,也许就不用我说什么了:
    private void Page_Load(object sender, System.EventArgs e)
        
{
            
//CreatePdf();
            EditPDF();
        }


        
private void EditPDF()
        
{
            PdfReader reader 
=new PdfReader(@"e:\xml2PDF.pdf");
            MemoryStream ms
=new MemoryStream();
            PdfStamper stamper
=new PdfStamper(reader,ms);
            stamper.Writer.CloseStream
=false;
            PdfContentByte cb
=stamper.GetOverContent(1);            
            cb.Circle(
250,250,50);
            cb.SetColorFill(iTextSharp.text.Color.RED);
            cb.SetColorStroke(iTextSharp.text.Color.WHITE);
            cb.FillStroke();
            stamper.Close();
            ViewPdf(ms);        
        }


        
private void CreatePdf()
        
{
            Document doc
=new Document();
            MemoryStream ms
=new MemoryStream();
            PdfWriter writer 
=PdfWriter.GetInstance(doc,ms);
            writer.CloseStream
=false;
            doc.Open();
            doc.Add(
new Paragraph(DateTime.Now.ToLongDateString()));
            doc.Close();
            ViewPdf(ms);
        }


        
private void ViewPdf(Stream fs)
        
{
            
byte[] buffer=new byte[fs.Length];
            fs.Position
=0;            
            fs.Read(buffer,
0,(int)fs.Length);
            fs.Close();
            Response.Clear();
            Response.ContentType 
= "application/pdf";
            Response.BinaryWrite(buffer);
            Response.OutputStream.Flush();
            Response.OutputStream.Close();
        }

原来PdfWriter有个熟悉就是让我们设置是否自动关闭Stream的,而默认是关闭的。

2006-12-01更新ViewPdf function
        private void ViewPdf(Stream fs)
        {
            
byte[] buffer = new byte[fs.Length];
            fs.Position 
= 0;
            fs.Read(buffer, 
0, (int)fs.Length);
            Response.Clear();
            
//Response.AddHeader("Content-Disposition", "attachment;FileName=out.pdf");
            Response.AddHeader("Content-Length",fs.Length.ToString()); 
            Response.ContentType 
= "application/pdf";
            fs.Close();

            Response.BinaryWrite(buffer);
            Response.OutputStream.Flush();
            Response.OutputStream.Close();
        } 

如果需要下载而不是在IE中看的话,请把Response.AddHeader("Content-Disposition", "attachment;FileName=out.pdf");前的注释去掉,并替换上你想要的名字。

如果不指定Response.AddHeader("Content-Length",fs.Length.ToString());,IE会把网页内容也输出,在PDF后面,此时显示生成的PDF被破坏(这个说是IE的一个bug,我也不清楚)
如果附件名为中文:
Response.AddHeader("Content-Disposition", "attachment;FileName="+HttpUtility.UrlEncode("中文.pdf"));

内嵌显示PDF
Response.AddHeader("Content-Disposition", "inline;FileName=out.pdf");

更多这方面的信息google上搜索吧。

另外一个和缓存有关的信息,Cache-Control,需要的自己研究下吧。

 

本文转自RubyPdf 的中文博客博客园博客,原文链接:http://www.cnblogs.com/hardrock/archive/2006/02/23/336397.html,如需转载请自行联系原作http://www.cnblogs.com/hardrock/archive/2006/05/17/402654.html

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
DNN使用非80端口和总是跳转到http://localhost问题的解决(翻译)
我试图在一台服务器上安装一个DNN网站时,遇到了一些问题。问题一: 遇到的第一个问题就是网站总是自动导向到localhost。不管我怎么试,只要我输入http://domain.com/dnn,总是自动导向http://localhost/dnn,这样会导致外部无法访问这个网站。
512 0
解决sitemesh3装饰页面不能使用freemarker标签问题
如题,这个问题其实在sitemesh2中已经很好的解决了,不过在sitemesh3中可能没有解决,所以要自己写代码解决了,下面我先讲下sitemesh2是如何解决的: sitemesh-freemarker com.
862 0
jquery prop('checked', true)解决attr('checked', true)不能选中radio问题
正如标题所言,使用:prop('checked', true)就可以了
595 0
springmvc sitemesh json问题
参考: 解决方法: $.post('/json/submit.json', { name: username, password: password }, functio...
536 0
weblogic启动失败:Could not obtain the localhost address 解决办法
linux下weblogic启动如果出现这个错误,多半是hosts文件不对 1、先输入hostname,查看本机计算机名(比如:server123) 2、sudo vi /etc/hosts 编辑hosts文件,在最后加一行 127.
963 0
+关注
385
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载