2016-09-16 9 views
0

HTMLコードからPDF生成に関するクエリがあります。私はHTMLコードで書かれたテーブルを持っていて、iTextSharp.dllを使ってPDFライターでそれを解析したいのですが、私のウェブサイトの別のセクションで別のHTMLコンテンツと同じコードを使用しています。itextsharpを使用したPDF生成はすべて正常ですが、ファイルは生成されません。

以下は私のコードです。コメントをしてください。

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(); 
+1

iTextのバージョンは? 'HTMLWorker'は非推奨です。代わりに' XMLWorker'を使用してください。 –

+0

ここでやっていることが間違っているかどうか分かりたいです。私にお知らせください。これまで私のサイトの他の部分でも、このコードはうまく動作しており、適切な結果が得られています。 –

答えて

1

あなたが最初Responseのみ直後にクリアする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(); 

にPDFを作成する(のでスロー離れ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に書き込んで、byte[]としてPDFを入手し、Responseを初期化し、Content-Lengthヘッダーを配列の長さに設定してから、その配列を書き込んでください。


これまで述べてきたように、HTMLWorkerは実際には昔から推奨されていません。深刻な開発のためには、Amedeeのコメントと同じように、代わりにXMLWorkerを使用してください。

+0

こんにちは、あなたの答えに感謝します。しかし、あなたが期待していたように、私の問題はまだ解決されていません。あなたが言及した別の方法について知りたいです:配列を使う。 –

+0

@SwapnilJain [この質問](http://stackoverflow.com/q/30623068/1729265)のコードは、中間の 'byte []'を使っています。 – mkl

関連する問題