Не вижу, что находится под вашим Panel
управлением сервером, но ваш код выглядит нормально.И если Panel содержит только простой HTML, необязательно добавлять объекты HTML IElement
по отдельности (при вызове HTMLWorker.ParseToList()
) к объекту Document
, как предложено @VahidN.Вот простой пример - .aspx
file:
<%@ Page Language='C#' AutoEventWireup='true' CodeFile='panelTest.aspx.cs' Inherits='panelTest' %>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head runat='server'><title></title></head>
<body><form id='form1' runat='server'>
<asp:Panel ID='testPanel' runat='server'>
<h1>A H1 Heading</h1>
<table width='100%' border='1' align='center'
cellpadding='4' cellspacing='0'
>
<tr><td>TABLE ROW 1: CELL 1</td></tr>
<tr><td>TABLE ROW 2: CELL 1</td></tr>
</table>
<p>A Paragraph with <strong>bold</strong> and <em>italic</em> text.</p>
</asp:Panel>
<asp:Button runat='server'
oncommand='process'
text='Convert HtmlControl to PDF'
/>
</form></body></html>
Файл с выделенным кодом:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
public partial class panelTest : Page {
protected void process(object sender, CommandEventArgs e) {
string attachment = "attachment; filename=test.pdf";
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/pdf";
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
htmlWriter.AddStyleAttribute("font-size", "10pt");
htmlWriter.AddStyleAttribute("color", "Black");
testPanel.RenderControl(htmlWriter);
using (Document document = new Document()) {
PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
StringReader stringReader = new StringReader(stringWriter.ToString());
HTMLWorker htmlworker = new HTMLWorker(document);
htmlworker.Parse(stringReader);
}
Response.End();
}
}
С учетом сказанного - если Panel содержит дочерние элементы управления или сложный HTML (изображения дляпример) у вас будут проблемы.Вы должны принять во внимание, что HTMLWorker является очень простым анализатором.