在一些文檔處理中,我們需要對PDF蓋上公司的印章操作,本篇隨筆介紹利用Spire.Pdf實現PDF添加印章的操作,如全章和騎縫章的處理。 ...
在一些文檔處理中,我們需要對PDF蓋上公司的印章操作,本篇隨筆介紹利用Spire.Pdf實現PDF添加印章的操作,如全章和騎縫章的處理。
1、實現效果和處理代碼
有時候,需要在特定的位置蓋章,以及各個頁面蓋上騎縫章,如下界面效果所示。
全章的位置定位好後,繪製一個圖片即可,騎縫章則是根據多少頁,把圖片拆分來,然後每頁指定位置繪製上圖片就可以,邏輯上相對比較簡單,只需要便於對PDF實現相關的處理即可。
如需要對PDF文檔進行編輯處理,那麼我們需要對PDF文檔進行載入,使用Spire.Pdf控制項對PDF文件處理比較容易。
首先是根據文檔路徑載入為PdfDocument對象,如下代碼所示。
var doc = new PdfDocument(); doc.LoadFromFile(signPdf);
而圖片內容,我們這需要根據圖片路徑,進行載入,由於圖片大小有不一樣的地方,因此需要根據縮放到指定的大小進行粘貼,如下代碼所示。
//構建印章圖片,併進行縮放裁剪 var image = Image.FromFile(signImage); image = ImageHelper.ResizeImageToAFixedSize(image, imageWidth, imageHeight, ImageHelper.ScaleMode.H, Color.White); PdfImage pdfImage = PdfImage.FromImage(image);
然後對每頁的PDF文檔,進行單獨的處理。
//每頁都添加印章 for (int i = 0; i < doc.Pages.Count; i++)
由於PDF文檔,可以通過繪製 PdfTemplate 模板的方式貼上所需要的內容,如我們這裡是圖片,代碼所示。
PdfPageBase page = doc.Pages[i]; //使用PdfTemplate模板繪製,可以拖動或鎖定 var loStamp = new PdfRubberStampAnnotation(new RectangleF(new PointF(400, 600), new SizeF(imageWidth, imageHeight))); var loApprearance = new PdfAppearance(loStamp); var template = new PdfTemplate(imageWidth, imageHeight); template.Graphics.DrawImage(pdfImage, 0, 0); loApprearance.Normal = template; loStamp.Appearance = loApprearance; loStamp.Flags = PdfAnnotationFlags.ReadOnly | PdfAnnotationFlags.NoRotate | PdfAnnotationFlags.NoZoom | PdfAnnotationFlags.Locked; // 設置印章標誌 page.AnnotationsWidget.Add(loStamp);
最後保存文檔並關閉對象即可。
//保存文檔 if (!string.IsNullOrEmpty(fileSave)) { doc.SaveToFile(fileSave); } doc.Close();
以上就是在特定位置粘貼圖片,實現印章處理的代碼邏輯。
2、實現騎縫章的處理
騎縫章的處理類似,主要就是先拆分圖片,如下是圖片拆分的實現代碼。
/// <summary> /// 把圖片根據份數進行拆分不同的圖片集合 /// </summary> /// <param name="num">多少份</param> /// <param name="signImage">圖片路徑</param> /// <returns></returns> private static Image[] GetImage(int num, string signImage) { var lists = new List<Bitmap>(); var imageWidth = 150; var imageHeight = 150; var image = Image.FromFile(signImage); image = ImageHelper.ResizeImageToAFixedSize(image, imageWidth, imageHeight, ImageHelper.ScaleMode.H, Color.White); int w = image.Width / num; Bitmap bitmap = null; for (int i = 0; i < num; i++) { bitmap = new Bitmap(w, image.Height); using (Graphics g = Graphics.FromImage(bitmap)) { g.Clear(Color.White); var rect = new Rectangle(i * w, 0, w, image.Height); g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), rect, GraphicsUnit.Pixel); } lists.Add(bitmap); } return lists.ToArray(); }
最後實現代碼如下所示。
/// <summary> /// 生成騎縫章 /// </summary> /// <param name="signPdf">要蓋章的文件</param> /// <param name="signImage">印章圖片</param> /// <param name="fileSave">處理後的文件保存路徑</param> public static void SplitSign(string signPdf, string signImage, string fileSave) { //載入PDF文檔 var doc = new PdfDocument(); doc.LoadFromFile(signPdf); var convert = new PdfUnitConvertor(); //獲取分割後的印章圖片 Image[] images = GetImage(doc.Pages.Count, signImage); float x = 0; float y = 0; float alpha = 0.5f;//設定透明比例 //將圖片畫到PDF頁面上的指定位置 PdfPageBase pageBase = null; for (int i = 0; i < doc.Pages.Count; i++) { pageBase = doc.Pages[i]; x = pageBase.Size.Width - convert.ConvertToPixels(images[i].Width, PdfGraphicsUnit.Point); y = 150; //pageBase.Size.Height / 2;//中間靠上一點 pageBase.Canvas.SetTransparency(alpha, alpha, PdfBlendMode.Normal);//設置透明度 pageBase.Canvas.DrawImage(PdfImage.FromImage(images[i]), new PointF(x, y)); } //保存PDF文件 if (!string.IsNullOrEmpty(fileSave)) { doc.SaveToFile(fileSave); } doc.Close(); }
三個頁面的騎縫章如上所示。
專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
轉載請註明出處:撰寫人:伍華聰 http://www.iqidi.com