天天看點

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

假設有這麼一段代碼:

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

        private void CreatePdf()

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

{

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Document doc=new Document();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            MemoryStream ms=new MemoryStream();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            PdfWriter writer =PdfWriter.GetInstance(doc,ms);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            doc.Open();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            doc.Add(new Paragraph(DateTime.Now.ToLongDateString()));

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            doc.Close();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            ViewPdf(ms);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

        }

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

        private void ViewPdf(Stream fs)

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            byte[] buffer=new byte[fs.Length];

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            fs.Position=0;            

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            fs.Read(buffer,0,(int)fs.Length);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Response.Clear();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Response.ContentType = "application/pdf";

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Response.BinaryWrite(buffer);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Response.OutputStream.Flush();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            Response.OutputStream.Close();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

在調用CreatePdf()的時候碰到了如下錯誤:

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:

<code></code>

問題出在哪裡了呢?從錯誤我可以知道我們準備操作的Stream已經關閉,這是因為iTextSharp自動關閉生成的Stream了,那有沒有辦法不關閉呢?

看了下面這段代碼,也許就不用我說什麼了:

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

    private void Page_Load(object sender, System.EventArgs e)

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            //CreatePdf();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            EditPDF();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

        private void EditPDF()

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            PdfReader reader =new PdfReader(@"e:\xml2PDF.pdf");

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            PdfStamper stamper=new PdfStamper(reader,ms);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            stamper.Writer.CloseStream=false;

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            PdfContentByte cb=stamper.GetOverContent(1);            

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            cb.Circle(250,250,50);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            cb.SetColorFill(iTextSharp.text.Color.RED);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            cb.SetColorStroke(iTextSharp.text.Color.WHITE);

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            cb.FillStroke();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            stamper.Close();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            ViewPdf(ms);        

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            writer.CloseStream=false;

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

            fs.Close();

iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)
iTextSharp應用中關于“Cannot access a closed Stream”問題的解決辦法(附帶提供如何在頁面中顯示PDF的流)

原來PdfWriter有個熟悉就是讓我們設定是否自動關閉Stream的,而預設是關閉的。

2006-12-01更新ViewPdf function

        {

            byte[] buffer = new byte[fs.Length];

            fs.Position = 0;

            fs.Read(buffer, 0, (int)fs.Length);

            //Response.AddHeader("Content-Disposition", "attachment;FileName=out.pdf");

            Response.AddHeader("Content-Length",fs.Length.ToString()); 

        } 

如果需要下載下傳而不是在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,需要的自己研究下吧。