当我使用iTextSharp创建多个表格的PDF文件时,出现以下错误消息:
以下是我asp.net应用程序的完整堆栈跟踪:
[ObjectDisposedException: Cannot access a closed Stream.] System.IO.__Error.StreamIsClosed() +57 System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +11011171 iTextSharp.text.pdf.OutputStreamCounter.Write(Byte[] buffer, Int32 offset, Int32 count) +52 iTextSharp.text.pdf.PdfIndirectObject.WriteTo(Stream os) +53 iTextSharp.text.pdf.PdfBody.Write(PdfIndirectObject indirect, Int32 refNumber, Int32 generation) +100 iTextSharp.text.pdf.PdfBody.Add(PdfObject objecta, Int32 refNumber, Int32 generation, Boolean inObjStm) +385 iTextSharp.text.pdf.PdfWriter.AddToBody(PdfObject objecta, PdfIndirectReference refa) +51 iTextSharp.text.pdf.Type1Font.WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms) +317 iTextSharp.text.pdf.FontDetails.WriteFont(PdfWriter writer) +296 iTextSharp.text.pdf.PdfWriter.AddSharedObjectsToBody() +180 iTextSharp.text.pdf.PdfWriter.Close() +86 iTextSharp.text.DocWriter.Dispose() +10
"bytes"数组应该在using语句内可访问,但似乎出现了错误。
我已尝试将foreach循环移动到using(writer ...)块内:
但我仍然收到相同的错误提示。
这是我的代码:无法访问已关闭的流。
//Create a byte array that will eventually hold our final PDF
Byte[] bytes;
List<TableObject> myTables = getTables();
TableObject currentTable = new TableObject();
//Boilerplate iTextSharp setup here
//Create a stream that we can write to, in this case a MemoryStream
using (MemoryStream ms = new MemoryStream())
{
//Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
using (Document doc = new Document(PageSize.A4, 10f, 10f, 10f, 0f))
{
foreach (TableObject to in myTables)
{
//Create a writer that's bound to our PDF abstraction and our stream
using (PdfWriter writer = PdfWriter.GetInstance(doc, ms))
{
if (!doc.IsOpen())
{
//Open the document for writing
doc.Open();
}
//Get the data from database corresponding to the current tableobject and fill all the stuff we need!
DataTable dt = getDTFromID(to._tableID);
Object[] genObjects = new Object[5];
genObjects = gen.generateTable(dt, currentTable._tableName, currentTable._tableID.ToString(), currentTable, true);
StringBuilder sb = (StringBuilder)genObjects[1];
String tableName = sb.ToString();
Table myGenTable = (Table)genObjects[0];
String table = genObjects[2].ToString();
using (StringReader srHtml = new StringReader(table))
{
//Parse the HTMLiTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
}
//should give empty page at the end, need to fix it later
doc.NewPage();
}
}
doc.Close();
}
//After all of the PDF "stuff" above is done and closed but **before** we
//close the MemoryStream, grab all of the active bytes from the stream
bytes = ms.ToArray();
}
//Now we just need to do something with those bytes.
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=Report_complete.pdf");
Response.BinaryWrite(bytes);
以下是我asp.net应用程序的完整堆栈跟踪:
[ObjectDisposedException: Cannot access a closed Stream.] System.IO.__Error.StreamIsClosed() +57 System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +11011171 iTextSharp.text.pdf.OutputStreamCounter.Write(Byte[] buffer, Int32 offset, Int32 count) +52 iTextSharp.text.pdf.PdfIndirectObject.WriteTo(Stream os) +53 iTextSharp.text.pdf.PdfBody.Write(PdfIndirectObject indirect, Int32 refNumber, Int32 generation) +100 iTextSharp.text.pdf.PdfBody.Add(PdfObject objecta, Int32 refNumber, Int32 generation, Boolean inObjStm) +385 iTextSharp.text.pdf.PdfWriter.AddToBody(PdfObject objecta, PdfIndirectReference refa) +51 iTextSharp.text.pdf.Type1Font.WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms) +317 iTextSharp.text.pdf.FontDetails.WriteFont(PdfWriter writer) +296 iTextSharp.text.pdf.PdfWriter.AddSharedObjectsToBody() +180 iTextSharp.text.pdf.PdfWriter.Close() +86 iTextSharp.text.DocWriter.Dispose() +10
"bytes"数组应该在using语句内可访问,但似乎出现了错误。
我已尝试将foreach循环移动到using(writer ...)块内:
//Create a byte array that will eventually hold our final PDF
//must be outside of the foreach loop (and everything else), because we store every single generated table in here for the final pdf!!
Byte[] bytes;
List<TableObject> myTables = getTables();
TableObject currentTable = new TableObject();
//Boilerplate iTextSharp setup here
//Create a stream that we can write to, in this case a MemoryStream
using (MemoryStream ms = new MemoryStream())
{
//Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
using (Document doc = new Document(PageSize.A4, 10f, 10f, 10f, 0f))
{
//Create a writer that's bound to our PDF abstraction and our stream
using (PdfWriter writer = PdfWriter.GetInstance(doc, ms))
{
//loop all tableobjects inside the document & the instance of PDFWriter itself!
foreach (TableObject to in myTables)
{
//only happens on the first run!
if (!doc.IsOpen())
{
//Open the document for writing
doc.Open();
}
//Get the data from database corresponding to the current tableobject and fill all the stuff we need!
DataTable dt = getDTFromID(to._tableID);
Object[] genObjects = new Object[5];
genObjects = gen.generateTable(dt, currentTable._tableName, currentTable._tableID.ToString(), currentTable, true);
StringBuilder sb = (StringBuilder)genObjects[1];
String tableName = sb.ToString();
Table myGenTable = (Table)genObjects[0];
String table = genObjects[2].ToString();
using (StringReader srHtml = new StringReader(table))
{
//Parse the HTML
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
}
//this will probably render a whole new page at the end of the file!! need to be fixed later!!!
doc.NewPage();
}
//After all of the PDF "stuff" above is done and closed but **before** we
//close the MemoryStream, grab all of the active bytes from the stream
bytes = ms.ToArray();
}
doc.Close();
}
}
//Now we just need to do something with those bytes.
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=ShiftReport_complete.pdf");
Response.BinaryWrite(bytes);
但我仍然收到相同的错误提示。
foreach
移动到using (PdfWriter writer...
内部。 - Chris Haasbytes = ms.ToArray();
和doc.Close();
这两行代码互换。 - mkl无法访问已关闭的流。
- Hack4Lifeforeach
循环,我使用了一个简单的for(int dummy = 1; dummy <5; dummy ++)
,而不是检索和添加一些数据表结构,我只是添加了new Paragraph(dummy.ToString())
。我也遇到了一个异常,这个异常可以通过不将PdfWriter
放入using
语句中来消除。 - mkl