PDFBox 将签名设置为矩形的中心

PDFBox set Signature to Center of the Rectangle

使用 PDFBox 我尝试将 signature 设置为以 rectacle 框为中心,假设 rectacle 大小为 120x60 并且可以自定义和图像签名可能会有所不同,示例 1000*1000640x320 等。我正在尝试像框一样调整签名大小:

// save and restore graphics if the image is too large and needs to be scaled
cs.saveGraphicsState();
cs.transform(Matrix.getScaleInstance(0.85f, 0.85f));
PDImageXObject img = PDImageXObject.createFromFileByExtension(imageFile, doc);

float wpercent = (rect.getWidth() / img.getWidth());
float newHeight = img.getHeight() * wpercent;


cs.drawImage(img, 0,0, rect.getWidth(), newHeight); //Resize image signature fit to rectangle and resize the height by percent to avoid stretch image
cs.restoreGraphicsState();

尝试计算盒子内的坐标

cs.drawImage(img, rect.getWidth()*0.10,rect.getHeight()*0.10, rect.getWidth(), newHeight);

示例图片成功设置为中心图片大小 1880x1000

如果签名只是 QR 大小 1000x1000

二维码被截断了

如何解决?

已解决指

通过添加此函数来缩放适合矩形的图像

public static Dimension getScaledDimension(Dimension imgSize, Dimension boundary) {

        int original_width = imgSize.width;
        int original_height = imgSize.height;
        int bound_width = boundary.width;
        int bound_height = boundary.height;
        int new_width = original_width;
        int new_height = original_height;

        // first check if we need to scale width
        if (original_width > bound_width) {
            //scale width to fit
            new_width = bound_width;
            //scale height to maintain aspect ratio
            new_height = (new_width * original_height) / original_width;
        }

        // then check if we need to scale even with the new height
        if (new_height > bound_height) {
            //scale height to fit instead
            new_height = bound_height;
            //scale width to maintain aspect ratio
            new_width = (new_height * original_width) / original_height;
        }

        return new Dimension(new_width, new_height);
    }

然后加入这个函数

Dimension scaledDim = getScaledDimension(new Dimension(img.getWidth(), img.getHeight()), new Dimension((int)rect.getWidth(), (int)rect.getHeight()));

int x = ((int) rect.getWidth() - scaledDim.width) / 2;
int y = ((int) rect.getHeight() - scaledDim.height) / 2;

cs.drawImage(img, x, y, scaledDim.width, scaledDim.height);