我在这里遇到了一个复杂的问题。
上下文: 我正在编辑一个表单引擎项目,它根据每个请求的XML定义动态创建它的控件,使用Aspose.PDF添加PDF生成功能。简而言之,表单引擎作为一组控件,作为填写表单(文本框,电话号码,日期控件等)的基本功能,每个控件及其属性在xml文件中定义,并对应于xml架构。现在,当表单完成时,有一个formRepeater控件,用于检索先前填充的页面并格式化数据以便在Web浏览器中打印。我必须将其替换为生成pdf文件。
我做了什么: 我添加了一个名为GeneratePdf的新抽象方法,所有FormControl都必须实现,我为我的控件容器PreRender事件中的每个控件和子控件调用此方法。该方法将根据每个控件而有所不同,但这里是现在基本的
public override void GeneratePdf(Aspose.Pdf.Generator.Pdf file)
{
//Add the control HTML in a new section of the PDF File
var section = file.Sections.Add();
var sb = new StringBuilder();
var writer = new HtmlTextWriter(new StringWriter(sb));
this.RenderControl(writer);
var html = new Aspose.Pdf.Generator.Text(section, sb.ToString());
html.IsHtmlTagSupported = true;
section.Paragraphs.Add(html);
}
我的问题: 我正在使用Stringbuilder成功检索我的控件的HTML,但如果控件作为标准ASP.NET控件在其中,则不会呈现子控件的HTML。为什么呢?
谢谢,
答案 0 :(得分:2)
RenderControl将子控件HTML呈现为sb字符串编写器。
但是,http://www.aspose.com/docs/display/pdfnet/Text+Constructor+Overload_3 Aspose Text不会自动为每个子控件创建段。它期望传递给它的字符串是单个(和当前)段。
要添加控件的子控件,您需要递归调用/生成每个子控件。因此,您需要重新构建上面的代码。