如何用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'); });
关键修改说明
- 拆分边框绘制:放弃
fillAndStroke一次性绘制完整矩形,改为单独绘制边框的各个部分,在上横线处留出文本对应的缺口。 - 文本位置计算:用
widthOfString获取文本宽度,精准控制上横线的缺口范围。 - 文本Y坐标调整:将文本的Y坐标设为矩形顶部上方,让文本自然浮在缺口区域,而非覆盖在边框上。
内容的提问来源于stack exchange,提问作者The Dead Man
相关产品推荐
相关产品推荐

