iTextSharp中STRIKETHRU仅部分文本失效问题求助(.NET)
问题原因及解决办法
问题根源
你用Phrase.Add()或AddSpecial()嵌套Phrase的方式存在逻辑错误:Phrase是带有默认字体属性的文本容器,其样式会全局作用于内部所有内容。当你将带STRIKETHRU样式的Phrase加到另一个Phrase中时,整个组合后的Phrase会继承删除线属性,导致所有文本都被加上删除线。
解决办法
放弃嵌套Phrase,改用Chunk构建混合样式文本。Chunk是iTextSharp中最小的独立样式单元,每个Chunk的字体属性互不干扰,能精准控制局部文本的样式。
修改后的示例代码
using iTextSharp.text; using iTextSharp.text.pdf; // 定义字体样式 var normalFont = new Font(Font.HELVETICA, 20, Font.NORMAL); var strikethroughFont = new Font(Font.HELVETICA, 10, Font.STRIKETHRU); // 用Chunk创建不同样式的文本片段 var normalChunk1 = new Chunk("0123456789", normalFont); var strikeChunk = new Chunk("0123456789", strikethroughFont); var normalChunk2 = new Chunk("0123456789", normalFont); // 组合Chunk到同一个Phrase中 var mixedStylePhrase = new Phrase(); mixedStylePhrase.Add(normalChunk1); mixedStylePhrase.Add(strikeChunk); mixedStylePhrase.Add(normalChunk2); // 构建PDF表格 PdfPTable datatable1 = new PdfPTable(1); datatable1.TotalWidth = 700f; datatable1.LockedWidth = false; datatable1.DefaultCell.Border = Rectangle.NO_BORDER; datatable1.AddCell(" "); datatable1.AddCell(mixedStylePhrase); // 仅中间片段带删除线 datatable1.AddCell(" "); datatable1.AddCell(new Phrase(strikeChunk)); datatable1.AddCell(" "); datatable1.AddCell(new Phrase(normalChunk1)); // 其余单元格逻辑按需保留
原理说明
Chunk的样式是完全独立的,每个Chunk可以单独设置字体、大小、装饰线等属性。将不同样式的Chunk添加到同一个Phrase中,Phrase只会作为容器拼接内容,不会覆盖单个Chunk的样式,从而实现仅对指定文本片段添加删除线的效果。
内容的提问来源于stack exchange,提问作者kolek
相关产品推荐
相关产品推荐

