fix(pdf-generator): 签名按字段尺寸等比例缩放并居中

- 计算宽度和高度的缩放比例,取较小值确保签名完全在字段内
- 在字段内居中放置签名图片
- 符合行业标准:签名根据字段尺寸自适应缩放

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-26 05:56:38 -08:00
parent 2e65a92e04
commit ad5b153fa9
1 changed files with 16 additions and 9 deletions

View File

@ -388,28 +388,35 @@ export class PdfGeneratorService {
const widget = widgets[0]; const widget = widgets[0];
const rect = widget.getRectangle(); const rect = widget.getRectangle();
// 获取签名图片原始尺寸并按比例缩放 // 获取签名图片原始尺寸
const imgDims = signatureImage.scale(1); const imgDims = signatureImage.scale(1);
// 目标宽度 150pt约 5cm保持宽高比 // 按字段尺寸等比例缩放签名图片
const targetWidth = 150; // 计算宽度和高度的缩放比例,取较小值以确保签名完全在字段内
const scale = targetWidth / imgDims.width; const scaleX = rect.width / imgDims.width;
const scaledWidth = targetWidth; const scaleY = rect.height / imgDims.height;
const scale = Math.min(scaleX, scaleY);
const scaledWidth = imgDims.width * scale;
const scaledHeight = imgDims.height * scale; const scaledHeight = imgDims.height * scale;
// 在字段内居中放置签名
const offsetX = (rect.width - scaledWidth) / 2;
const offsetY = (rect.height - scaledHeight) / 2;
// 获取按钮所在的页面 // 获取按钮所在的页面
const pages = pdfDoc.getPages(); const pages = pdfDoc.getPages();
const page = pages[5]; // 第6页签名区域 const page = pages[5]; // 第6页签名区域
// 在按钮位置绘制缩放后的签名图片 // 在按钮位置绘制缩放后的签名图片(居中)
page.drawImage(signatureImage, { page.drawImage(signatureImage, {
x: rect.x, x: rect.x + offsetX,
y: rect.y, y: rect.y + offsetY,
width: scaledWidth, width: scaledWidth,
height: scaledHeight, height: scaledHeight,
}); });
this.logger.log(`Signature embedded at (${rect.x}, ${rect.y}) with size ${scaledWidth}x${scaledHeight}`); this.logger.log(`Signature embedded at (${rect.x + offsetX}, ${rect.y + offsetY}) with size ${scaledWidth}x${scaledHeight}, field size: ${rect.width}x${rect.height}`);
} else { } else {
throw new Error('No widgets found for signature button'); throw new Error('No widgets found for signature button');
} }