我想以PDF格式打印一页。但问题是在打印之前,我想扩展所有控件(GridView,Treeview ......)。
我使用Page.RenderControl(或Control.RenderControl)找到了一些解决方案,但我有一些错误说"一个页面只能有一个服务器端的Form标签。"。我理解错误(只需要添加一个表单)。但我原本以为RenderControl会写入新的Writer(而不是当前的)。
Dim stringWriter As New StringWriter()
Dim htmlWriter As New HtmlTextWriter(stringWriter)
Me.Page.RenderControl(htmlWriter)
要扩展控件,我必须更改属性然后渲染页面。一旦在PDF中呈现,我想让页面正常加载。 Response.End停止加载,页面为空白。
是否有(好的)替代方法来获取页面内容,更改内容(例如:grid.AllowPaging = False)并将其发送给流?
答案 0 :(得分:1)
尝试使用HtmlForm而不是Me.Page.RenderControl
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=this.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
HtmlForm frm = new HtmlForm();
GridView1.AllowPaging = false;
GridView1.Parent.Controls.Add(frm);
frm.Controls.Add(GridView1);
frm.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
Document PDFdoc = new Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F);
iTextSharp.text.html.simpleparser.HTMLWorker htmlparser = new iTextSharp.text.html.simpleparser.HTMLWorker(PDFdoc);
PdfWriter.GetInstance(PDFdoc, Response.OutputStream);
PDFdoc.Open();
htmlparser.Parse(sr);
PDFdoc.Close();
Response.Write(PDFdoc);
Response.End();