1

不确定我是否跳过了代码中的步骤,我使用的是 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);
        }
4

1 回答 1

0

我只是用了差不多两个小时的相同症状,终于找出了问题的原因。我猜你可能已经想通了(因为这个问题是 5 个月前提出的),但我想我会发布答案,以防其他人遇到同样的问题。

当您创建您的PdfWriter时,您传入流(在您的情况下Response.OutputStream),该流将成为生成的 PDF 内容的目的地。当PdfWriter将内容写入流时,流位置会相应增加。当编写器完成时,流位置位于内容的末尾,这是有道理的,因为任何进一步的 write 调用都应该PdfWriter从中断的地方继续。

问题在于,当 MVC 管道获取Response.OutputStream(在您的方法返回之后)并尝试读取它以将其内容发送到客户端(或者通常,每当使用 PDF 目标流时),流位置位于内容,这意味着对于消费者来说,流似乎是空的,因此是空的 PDF 输出。

为了解决这个问题,只需在完成写入后立即重置流的位置,然后再尝试读取它。在你的情况下插入:

Response.OutputStream.Position = 0;

在带有 的行之后xmlParse.Flush(),因为这是将写入流的最后一行。

于 2014-11-18T23:57:21.923 回答