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

如何为jsPDF的AcroFormRadioButton自定义单选按钮选中图标?

如何在jsPDF的AcroForm单选按钮中使用对勾作为选中图标

jsPDF的AcroFormRadioButton类默认只提供Circle和Cross两种选中样式,要实现对勾样式,需要手动自定义单选按钮的外观字典(AP),直接在PDF的外观对象中绘制对勾路径。

以下是修改后的完整代码,替换你原来的radioGroup.setAppearance部分:

let radioGroup = new doc.AcroFormRadioButton();
let formX = 20, formY = 220, radioSize = 4, radioRadius = 1;
var radioButton1 = radioGroup.createOption("Status1");
// 移除重复创建的radioButton1行
radioButton1.Rect = [formX, formY, radioSize, radioSize];
doc.roundedRect(formX, formY, radioSize, radioSize, radioRadius, radioRadius, "D");
doc.setFont(undefined, "bold").setFontSize(10).setTextColor(110, 117, 124);
doc.text("Completed", formX + 7, formY + 3.5);

// 自定义对勾外观
radioGroup.options.forEach(option => {
  // 初始化外观字典
  option.AP = option.AP || {};
  option.AP.N = option.AP.N || {};

  // 未选中状态:保留空心圆边框
  const normalOff = doc.internal.newObject();
  doc.internal.writeToObject(normalOff, `/Type /XObject /Subtype /Form /BBox [0 0 ${radioSize} ${radioSize}] /Resources <<>>`);
  doc.internal.writeStream(normalOff);
  doc.setCurrentFilePointer(normalOff.offset);
  doc.roundedRect(0, 0, radioSize, radioSize, radioRadius, radioRadius, "D");
  doc.internal.writeEOFB();
  option.AP.N.Off = normalOff;

  // 选中状态:绘制带对勾的圆
  const normalOn = doc.internal.newObject();
  doc.internal.writeToObject(normalOn, `/Type /XObject /Subtype /Form /BBox [0 0 ${radioSize} ${radioSize}] /Resources <<>>`);
  doc.internal.writeStream(normalOn);
  doc.setCurrentFilePointer(normalOn.offset);
  // 先绘制边框
  doc.roundedRect(0, 0, radioSize, radioSize, radioRadius, radioRadius, "D");
  // 绘制对勾:调整参数可改变对勾大小位置
  const tickOffset = radioSize * 0.25;
  const tickLength = radioSize * 0.5;
  doc.moveTo(tickOffset, radioSize / 2);
  doc.lineTo(radioSize / 2, radioSize - tickOffset);
  doc.lineTo(radioSize - tickOffset, tickOffset);
  doc.stroke();
  doc.internal.writeEOFB();
  option.AP.N.Yes = normalOn;
});

// 将单选按钮组添加到文档
doc.addField(radioGroup);

关键说明:

  • 直接操作单选按钮的AP(Appearance)字典,分别定义Off(未选中)和Yes(选中)状态的外观对象
  • 对勾的坐标基于单选按钮内部的BBox(0,0到radioSize,radioSize)绘制,通过tickOffset和tickLength可调整对勾的尺寸和位置
  • 未选中状态的外观和你手动绘制的roundedRect保持一致,避免视觉差异
  • 遍历所有选项设置外观,确保组内每个单选按钮都使用对勾样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:15:22