iText 提供 Image 類別支援 PNG、JPG、GIF 等格式插入 PDF。本文示範:建立文件、載入圖片、設定背景圖鋪滿頁面、一般圖片縮放/旋轉/絕對定位、多圖層疊加。
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class ITextImageDemo {
public static void main(String[] args) {
// A4 約 595x842 pt,此處自訂大尺寸示範
Rectangle pageSize = new Rectangle(4620, 3572);
Document doc = new Document(pageSize);
try {
PdfWriter.getInstance(doc, new FileOutputStream("test_image.pdf"));
doc.open();
// 1. 背景圖(鋪滿整頁)
Image bg = Image.getInstance("bg.png");
bg.setAlignment(Image.UNDERLYING); // 置於最底層
bg.scaleAbsolute(pageSize.getWidth(), pageSize.getHeight());
bg.setAbsolutePosition(0, 0); // 左下角對齊
doc.add(bg);
// 2. 前景圖(縮放、旋轉、定位)
Image img = Image.getInstance("1.png");
img.scaleAbsolute(164.409f, 267.457f); // 指定寬高
img.setRotationDegrees(0); // 旋轉角度(順時針)
img.setAbsolutePosition(100, 1000); // 左下角座標 (x, y)
doc.add(img);
// 3. 另一張圖片示範相對定位(置中)
Image img2 = Image.getInstance("logo.png");
img2.scalePercent(50f); // 縮放 50%
img2.setAlignment(Image.MIDDLE | Image.ALIGN_CENTER);
doc.add(img2);
} catch (DocumentException | IOException e) {
e.printStackTrace();
} finally {
doc.close();
}
}
}
| 方法 | 用途 | 備註 |
|---|---|---|
| scaleAbsolute(w, h) | 指定絕對寬高(單位:pt) | 會變形,若要等比例用 scalePercent 或 scaleToFit |
| scalePercent(%) | 按百分比縮放 | 保持比例 |
| scaleToFit(w, h) | 等比縮放至不超過指定寬高 | 適合縮圖 |
| setRotationDegrees(deg) | 順時針旋轉角度 | 支援負值逆時針 |
| setAbsolutePosition(x, y) | 絕對定位(左下角為原點) | 需在 doc.add 前呼叫 |
| setAlignment(align) | 相對對齊 | Image.LEFT/RIGHT/MIDDLE/UNDERLYING 等 |
| setAbsolutePosition + UNDERLYING | 背景圖標準做法 | 先加背景,再加前景 |
PdfContentByte cb = writer.getDirectContentUnder(); // 內容下層
cb.saveState();
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.3f); // 30% 不透明度
cb.setGState(gs);
Image watermark = Image.getInstance("watermark.png");
watermark.setAbsolutePosition(200, 400);
cb.addImage(watermark);
cb.restoreState();
doc.add()。setAbsolutePosition 與 setAlignment,後者會覆蓋前者。doc.add(),並設 UNDERLYING。