加载 PDF 文档时出错 - iTextSharp PDF
Error loading the PDF Document - iTextSharp PDF
我在 ASP.NET C# 中使用 iTextSharp 生成了一个 PDF 文件。
我尝试为多个元素生成标题 + table。在我想开始一个新页面的每个元素之后。我使用 doc.NewPage()
执行此操作,但是当我生成 PDF 文件时,打开文件时出现以下错误:
Error loading the PDF document
当我尝试在最新版本 Google Chrome 中打开 PDF 文件时出现此错误。当我尝试在 Adobe Reader 中打开文件时,我收到以下错误消息:
There was an error opening this document. The file is damaged and could not be repaired.
PDF文件的大小也只有1kb...
这是我如何生成文件的代码:
//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
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
//Open the document for writing
doc.Open();
//writer.CloseStream = false;
//loop all tableobjects inside the document & the instance of PDFWriter itself!
foreach (TableObject to in myTables.ToList())
{
//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 contains a valid html string, which works in the generate function for a single page document
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);
如何解决这个问题,以便在打开 PDF 文件时摆脱错误消息?
您的代码像这样完成创建 PDF:
bytes = ms.ToArray();
doc.Close();
这是错误的顺序!在 doc.Close()
期间,待处理的 PDF 对象和 PDF 预告片被写入。当您在此之前获取 byte[]
时,您的结果 PDF 缺少这些片段。
反之亦然:
doc.Close();
bytes = ms.ToArray();
我在 ASP.NET C# 中使用 iTextSharp 生成了一个 PDF 文件。
我尝试为多个元素生成标题 + table。在我想开始一个新页面的每个元素之后。我使用 doc.NewPage()
执行此操作,但是当我生成 PDF 文件时,打开文件时出现以下错误:
Error loading the PDF document
当我尝试在最新版本 Google Chrome 中打开 PDF 文件时出现此错误。当我尝试在 Adobe Reader 中打开文件时,我收到以下错误消息:
There was an error opening this document. The file is damaged and could not be repaired.
PDF文件的大小也只有1kb...
这是我如何生成文件的代码:
//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
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
//Open the document for writing
doc.Open();
//writer.CloseStream = false;
//loop all tableobjects inside the document & the instance of PDFWriter itself!
foreach (TableObject to in myTables.ToList())
{
//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 contains a valid html string, which works in the generate function for a single page document
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);
如何解决这个问题,以便在打开 PDF 文件时摆脱错误消息?
您的代码像这样完成创建 PDF:
bytes = ms.ToArray();
doc.Close();
这是错误的顺序!在 doc.Close()
期间,待处理的 PDF 对象和 PDF 预告片被写入。当您在此之前获取 byte[]
时,您的结果 PDF 缺少这些片段。
反之亦然:
doc.Close();
bytes = ms.ToArray();