跳到主要內容

利用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 ) {}
}
}
}

留言

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

用ZedGraph畫統計圖

Update: 沒想到這篇居然變成Google搜尋ZedGraph第一篇中文網頁,不過還是誠心建議用Windows上的C#先看一下 免費的圖表元件:Microsoft Chart Controls ,除非你非得用.Net 2.0(Windows 2000)或是用 Mono 。 BTW,我並不想成為微軟MVP,所以本Blog並不是有問必答的喲^_^ 才剛貼完上一篇,馬上就有位朋友丟過來一個LGPL Open Source元件的網址: ZedGraph 。 參考: A flexible charting library for .NET