跳到主要內容

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

在Windows Server設定L2TP over IPSec VPN

簡單地說,macOS Sierra與iOS 10發表後,大家忽然發現Apple不再支援PPTP,所以一定得設定其他的VPN型態。若不要另外裝client,用L2TP是最方便的,SSL VPN雖然好,但若沒有安裝Agent要連線到任一電腦或是非網頁服務還是挺麻煩的。