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

PDFBox如何将不同尺寸签名置于矩形居中位置并解决裁剪问题

问题根因

  • 当前仅按目标矩形宽度计算缩放比例,未校验缩放后的高度是否超出矩形高度:1:1的QR码按120px宽度缩放后高度也为120px,远大于预设矩形的60px高度,必然出现裁剪
  • 硬编码的10%偏移、0.85全局缩放逻辑没有适配不同比例的图片,无法兼容横版签名、正方形QR码等多场景

修复方案

先统一计算适配宽高的最小等比缩放比,再动态计算居中偏移坐标,替换原有硬编码的缩放、偏移逻辑即可,修正后代码如下:

cs.saveGraphicsState();
PDImageXObject img = PDImageXObject.createFromFileByExtension(imageFile, doc);

// 可自定义的内边距比例,这里对应你之前的0.85缩放,上下左右留15%的空白
float paddingScale = 0.85f;
// 目标矩形的可用绘制宽高(减去内边距后的尺寸)
float availableWidth = rect.getWidth() * paddingScale;
float availableHeight = rect.getHeight() * paddingScale;

// 分别计算宽、高方向的缩放比例,取最小值保证图片完整展示不超出
float widthScale = availableWidth / img.getWidth();
float heightScale = availableHeight / img.getHeight();
float finalScale = Math.min(widthScale, heightScale);

// 计算缩放后的图片实际宽高
float scaledWidth = img.getWidth() * finalScale;
float scaledHeight = img.getHeight() * finalScale;

// 计算居中坐标:(矩形总宽度 - 缩放后图片宽度)/2 保证整体居中
float x = (rect.getWidth() - scaledWidth) / 2;
float y = (rect.getHeight() - scaledHeight) / 2;

// 绘制图片,不需要额外做transform缩放
cs.drawImage(img, x, y, scaledWidth, scaledHeight);
cs.restoreGraphicsState();

逻辑说明

  • 不管是横版的签名图、正方形的QR码还是竖版图片,都会优先按最小比例缩放,保证完整放在目标矩形内
  • 偏移坐标是动态计算的,不需要硬编码10%的偏移值,所有比例的图片都会自动居中
  • 内边距可通过调整paddingScale参数自定义,不需要单独调用transform做全局缩放,避免坐标换算混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:48:02