嗨,我正在尝试使用asp.net应用程序获取当前页面源代码。我发现了一段将html转换为pdf的代码,但为了将我的页面转换为pdf,我需要获取页面的html代码。我怎样才能将它们作为字符串?我的简单代码是这样的:
string sPathToWritePdfTo = Server.MapPath("") + "/pdf_dosya_adi.pdf";
System.Text.StringBuilder sbHtml = new System.Text.StringBuilder();
sbHtml.Append("<html>");
sbHtml.Append("<body>");
sbHtml.Append("<font size='14'>HTML den PDF çevirme Test</font>");
sbHtml.Append("<br />");
sbHtml.Append("Body kısmında yazacak yazı");
sbHtml.Append("</body>");
sbHtml.Append("</html>");
using (System.IO.Stream stream = new System.IO.FileStream
(sPathToWritePdfTo, System.IO.FileMode.OpenOrCreate))
{
Pdfizer.HtmlToPdfConverter htmlToPdf = new Pdfizer.HtmlToPdfConverter();
htmlToPdf.Open(stream);
htmlToPdf.Run(sbHtml.ToString());
htmlToPdf.Close();
}
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "friendlypdfname.pdf"));
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.WriteFile(sPathToWritePdfTo);
HttpContext.Current.Response.End();
如果我可以从我的asp.net页面上获取html代码,我将页面的所有行放入 sbHtml.Append( “”); 使用for循环代码,这将解决我的问题。
答案 0 :(得分:5)
一种可能性是使用WebClient将HTTP请求发送到给定页面并获取生成的HTML:
using (var client = new WebClient())
{
string html = client.DownloadString("http://example.com/somepage.aspx");
}
这种方法的缺点是它发送了一个额外的HTTP请求。
另一种可能性是将WebForm直接呈现为字符串:
using (var writer = new StringWriter())
{
Server.Execute("SomePage.aspx", writer);
string html = writer.GetStringBuilder().ToString();
}
答案 1 :(得分:1)
您可以创建隐藏字段,将当前html添加到其中,并且asyc回发能够从事件中检索它。假设您正在渲染页面,可能是编辑或更改数据,然后单击按钮下载pdf。
//隐藏输入字段
<input type="hidden" runat="server" id="hdn_container" />
//带有客户端事件和服务器端事件的按钮。应该包装在UpdatePanel中。
<asp:Button ID="btnDownload" runat="server" OnClientClick="refreshHtml();" OnClick="btnDownloadButton_Click" Text="Download Pdf"></asp:Button>
//页面底部的脚本标记
<script language="javascript" type="text/javascript">
function refreshHtml() {
document.getElementById('<%= hdn_container.ClientID %>').value = document.head.innerHTML + document.body.innerHTML;
}
</script>
//然后在c#中,您可以从隐藏字段中获取页面html。
hdn_container.Value
确保为脚本管理器设置适当的AsyncPostBackTimeout。在你的webconfig中,有一个合适的maxRequestLength和executionTimeout。