跳到主要內容

利用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的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?