使用itextsharp生成pdf,一切都很好,但文件没有生成

本文关键字:文件 很好 生成 itextsharp pdf 使用 | 更新日期: 2023-09-27 18:07:16

我有一个与从HTML代码生成PDF相关的查询。我有一个用HTML代码编写的表格,我想使用iTextSharp在PDF编写器中解析它.dll,我一直在网站的另一个部分中使用相同的代码和不同的html内容,并且它工作绝对正常。

这是我下面的代码,请发表评论。

StringBuilder sb = new StringBuilder();
sb.Append("<table width='100%' cellspacing='5' cellpadding='3'>");
//sb.Append("<tr><td colspan=4><img src='logo.png' width='250px' height = '70px'/></td></tr>");
sb.Append("<tr><td></td><td colspan=2 align=center>JK Cement Works, Jharli</td><td></td></tr>");
sb.Append("<tr><td>Duplicate Tickets</td><td></td><td></td><td></td></tr>");
sb.Append("<tr><td>Print DateTime:</td><td>");
sb.Append(printDT.Text.ToString());
sb.Append("</td><td></td><td></td></tr>");
sb.Append("<tr><td></td><td></td><td></td><td></td></tr>");
sb.Append("<tr><td>Transaction Number</td><td>");
sb.Append(tNum.Text.ToString());
sb.Append("</td><td></td><td></td></tr>");
sb.Append("<tr><td>Truck Number</td><td>");
sb.Append(TruckNum.Text.ToString());
sb.Append("</td><td></td><td></td></tr>");
sb.Append("<tr><td>Product Code</td><td>");
sb.Append(pCode.Text.ToString());
sb.Append("</td><td>Product Name</td><td>");
sb.Append(pName.Text.ToString());
sb.Append("</td></tr>");
sb.Append("<tr><td>Supplier Code</td><td>");
sb.Append(sCode.Text.ToString());
sb.Append("</td><td>Supplier Name</td><td>");
sb.Append(sName.Text.ToString());
sb.Append("</td></tr>");
sb.Append("<tr><td>Transporter Code</td><td>");
sb.Append(tCode.Text.ToString());
sb.Append("</td><td>Transporter Name</td><td>");
sb.Append(tName.Text.ToString());
sb.Append("</td></tr>");
sb.Append("<tr><td>Challan Number</td><td>");
sb.Append(challanNum.Text.ToString());
sb.Append("</td><td>Challan DateTime</td><td>");
sb.Append(challanDT.Text.ToString());
sb.Append("</td></tr>");
sb.Append("<tr><td></td><td></td><td></td><td></td></tr>");
sb.Append("<tr><td colspan=2>Delivery Note Number</td><td></td><td></td></tr>");
sb.Append("<tr><td>Shift</td><td>");
sb.Append(shift.Text.ToString());
sb.Append("</td><td></td><td></td></tr>");
sb.Append("<tr><td></td><td></td><td></td><td></td></tr>");
sb.Append("<tr><td>IN DateTime</td><td>");
sb.Append(InDT.Text.ToString());
sb.Append("</td><td>Gross Weight</td><td>");
sb.Append(gWeight.Text.ToString());
sb.Append(" Tons</td></tr>");
sb.Append("<tr><td>Out DateTime</td><td>");
sb.Append(OutDT.Text.ToString());
sb.Append("</td><td>Tare Weight</td><td>");
sb.Append(tWeight.Text.ToString());
sb.Append(" Tons</td></tr>");
sb.Append("<tr><td></td><td></td><td>Net Weight</td><td>");
sb.Append(nWeight.Text.ToString());
sb.Append(" Tons</td></tr></table>");
StringReader sr = new StringReader(sb.ToString());
Document pdfDoc = new Document(PageSize.A4.Rotate(), 10f, 10f, 10f, 0f);                        
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();                        
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=InvoiceSJ.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);                        
Response.End();

使用itextsharp生成pdf,一切都很好,但文件没有生成

您首先将 PDF 写入Response.OutputStream

Document pdfDoc = new Document(PageSize.A4.Rotate(), 10f, 10f, 10f, 0f);                        
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close(); 

只是在之后立即清除Response(因此扔掉 PDF(

Response.Clear();

并最终输出pdfDoc

Response.Write(pdfDoc);  

这没有意义,因为 iTextSharp Document 类不保存 PDF 文档,它只是一个前端类,您可以通过它为 PDF 提供内容。此内容被转发到PdfWriter该该尽快将 PDF 格式的内容写入其输出流。

因此,请尝试以下操作:

[... create StringReader sr ...]
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=InvoiceSJ.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Document pdfDoc = new Document(PageSize.A4.Rotate(), 10f, 10f, 10f, 0f);                        
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();
Response.End();

根据浏览器和版本,可能需要Content-Length标头。因此,如果上述方法还不适合您,请尝试将PDF写入MemoryStream并将PDF作为byte[]获取,然后初始化Response,使用数组的长度设置Content-Length标头,然后写入该数组。


话虽如此,HTMLWorker确实在很久以前就被弃用了;对于严肃的开发,你应该改用XMLWorker,就像Amedee评论的那样。