在一些文档处理中,我们需要对PDF盖上公司的印章操作,本篇随笔介绍利用Spire.Pdf实现PDF添加印章的操作,如全章和骑缝章的处理。
有时候,需要在特定的位置盖章,以及各个页面盖上骑缝章,如下界面效果所示。
全章的位置定位好后,绘制一个图片即可,骑缝章则是根据多少页,把图片拆分来,然后每页指定位置绘制上图片就可以,逻辑上相对比较简单,只需要便于对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();
以上就是在特定位置粘贴图片,实现印章处理的代码逻辑。
骑缝章的处理类似,主要就是先拆分图片,如下是图片拆分的实现代码。
/// <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(); }
三个页面的骑缝章如上所示。