自動化審核流程常需在 PDF 最後一頁加蓋印章圖片與文字。iTextSharp 操作 PDF 時,頁面旋轉 (/Rotate) 與內容流旋轉分離,若不分別處理會導致印章位置偏移、方向錯誤。本文提供完整處理邏輯。
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.IO;
public void StampApproval(string srcPath)
{
string dstPath = Path.ChangeExtension(srcPath, "_APPROVE.pdf");
using (var reader = new PdfReader(srcPath))
using (var fs = new FileStream(dstPath, FileMode.Create))
{
var pageSize = reader.GetPageSizeWithRotation(1);
var doc = new Document(pageSize);
var writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
var cb = writer.DirectContent;
int totalPages = reader.NumberOfPages;
for (int i = 1; i <= totalPages; i++)
{
doc.SetPageSize(reader.GetPageSizeWithRotation(i));
doc.NewPage(); // 重要:NewPage 會重置 cb
int rotation = reader.GetPageRotation(i);
var page = writer.GetImportedPage(reader, i);
// 依旋轉角度套用座標轉換矩陣
switch (rotation)
{
case 90:
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, pageSize.Height);
break;
case 180:
cb.AddTemplate(page, -1f, 0, 0, -1f, pageSize.Width, pageSize.Height);
break;
case 270:
cb.AddTemplate(page, 0, 1f, -1f, 0, pageSize.Width, 0);
break;
default: // 0
cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
break;
}
// 最後一頁加蓋印章
if (i == totalPages)
{
int imgLeft = 350;
if (rotation == 90 || rotation == 270) imgLeft = 550; // 旋轉頁面調整 X
var img = Image.GetInstance(new Uri(@"d:\Lock-icon.png"));
// img.ScaleToFit(140f, 320f); // 按比例縮放
// img.ScalePercent(50f);
cb.AddImage(img, 32f, 0, 0, 32f, 50f, imgLeft); // 寬 32pt、高 32pt、座標 (50, imgLeft)
// 加蓋文字
cb.BeginText();
var bf = BaseFont.CreateFont(BaseFont.HELVETICA_OBLIQUE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetFontAndSize(bf, 9);
cb.SetTextMatrix(imgLeft, 200);
cb.ShowText("GW INDUSTRIAL LTD");
cb.EndText();
}
}
doc.Close();
}
}
/Rotate 鍵值 (0/90/180/270)。AddTemplate(page, a, b, c, d, e, f) 對應矩陣 [a b 0; c d 0; e f 1],實現旋轉、平移、鏡像。AddImage(img, w, 0, 0, h, x, y) 直接指定寬高與左下角座標 (PDF 座標系原點在左下)。SetTextMatrix(x, y) 同樣遵循此座標系。| 現象 | 原因 | 解決 |
|---|---|---|
| 印章出現在頁面外 | 未處理 /Rotate,座標按原始頁面計算 | 使用 GetPageSizeWithRotation + AddTemplate 矩陣修正 |
| 印章方向倒轉/側躺 | 內容流未隨頁面旋轉 | AddTemplate 矩陣包含旋轉修正 |
| 多頁 PDF 僅第一頁正確 | 未在迴圈中呼叫 NewPage() | 每頁迴圈開頭呼叫 doc.NewPage() |
| 文字位置與圖片不對齊 | AddImage 使用 pt,SetTextMatrix 同為 pt,但 Y 軸方向相反 | 統一換算:1 pt = 1/72 inch,Y 從頁面底部向上 |
掌握 GetPageRotation、AddTemplate 仿射矩陣、NewPage 重置機制,即可正確處理任意旋轉角度的 PDF 頁面蓋章。此技術廣泛適用於電子簽章、水印、批註自動化等場景。