簡體   English   中英

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

[英]pdf generation using itextsharp everything is fine but file is not getting generated

我有一個與從HTML代碼生成PDF相關的查詢。 我有一個用HTML代碼編寫的表格,我想使用iTextSharp.dll在PDF編寫器中對其進行解析,在我網站的另一部分中,我一直在使用具有不同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();

您首先將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說, HTMLWorker實際上早已被棄用; 對於認真的開發,您應該改用XMLWorker ,就像Amedee所評論的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM