升级至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
相关产品推荐
相关产品推荐

