Aspose pdf for java插入图片

现在使用aspose pdf for java22.8版本
问题:
我们看ASPOSE 都是基于"左下角" 或者"右上角"去做计算,去插入"章"的图片,但是扫描件图片,生成的PDF,由于图片扫描的问题,会转置90度调整PDF,导致"盖章"的图片位置不对。例如:A4纸张,扫描图片时放横了,然后生成PDF后,用PDF页面,又转90度(把它转正),请问有没有好的方式方法来解决这个问题?

DEMO如下:

// 加载PDF文档
Document pdfDocument = new Document(inputStream);
// 获取第一页 (索引从1开始)
Page page = pdfDocument.getPages().get_Item(1);
page.getResources().getImages().add(imageInputStream);

double imageWidth = 86;
double imageHeight = 50;

// 设置图片在左下角的位置(距离左边缘和下边缘的偏移量)
double leftMargin = 5; // 距离左边缘点
double bottomMargin = 5; // 距离下边缘点

// 计算图片显示区域的矩形边界
double lowerLeftX = leftMargin;
double lowerLeftY = bottomMargin;
double upperRightX = leftMargin + imageWidth;
double upperRightY = bottomMargin + imageHeight;

// 使用图形操作符放置图片
page.getContents().add(new GSave()); // 保存当前图形状态

// 创建变换矩阵将图片映射到指定矩形区域
Rectangle rectangle = new Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
Matrix matrix = new Matrix(new double[] {
rectangle.getURX() - rectangle.getLLX(), // X方向缩放 = 矩形宽度
0, // 无倾斜
0, // 无倾斜
rectangle.getURY() - rectangle.getLLY(), // Y方向缩放 = 矩形高度
rectangle.getLLX(), // X方向平移 = 左边缘位置
rectangle.getLLY() // Y方向平移 = 下边缘位置
});

// 应用矩阵变换并绘制图片
page.getContents().add(new ConcatenateMatrix(matrix));

XImage ximage = page.getResources().getImages().get_Item(
page.getResources().getImages().size()
);
page.getContents().add(new Do(ximage.getName()));

page.getContents().add(new GRestore()); // 恢复图形状态

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pdfDocument.save(outputStream, SaveFormat.Pdf);

outputStream.close();
imageInputStream.close();

请问这个问题有人能回复吗?

@Angela_xu
尝试确定当前页面旋转角度并调整坐标的选项。

// 加载PDF文档
// 加载 PDF 文档
Document pdfDocument = new Document(inputStream);
// 获取第一页 (索引从1开始)
// 获取第一页(索引从1开始)
Page page = pdfDocument.getPages().get_Item(1);

// 获取页面的旋转角度
// 获取页面的旋转角度
int rotation = page.getRotate();

// 页面尺寸(物理尺寸)
// 页面尺寸(物理尺寸)
double pageWidth = page.getPageInfo().getWidth();
double pageHeight = page.getPageInfo().getHeight();

double imageWidth = 86;
double imageHeight = 50;
double leftMargin = 5;    // 距离左边缘的偏移量(视觉上)
double bottomMargin = 5;  // 距离下边缘的偏移量(视觉上)

// 根据旋转角度调整坐标
// 根据旋转角度调整坐标
double lowerLeftX, lowerLeftY;

switch (rotation) {
    case Rotation.on90:    // 旋转90度
        // 旋转90度时,物理页面的左下角对应视觉页面的右下角
        // 需要将坐标进行转换:视觉的左边距变为物理的下边距,视觉的下边距变为物理的右边距(需考虑图片宽度)
        lowerLeftX = pageHeight - bottomMargin - imageWidth;
        lowerLeftY = leftMargin;
        break;
        
    case Rotation.on180:   // 旋转180度
        // 旋转180度时,坐标完全翻转
        // 视觉左下角对应物理右上角
        lowerLeftX = pageWidth - leftMargin - imageWidth;
        lowerLeftY = pageHeight - bottomMargin - imageHeight;
        break;
        
    case Rotation.on270:   // 旋转270度
        // 旋转270度时,物理页面的左下角对应视觉页面的左上角
        // 视觉左边距变为物理下边距,视觉下边距变为物理左边距
        lowerLeftX = bottomMargin;
        lowerLeftY = pageWidth - leftMargin - imageWidth;
        break;
        
    default: // Rotation.onNone 或 0度
        // 无旋转时,直接使用原始坐标
        lowerLeftX = leftMargin;
        lowerLeftY = bottomMargin;
        break;
}

// 计算图片显示区域的矩形边界
// 计算图片显示区域的矩形边界
double upperRightX = lowerLeftX + imageWidth;
double upperRightY = lowerLeftY + imageHeight;

// 添加图片到页面资源
// 添加图片到页面资源
page.getResources().getImages().add(imageInputStream);

// 使用图形操作符放置图片
// 使用图形操作符放置图片
page.getContents().add(new GSave()); // 保存当前图形状态

// 创建变换矩阵将图片映射到指定矩形区域
// 创建变换矩阵将图片映射到指定矩形区域
Rectangle rectangle = new Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
Matrix matrix = new Matrix(new double[] {
    rectangle.getURX() - rectangle.getLLX(), // X方向缩放 = 矩形宽度
    0, // 无倾斜
    0, // 无倾斜
    rectangle.getURY() - rectangle.getLLY(), // Y方向缩放 = 矩形高度
    rectangle.getLLX(), // X方向平移 = 左边缘位置
    rectangle.getLLY()  // Y方向平移 = 下边缘位置
});

// 应用矩阵变换并绘制图片
// 应用矩阵变换并绘制图片
page.getContents().add(new ConcatenateMatrix(matrix));

// 获取最后添加的图片并绘制
// 获取最后添加的图片并绘制
XImage ximage = page.getResources().getImages().get_Item(
    page.getResources().getImages().size()
);
page.getContents().add(new Do(ximage.getName()));

page.getContents().add(new GRestore()); // 恢复图形状态

// 保存文档
// 保存文档
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
pdfDocument.save(outputStream, SaveFormat.Pdf);

outputStream.close();
imageInputStream.close();