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 60: byte[] buffer=new byte[fs.Length];
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上搜索吧。

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

相关文章
|
5月前
|
Python
Python办公自动化:删除任意页数pdf页面
Python办公自动化:删除任意页数pdf页面
144 1
Python办公自动化:删除任意页数pdf页面
|
4月前
|
索引 Python
PDF文件页面提取操作小指南
PDF文件页面提取操作小指南
136 4
|
4月前
|
Python
Python对PDF文件页面的旋转和切割
Python对PDF文件页面的旋转和切割
79 3
|
4月前
|
Python
EasyGUI+PyDF2应用小示例—PDF页面提取应用程序
EasyGUI+PyDF2应用小示例—PDF页面提取应用程序
47 3
|
7月前
|
分布式计算 大数据 Spark
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
《Spark大数据处理:技术、应用与性能优化》深入浅出介绍Spark核心,涵盖部署、实战与性能调优,适合初学者。作者基于微软和IBM经验,解析Spark工作机制,探讨BDAS生态,提供实践案例,助力快速掌握。书中亦讨论性能优化策略。[PDF下载链接](https://zhangfeidezhu.com/?p=347)。![Spark Web UI](https://img-blog.csdnimg.cn/direct/16aaadbb4e13410f8cb2727c3786cc9e.png#pic_center)
196 1
Spark大数据处理:技术、应用与性能优化(全)PDF书籍推荐分享
|
6月前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
284 0
|
7月前
|
开发框架 前端开发 JavaScript
在Winform程序中使用Spire.Pdf实现页面添加印章处理
在Winform程序中使用Spire.Pdf实现页面添加印章处理
|
8月前
|
前端开发 JavaScript API
技术笔记:vue+pdfh5实现将pdf渲染到页面上
技术笔记:vue+pdfh5实现将pdf渲染到页面上
|
存储
Photoshop合并多个图片为PDF格式文件的(PDF文件编辑删除页面及合并的操作方法)解决方案
Photoshop合并多个图片为PDF格式文件的(PDF文件编辑删除页面及合并的操作方法)解决方案
319 0
|
9月前
|
搜索推荐 定位技术 数据安全/隐私保护
方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
199 1

热门文章

最新文章