将Panel保存为PDF不起作用也不会出错

我正在尝试使用ITextSharp将面板保存为pdf。 当我设置断点并进行调试时,代码会停止在这行代码上,但是它不会出现错误而只是停止。

 if (IsPostBack) { Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=Quote.pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); StringWriter sw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(sw); **Panel1.RenderControl(hw);** StringReader sr = new StringReader(sw.ToString()); Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f); HTMLWorker htmlparser = new HTMLWorker(pdfDoc); PdfWriter.GetInstance(pdfDoc, Response.OutputStream); pdfDoc.Open(); htmlparser.Parse(sr); pdfDoc.Close(); Response.Write(pdfDoc); Response.End(); } 

在面板中我有文本框,标签和GridView。

你有几个问题。 如果您正在获取The document has no pages消息,这意味着没有向PDF添加内容,这几乎肯定意味着RenderControl方法存在问题,而与iTextSharp无关。 另一个问题是您正在写Response.OutputStream以及使用Response.Write(pdfDoc)输出文字文档。 你只需要做前者,我真的不确定后者会发生什么。

The document has no pages消息也可能意味着iTextSharp无法找到任何内容来创建内容。 所以你可能有有效的HTML,但iTextSharp只是不知道如何处理它。 这可能不是这种情况,但我不得不提到它。

我打算将代码分解为帮助调试的步骤。 前两个块将控件转换为HTML,然后完整性检查它以确保我们有一些东西。 如果您有任何问题,您应该检查buf的内容。

第三个块从MemoryStream创建PDF,然后将其转储到字节数组中,而不是直接写入Response.OutputStream 。 虽然写入Response.OutputStream没有任何错误,但您经常会发现您正在吞咽错误,而且一般来说调试要困难得多。 完成此块后,您应检查bytes以确保它具有某些内容。

最后一个块最后推送到浏览器。

 //Convert our control to HTML string buf; using (var sw = new StringWriter()) { using (var hw = new HtmlTextWriter(sw)) { Panel1.RenderControl(hw); } buf = sw.ToString(); } //Sanity check if (String.IsNullOrWhiteSpace(buf)) { throw new ApplicationException("No content found"); } //Create our PDF and get a byte array byte[] bytes; using (var ms = new MemoryStream()) { using (var pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f)) { using (var writer = PdfWriter.GetInstance(pdfDoc, ms)) { pdfDoc.Open(); using (var htmlparser = new HTMLWorker(pdfDoc)) { using (var sr = new StringReader(buf)) { htmlparser.Parse(sr); } } pdfDoc.Close(); } } bytes = ms.ToArray(); } //Output the PDF Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=Quote.pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite(bytes); Response.End();