You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:22:32