我不确定是否跳过代码中的步骤,我使用的是ItextSharp版本5.5.1和XML Worker版本5.5.1。 doc.Close抛出异常"文档没有页面",但我看了sw.toString(它有html内容)。
private void ExporttoPDF()
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=RequestSummaryReport.pdf");
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.ContentType = "application/pdf";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
var doc = new Document(PageSize.A3, 45, 5, 5, 5);
PdfWriter writer = PdfWriter.GetInstance(doc, Response.OutputStream);
doc.Open();
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser xmlParse = new XMLParser(true, worker);
pnlReport.RenderControl(htw);
StringReader sr = new StringReader(sw.ToString());
xmlParse.Parse(sr);
xmlParse.Flush();
doc.Close();
Response.Write(doc);
}
答案 0 :(得分:0)
我只花了近两个小时出现相同的症状,最后找出了问题的原因。我猜你可能已经弄明白了(因为5个月前问了这个问题)但是我想我会发布答案以防有其他人遇到同样的问题。
创建PdfWriter
时,您会传入要生成的PDF内容的目标流(在您的情况下为Response.OutputStream
)。当PdfWriter
将内容写入流时,流位置会相应增加。当作者完成时,流位置在内容的末尾,这是有道理的,因为任何进一步的写入调用应该在PdfWriter
停止的地方继续。
问题是,当MVC管道获取Response.OutputStream
(在您的方法返回之后)并尝试读取它以将其内容发送到客户端(或者通常,每当使用PDF目标流时),流位置位于内容的末尾,这意味着对于消费者来说,流似乎是空的,因此是空的PDF输出。
要解决此问题,只需在完成写入后立即重置流的位置,然后再尝试从中读取数据。在您的情况下插入:
Response.OutputStream.Position = 0;
在xmlParse.Flush()
行之后,因为这是将写入流的最后一行。