iTextSharp 7实为iText7,需安装iText7、kernel、layout包并改用iText.Kernel.Pdf等命名空间;中文显示需嵌入中文字体;表格错位应设列宽、内边距和SetKeepTogether;大数据量导出须分段写入、拆表、复用对象并优化数据加载。

iTextSharp 7 的命名空间和包名已经变了
现在用 iTextSharp 其实是旧版(5.x),新版(7.x)叫 iText7,NuGet 包名是 iText7,不是 iTextSharp。装错包会导致 using iTextSharp.text; 报红,编译直接失败。
实操建议:
- 卸载所有
iTextSharp相关包(包括iTextSharp.LGPLv2.Core这类非官方移植) - NuGet 安装官方包:
iText7、iText7.kernel、iText7.layout(导出报表至少需要这三个) - 命名空间全换成
using iText.Kernel.Pdf;、using iText.Layout.Document;等,旧的iTextSharp.text.*不再存在
中文无法显示:字体没嵌入或没指定
生成 PDF 后中文全是方块或空白,不是编码问题,是字体缺失。iText7 默认不带中文字体,也不自动嵌入系统字体。
实操建议:
- 必须显式加载一个支持中文的字体文件(如
simhei.ttf或NotoSansCJKsc-Regular.otf) - 用
PdfFontFactory.CreateFont()加载,并传入TrueType类型和EmbeddingStrategy.FORCE_EMBEDDED - 创建
Document时传入带字体的Renderer,或对每个Paragraph单独设字体:new Paragraph("测试").SetFont(pdfFont)
示例关键行:
PdfFont font = PdfFontFactory.CreateFont("simhei.ttf", "Identity-H", true);
表格导出内容错位或换行异常
用 Table 类加 Cell 填数据时,文字挤在一起、列宽失控、跨页后表头消失——常见于没设 SetKeepTogether(true) 或忽略单元格默认边距/内边距。
实操建议:
- 每列宽度用
new float[]{100, 200, 150}显式构造,避免靠内容撑开导致错乱 - 对含长文本的
Cell调用SetPadding(2f)控制内边距,否则默认值会让文字贴边 - 关键表格(如报表主表)加
table.SetKeepTogether(true),防止跨页断开 - 表头重复?iText7 不自动处理,得手动在每页开头重绘表头,或改用
Canvas+PdfPage底层绘制
生成大文件卡死或内存爆掉
导出万行数据时,Document.Add(table) 执行慢、GC 频繁、甚至 OutOfMemoryException——因为 iText7 默认把整个文档结构保留在内存里,直到 document.Close() 才写磁盘。
实操建议:
- 启用“分段写入”:构造
PdfWriter时传入new WriterProperties().SetFullCompressionMode(true) - 对超大表格,拆成多个
Table分批Add(),中间调用document.Flush()强制刷出部分数据 - 避免在循环里反复 new
Paragraph或Cell后不复用;能复用样式就用Style对象统一管理
真正卡住的地方往往不是 PDF 生成逻辑本身,而是你把数据库查出来的 List<DataRow> 全 load 进内存再遍历——这步该优化,不是 PDF 库的问题。










