ASP.NET MVC使用iTextSharp导出视图为PDF时提示文档无页面报错
iTextSharp导出PDF报
The document has no pages错误解决方案 核心错误原因
该报错是iTextSharp的内置校验逻辑触发的:调用Document.Close()方法关闭PDF文档时,文档内没有写入任何有效可见内容,就会抛出该异常。
ASP.NET MVC场景下的常见排查点
- 确认绑定视图的列表数据不为空:如果控制器传递给视图的列表是null或者空集合,视图没有输出任何可见内容,就会导致PDF内容为空
- 确认视图渲染结果有效:先捕获视图渲染后的完整HTML字符串,检查字符串不是空白内容,也不是仅包含无内容的空标签
- 确认iTextSharp写入逻辑正确:
- 必须在调用
Document.Open()之后,Document.Close()之前,完成HTML内容到PDF文档的写入操作,不能跳过写入步骤直接关闭文档 - 避免使用iTextSharp解析器不支持的HTML标签、CSS样式,全部内容都用了不支持的样式/标签也会被判定为空内容
- 必须在调用
参考实现代码
控制器导出逻辑示例
public ActionResult ExportListToPdf() { // 第一步:获取要导出的列表数据,提前校验非空 var exportList = GetYourListData(); if (exportList == null || !exportList.Any()) { return Content("无有效可导出的数据"); } // 第二步:将视图渲染为HTML字符串 string htmlContent = RenderViewToString("ExportListView", exportList); // 可在此处加断点确认htmlContent有实际内容 if (string.IsNullOrWhiteSpace(htmlContent)) { return Content("视图渲染结果为空,无法生成PDF"); } // 第三步:生成PDF文档 Document pdfDoc = new Document(); MemoryStream ms = new MemoryStream(); PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, ms); pdfDoc.Open(); // 写入HTML内容到PDF,此处用XML Worker组件解析HTML using (var strReader = new StringReader(htmlContent)) { XMLWorkerHelper.GetInstance().ParseXHtml(pdfWriter, pdfDoc, strReader); } pdfDoc.Close(); // 返回PDF文件供下载 return File(ms.ToArray(), "application/pdf", "列表导出结果.pdf"); } /// <summary> /// 辅助方法:将指定视图渲染为字符串 /// </summary> private string RenderViewToString(string viewName, object model) { ViewData.Model = model; using (var stringWriter = new StringWriter()) { var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null); var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, stringWriter); viewResult.View.Render(viewContext, stringWriter); viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); return stringWriter.GetStringBuilder().ToString(); } }
内容的提问来源于stack exchange,提问作者shai guy
相关产品推荐
相关产品推荐

