星期四, 4月 10, 2008

利用iTextSharp替PDF加上浮水印

前陣子敝公司的內部系統改版,原本用tiff格式的文件改為pdf格式,現在要加上浮水印時,發現ImageMagick做得並不好,在Convert時會讓解析度變差,因此找了一些方法後,決定用iTextSharp處理。
iTextSharp是Java平台iText的C#版,當然也可以用VB.Net呼叫。
如果對Acrobat的事件很熟悉,也可以選擇用VB 6呼叫Acrobat SDK,參考iTextSharp的效率很好,比起ImageMagick速度快、佔用的記憶體也少。
先小小抱怨一下,iTextSharp的線上教學文件很差,現在都到4.1.0版,文件還在3.1版。由於4.0版以後物件模型大改(向微軟學的?),Watermark物件已經不復存在,我也懶得去trace source code;所以拿3.1.8版來用,直接照範例寫一個簡單的class就搞定。
iTextSharp的License是LGPLMPL,不過底下的Code是GPL 3.0 XD
這很簡單,只有三個參數:原始pdf路徑名、新pdf路徑名、圖檔路徑名。圖檔要自己先做小一點,我沒有寫縮圖功能,但有加上置中。如果有人改得好用,請寄回給我:P
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace PDFWatermark
{
public class PDFWatermark {
public static void Watermark(string inputfilepath, string outputfilepath, string watermarkimagepath) {
try {
PdfReader pdfReader = new PdfReader(inputfilepath);
int numberOfPages = pdfReader.NumberOfPages;
Rectangle psize = pdfReader.GetPageSize(1);
float width = psize.Width;
float height = psize.Height;
FileStream outputStream = new FileStream(outputfilepath, FileMode.Create);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream);
PdfContentByte waterMarkContent;
Image image = Image.GetInstance(watermarkimagepath);
image.SetAbsolutePosition((width - image.Width) / 2, (height-image.Height)/2);
for (int i = 1; i <= numberOfPages; i++) {
waterMarkContent = pdfStamper.GetUnderContent(i);
waterMarkContent.AddImage(image);
}
pdfStamper.Close();
pdfReader.Close();
}
catch (Exception ) {}
}
}
}

沒有留言: