使用itextSharp和sharepoint visual webpart编码我将当前的aspx页面转换为pdf,但我无法转换。我发现问题出在这一行" this.Page.RenderControl(hw)"如果我对此行发表评论,我会得到"该文档没有页面"例外情况如果我取消注释这行,我得到"一个页面只能有一个服务器端表单标签"错误。我怎么处理这个?请有人帮助我..
protected void BtnSubmit_Click(object sender, EventArgs e)
{
try
{
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=UserDetails.pdf");
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
//this.Page.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0.0f);
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();
HttpContext.Current.Response.Write(pdfDoc);
HttpContext.Current.Response.End();
}
catch (Exception exp)
{
}
}
protected override void Render(HtmlTextWriter writer)
{
// Ensure that the control is nested in a server form.
if (Page != null)
{
Page.VerifyRenderingInServerForm(this);
}
base.Render(writer);
}
答案 0 :(得分:1)
由于ASP.NET Web表单页面生命周期的工作方式(sharepoint非常相似),您需要将PDF生成代码移动到Render
阶段。 IIRC,这就是为什么你看到" A页面只能有一个服务器端表格标签"例外 - 按钮点击事件处理程序中的Page.RenderControl()
调用位于Render()
阶段之前,基本上会导致两次呈现页面内容。
无论如何,这是一个简单的工作示例,使用XMLWorker
来帮助您入门:
首先确保包含这些名称空间:
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.xml;
using iTextSharp.tool.xml;
然后:
// flag when page renders normally / when you're sending PDF
private bool _convertToPdf;
// set _convertToPdf in your BtnSubmit_Click() - I never use AutoEventWireup
public void ProcessPage(object sender, CommandEventArgs e) {
_convertToPdf = true;
}
protected override void Render(HtmlTextWriter writer) {
if (!_convertToPdf) { base.Render(writer); }
else {
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=thisPage.pdf");
var sb = new StringBuilder();
using (var sw = new StringWriter(sb)) {
using (var htmlTextWriter = new HtmlTextWriter(sw)) {
base.Render(htmlTextWriter);
using (var document = new Document()) {
var pdfWriter = PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
using (var stringReader = new StringReader(sb.ToString())) {
XMLWorkerHelper.GetInstance().ParseXHtml(
pdfWriter, document, stringReader
);
}
}
}
}
Response.End();
}
对于与您的aspx
页面相比,PDF显示的效果并不高。 iTextSharp并不是一个完整的HTML到PDF转换器。
答案 1 :(得分:0)
您需要添加以下行:
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
printableArea.RenderControl(hw); // Here printable area is nothing but div on aspx page with id and runaat="server" tag.
StringReader sr = new StringReader(sw.ToString());
string strHtml = sr.ReadToEnd();
sr.Close();