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

升级至iText 7(C#)后,如何为表单字段添加删除线效果

在iText 7中为表单字段添加删除线效果

我之前帮团队把iTextSharp项目升级到iText7时,刚好碰到过表单字段加删除线的需求,这里给你两种靠谱的实现方式,对应你提到的两种思路:

方案1:手动绘制带删除线的表单字段外观

iText7不再提供直接带删除线的Font对象,但可以通过自定义字段外观的方式,先绘制文本再叠加删除线,效果和旧版本一致:

using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Xobject;
using iText.Forms;
using iText.Forms.Fields;
using iText.Kernel.Geom;

// 初始化文档和表单
PdfDocument pdfDocument = new PdfDocument(new PdfWriter("output.pdf"));
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDocument, true);

// 1. 定义基础字体和字号,对应你旧代码里的normalBase
PdfFont baseFont = PdfFontFactory.CreateFont(StandardFonts.HELVETICA, PdfEncodings.WINANSI, true);
float fontSize = 11f;

// 2. 创建或获取目标表单字段(这里以创建新字段为例)
Rectangle fieldRect = new Rectangle(100, 700, 200, 20);
TextField textField = new TextField(pdfDocument, fieldRect, "strikethru_field");
textField.SetValue("需要加删除线的内容");
PdfFormField field = textField.GetField();
form.AddField(field);

// 3. 生成带删除线的自定义外观
PdfDictionary appearanceDict = new PdfDictionary();
PdfStream normalAppearance = new PdfStream();
PdfCanvas canvas = new PdfCanvas(normalAppearance, pdfDocument);

// 设置画布边界
normalAppearance.Put(PdfName.BBox, new PdfArray(new float[] { 
    fieldRect.GetLeft(), fieldRect.GetBottom(), 
    fieldRect.GetRight(), fieldRect.GetTop() 
}));
normalAppearance.Put(PdfName.Type, PdfName.XObject);
normalAppearance.Put(PdfName.Subtype, PdfName.Form);

// 绘制字段文本
string fieldValue = field.GetValueAsString();
float textWidth = baseFont.GetWidth(fieldValue, fontSize);
// 计算文本居中位置(可根据需求调整)
float textX = fieldRect.GetLeft() + (fieldRect.GetWidth() - textWidth) / 2;
float textY = fieldRect.GetBottom() + (fieldRect.GetHeight() - fontSize) / 2;

canvas.SetFontAndSize(baseFont, fontSize);
canvas.BeginText()
      .MoveText(textX, textY)
      .ShowText(fieldValue)
      .EndText();

// 绘制删除线:调整strikethruY可以改变删除线的垂直位置
float strikethruY = textY + fontSize / 3;
canvas.SetLineWidth(0.5f)
      .MoveTo(textX, strikethruY)
      .LineTo(textX + textWidth, strikethruY)
      .Stroke();

// 将自定义外观应用到字段
appearanceDict.Put(PdfName.N, normalAppearance);
field.GetWidgets()[0].SetAppearance(appearanceDict);

pdfDocument.Close();

方案2:使用TextStyle定义删除线样式(更简洁的写法)

如果你更倾向于用样式化的方式管理文本效果,可以使用iText7的TextStyle来定义删除线,再通过Paragraph渲染到字段外观中:

using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
// 其他命名空间和方案1一致

// 初始化文档和表单部分和方案1相同...

// 定义带删除线的文本样式
TextStyle strikethruStyle = new TextStyle()
    .SetTextDecoration(TextDecoration.LINE_THROUGH)
    .SetFont(baseFont)
    .SetFontSize(fontSize);

// 创建带样式的段落
Paragraph strikethruPara = new Paragraph(field.GetValueAsString())
    .AddStyle(strikethruStyle)
    .SetHorizontalAlignment(HorizontalAlignment.CENTER) // 文本居中
    .SetVerticalAlignment(VerticalAlignment.MIDDLE);

// 将段落渲染到字段外观画布
Canvas canvas = new Canvas(new PdfCanvas(normalAppearance, pdfDocument), pdfDocument, fieldRect);
canvas.Add(strikethruPara);
canvas.Close();

// 后续设置外观的代码和方案1一致...

注意事项

  • 如果你是修改已有PDF中的表单字段,只需要通过form.GetField("字段名")获取字段,再替换其外观即可。
  • 删除线的位置和粗细可以通过调整strikethruY和SetLineWidth的值来适配不同字体和字号。

内容的提问来源于stack exchange,提问作者Nathan Beck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:20:51