From 6c017d2086e7c007609e80c7e1b77d8e8854dbd9 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 26 Dec 2025 05:53:22 -0800 Subject: [PATCH] =?UTF-8?q?fix(planting-service):=20=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=BF=9D=E6=8C=81=E5=8E=9F=E5=A7=8B=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8=E6=94=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 不再缩放签名图片适应按钮大小 - 直接在按钮位置绘制原始尺寸的签名 - 避免签名被压扁变形 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../pdf/pdf-generator.service.ts | 47 ++++++------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/backend/services/planting-service/src/infrastructure/pdf/pdf-generator.service.ts b/backend/services/planting-service/src/infrastructure/pdf/pdf-generator.service.ts index 9a30f15c..59bda9f2 100644 --- a/backend/services/planting-service/src/infrastructure/pdf/pdf-generator.service.ts +++ b/backend/services/planting-service/src/infrastructure/pdf/pdf-generator.service.ts @@ -382,48 +382,31 @@ export class PdfGeneratorService { const form = pdfDoc.getForm(); const signatureButton = form.getButton(FORM_FIELDS.SIGNATURE); - // 获取按钮的 widget 和尺寸 + // 获取按钮的 widget 和位置 const widgets = signatureButton.acroField.getWidgets(); if (widgets.length > 0) { const widget = widgets[0]; const rect = widget.getRectangle(); - const { width: fieldWidth, height: fieldHeight } = rect; - // 计算图片缩放尺寸(保持宽高比,适应字段大小) + // 获取签名图片原始尺寸 const imgDims = signatureImage.scale(1); - let scale = Math.min(fieldWidth / imgDims.width, fieldHeight / imgDims.height); - const scaledWidth = imgDims.width * scale; - const scaledHeight = imgDims.height * scale; + const imgWidth = imgDims.width; + const imgHeight = imgDims.height; - // 计算居中位置 - const x = (fieldWidth - scaledWidth) / 2; - const y = (fieldHeight - scaledHeight) / 2; + // 直接在按钮位置绘制原始尺寸的签名图片 + // 获取按钮所在的页面 + const pages = pdfDoc.getPages(); + const page = pages[5]; // 第6页(签名区域) - // 创建外观流内容 - const appearanceStream = `q ${scaledWidth} 0 0 ${scaledHeight} ${x} ${y} cm /Img Do Q`; - - // 创建 XObject Form 作为外观 - const context = pdfDoc.context; - const imageXObjectName = 'Img'; - - const Resources = context.obj({ - XObject: { [imageXObjectName]: signatureImage.ref }, + // 在按钮的左下角位置绘制签名图片(保持原始尺寸) + page.drawImage(signatureImage, { + x: rect.x, + y: rect.y, + width: imgWidth, + height: imgHeight, }); - const appearanceStreamRef = context.register( - context.stream(appearanceStream, { - Type: 'XObject', - Subtype: 'Form', - FormType: 1, - BBox: [0, 0, fieldWidth, fieldHeight], - Resources, - }), - ); - - // 设置外观到 widget - widget.setNormalAppearance(appearanceStreamRef); - - this.logger.log('Signature embedded using custom appearance stream'); + this.logger.log(`Signature embedded at (${rect.x}, ${rect.y}) with original size ${imgWidth}x${imgHeight}`); } else { throw new Error('No widgets found for signature button'); }