如何使用IText 7缩小“Section 1”与“Alert”段落间的行间距?
为什么你调了间距根本没反应
三个实打实的代码和认知问题,不解决怎么改参数都没用:
- 操作对象完全错了:你在循环里自己new了个
contents的Paragraph对象,对着它设了半天字号、颜色、行高,但这个对象从始至终都没被加到PDF里。最后写到文档里的是HtmlConverter.ConvertToElements转出来的独立element——相当于你给同事穿了一身新衣服,最后去见客户的是另一个人,设置当然完全不生效。 - 没搞懂间距到底从哪来:
Section 1和Alert对应h3、h4标签转出来的块元素,iText7给这类标题默认带了好大一段段前距、段后距。两个标题中间的空白,十有八九是这个自带边距撑出来的,跟段落自身的行高半毛钱关系没有。你之前只调行高,连块元素的上下边距碰都没碰,当然缩不动那俩标题的距离。 - 参数设成了错误值:你把
*MultipliedLeading*设成了0.0f,这个参数的意思是行高等于字号的倍数,0倍的行高会让上下两行的字完全叠在一起,根本不是收紧间距的效果,是实打实的渲染bug。
正确的改法
1. 把属性设到真正要写进文档的元素上
别整那些没用的中间对象,拿到HTML转换器输出的每个element,先判断类型,直接给这个实际要用到的元素改属性,改完直接加进文档,效果才会出来。
2. 两个参数一起调,才能缩紧标题间距
要缩小h3和h4的空隙,光调行高不够,得同时改:
- 给上面的h3块,用
SetMarginBottom()把默认的十几磅段后距改成你要的小值,比如2磅 - 给下面的h4块,用
SetMarginTop()把它自带的默认上边距改成0或者极小值 - 两个块的行高设成1.0~1.2倍字号,保证字不重叠的前提下尽量紧凑
3. 修正后的可运行代码参考
if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { string htmlContent = dt.Rows[i]["contents"].ToString(); // 转换HTML为可渲染元素列表 List<IElement> lst = HtmlConverter.ConvertToElements(htmlContent).ToList(); for (int j = 0; j < lst.Count; j++) { IBlockElement element = (IBlockElement)lst[j]; // 只对Paragraph类型的块元素做属性修改 if (element is Paragraph para) { // 匹配h3对应的Section内容块 if (para.GetText().StartsWith("Section")) { para.SetFontSize(12) .SetBold() .SetFontColor(ColorConstants.BLUE) .SetMultipliedLeading(1.0f) // 行高为字号的1倍,紧凑不重叠 .SetMarginTop(0) // 清除h3默认的上边距 .SetMarginBottom(2); // 把h3的段后距缩到2磅 } // 匹配h4对应的Alert内容块 else if (para.GetText().StartsWith("- Alert")) { para.SetFontSize(10) .SetBold() .SetFontColor(ColorConstants.BLACK) .SetMultipliedLeading(1.0f) .SetMarginTop(0) // 清除h4默认的上边距 .SetMarginBottom(4); } // 普通正文内容的设置 else { para.SetFontSize(10) .SetFontColor(ColorConstants.BLACK) .SetMultipliedLeading(1.2f) .SetMarginTop(2) .SetMarginBottom(2); } } // 把调整好属性的元素加入文档 document.Add(element); } } dest = filename.ToString(); }
更省心的优化方式
如果内容里的h3、h4很多,不用循环逐行判断元素类型,可以在调用HTML转换器时传入自定义CSS规则,直接覆盖iText7内置的标题标签默认样式,一次设置就能批量改完所有标题的边距和行高,比逐元素判断省事很多。
提醒:千万别把行高参数设为0,会导致文字完全叠在一起,出现渲染异常。
内容的提问来源于stack exchange,提问作者Edward Sheriff Curtis
相关产品推荐
相关产品推荐

