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

如何用PDFkit实现类似Material UI TextField的文本矩形样式?

如何用PDFKit实现Material UI TextField样式的带缺口边框输入框

我正在学习PDFKit,用官方在线demo开发,想要创建类似Material UI TextField的带文本矩形——边框在文本位置有缺口,文本浮于缺口处。

现有代码如下:

var doc = new PDFDocument();
var stream = doc.pipe(blobStream());

doc.rect(45, 165, 240, 22).fillAndStroke('#ddd', '#000');
doc.fill('#F00').stroke();
doc.fontSize(16);
doc.text("Sample text", 50, 170, {lineBreak: false} );

doc.end();
stream.on('finish', function() {
  iframe.src = stream.toBlobURL('application/pdf');
});

当前问题是无法移除文本上方的边框线条,请问需要修改哪些代码实现预期样式?


解决方案

核心思路是不绘制完整的矩形边框,而是拆分边框为四段(左、右竖线,下横线,以及拆分后的上横线),避开文本所在的区域,最后绘制文本浮在缺口位置。

修改后的完整代码:

var doc = new PDFDocument();
var stream = doc.pipe(blobStream());

const rectX = 45;
const rectY = 165;
const rectWidth = 240;
const rectHeight = 22;
const text = "Sample text";
const textX = 50;
const textFontSize = 16;

// 1. 绘制背景填充(仅填充,不描边)
doc.rect(rectX, rectY, rectWidth, rectHeight).fill('#ddd');

// 2. 设置边框样式
doc.strokeColor('#000');

// 3. 绘制左竖线
doc.moveTo(rectX, rectY)
   .lineTo(rectX, rectY + rectHeight)
   .stroke();

// 4. 绘制右竖线
doc.moveTo(rectX + rectWidth, rectY)
   .lineTo(rectX + rectWidth, rectY + rectHeight)
   .stroke();

// 5. 绘制下横线
doc.moveTo(rectX, rectY + rectHeight)
   .lineTo(rectX + rectWidth, rectY + rectHeight)
   .stroke();

// 6. 计算文本宽度,绘制拆分的上横线
doc.fontSize(textFontSize);
const textWidth = doc.widthOfString(text);
const gapOffset = 2; // 文本与边框的间隙

// 上横线左段
doc.moveTo(rectX, rectY)
   .lineTo(textX - gapOffset, rectY)
   .stroke();

// 上横线右段
doc.moveTo(textX + textWidth + gapOffset, rectY)
   .lineTo(rectX + rectWidth, rectY)
   .stroke();

// 7. 绘制文本(调整Y坐标让文本浮在缺口处)
doc.fillColor('#F00')
   .text(text, textX, rectY - textFontSize + 6); // 调整Y值适配字体大小

doc.end();
stream.on('finish', function() {
  iframe.src = stream.toBlobURL('application/pdf');
});

关键修改说明

  1. 拆分边框绘制:放弃fillAndStroke一次性绘制完整矩形,改为单独绘制边框的各个部分,在上横线处留出文本对应的缺口。
  2. 文本位置计算:用widthOfString获取文本宽度,精准控制上横线的缺口范围。
  3. 文本Y坐标调整:将文本的Y坐标设为矩形顶部上方,让文本自然浮在缺口区域,而非覆盖在边框上。

内容的提问来源于stack exchange,提问作者The Dead Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:50:26