使用iTextSharp在C#中从HTML生成并自动下载PDF失败
我帮你排查下这段iTextSharp生成PDF代码里的几个关键问题,应该能解决你生成失败的问题:
1. 首先修正HTML语法错误
你写的TempHtml里有明显的语法问题:<bodyHello World是残缺标签,而且不必要的</>转义也会干扰HTML解析。修正后的HTML应该是:
string TempHtml = "<html><head><title></title></head><body>Hello World</body></html>";
2. 补充缺失的PDF核心生成步骤
你的代码片段只初始化了Document,但遗漏了iTextSharp生成PDF的关键流程。下面是完整可运行的修正代码:
byte[] bytes = null; // 用using包裹流,确保资源正确释放 using (MemoryStream memoryStream = new MemoryStream()) { RetailerInvoice Data = new RetailerInvoice(); try { var _ResultId = dataTypeConverter.ConvertToGuid(RetailerId); string TempHtml = "<html><head><title></title></head><body>Hello World</body></html>"; using (StringReader sr = new StringReader(TempHtml)) { Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f); // 关联PdfWriter和内存流 PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream); pdfDoc.Open(); // 用XMLWorkerHelper解析HTML(比旧版HTMLWorker更稳定,支持更多HTML/CSS) XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr); pdfDoc.Close(); // 将流转换为字节数组,用于后续下载 bytes = memoryStream.ToArray(); } // 这里添加下载逻辑示例(如果是Web环境) // Response.ContentType = "application/pdf"; // Response.AddHeader("content-disposition", "attachment;filename=RetailerInvoice.pdf"); // Response.BinaryWrite(bytes); // Response.End(); } catch (Exception ex) { // 建议捕获异常并记录日志,方便排查具体问题 // 比如HTML中存在iTextSharp不支持的标签/样式,都会抛出异常 throw; } }
3. 额外注意事项
- 确保你引用了
iTextSharp和iTextSharp.xmlworkerNuGet包(XMLWorker是解析HTML的核心依赖,旧版HTMLWorker已被废弃); - iTextSharp对HTML/CSS的支持有限,复杂样式(比如flex布局、某些CSS选择器)可能无法正常解析,需要简化HTML结构;
- 一定要用
using语句包裹所有实现IDisposable的对象(流、阅读器等),避免资源泄漏导致流无法正确读取。
如果还是生成失败,建议捕获异常查看具体错误信息,比如是否有未处理的HTML标签、字体缺失等问题,这些都是常见的PDF生成失败原因。
内容的提问来源于stack exchange,提问作者Amit Dhumal
相关产品推荐
相关产品推荐

