所需依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-core</artifactId>
<version>9.0.0</version>
<type>pom</type>
</dependency>
源码
/**
* PDF工具
*/
public class PdfUtils {
/**
* 嵌入图片到 PDF 的指定页码
* 在 PDF 文档的指定页面添加图片,坐标系以左下角为原点,x轴向右为正,y轴向上为正,单位为pt (1pt=1/72英寸)
*
* @param pdfBytes 原 PDF 字节数组
* @param imageBytes 图片字节数组
* @param width 图片宽度,单位pt
* @param height 图片高度,单位pt
* @param x 图片位置x坐标,单位pt
* @param y 图片位置y坐标,单位pt
* @param pageNumber 目标页码(从1开始)
* @return 嵌入图片后的 PDF 字节数组,如果页码无效则返回 null
* @throws ServiceException 如果嵌入过程中发生错误
*/
public static byte[] embedImage(byte[] pdfBytes, byte[] imageBytes, float width, float height, float x, float y, int pageNumber) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
// 创建 PDF 文档对象,读取源 PDF 并指定输出流
PdfDocument pdfDoc = new PdfDocument(
new PdfReader(new ByteArrayInputStream(pdfBytes)),
new PdfWriter(baos)
);
// 检查页码是否有效
int numberOfPages = pdfDoc.getNumberOfPages();
if (pageNumber < 1 || pageNumber > numberOfPages) {
log.error("指定的页码 {} 无效,文档总页数为 {}", pageNumber, numberOfPages);
// 页码无效时返回 null,而不是抛出异常
return null;
}
// 创建图片数据对象
ImageData imageData = ImageDataFactory.create(imageBytes);
// 基于图片数据创建图片对象
Image image = new Image(imageData);
// 设置图片大小,按比例缩放至指定尺寸
image.scaleToFit(width, height);
// 设置图片在指定页面的位置
image.setFixedPosition(pageNumber, x, y);
// 创建文档布局对象并添加图片
Document document = new Document(pdfDoc);
document.add(image);
// 关闭文档并写入输出流
document.close();
// 返回处理后的 PDF 字节数组
return baos.toByteArray();
} catch (Exception e) {
// 发生异常时抛出服务异常
throw new ServiceException(0, "PDF处理失败");
}
}
}