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
相关产品推荐
相关产品推荐

