现在使用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();