翼度科技»论坛 编程开发 .net 查看内容

利用Spire.Pdf实现PDF添加印章的操作

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
在一些文档处理中,我们需要对PDF盖上公司的印章操作,本篇随笔介绍利用Spire.Pdf实现PDF添加印章的操作,如全章和骑缝章的处理。
1、实现效果和处理代码

有时候,需要在特定的位置盖章,以及各个页面盖上骑缝章,如下界面效果所示。

全章的位置定位好后,绘制一个图片即可,骑缝章则是根据多少页,把图片拆分来,然后每页指定位置绘制上图片就可以,逻辑上相对比较简单,只需要便于对PDF实现相关的处理即可。
如需要对PDF文档进行编辑处理,那么我们需要对PDF文档进行加载,使用Spire.Pdf控件对PDF文件处理比较容易。
首先是根据文档路径加载为PdfDocument对象,如下代码所示。
  1.    var doc = new PdfDocument();
  2.    doc.LoadFromFile(signPdf);
复制代码
而图片内容,我们这需要根据图片路径,进行加载,由于图片大小有不一样的地方,因此需要根据缩放到指定的大小进行粘贴,如下代码所示。
  1.     //构建印章图片,并进行缩放裁剪
  2.     var image = Image.FromFile(signImage);
  3.     image = ImageHelper.ResizeImageToAFixedSize(image, imageWidth, imageHeight, ImageHelper.ScaleMode.H, Color.White);
  4.     PdfImage pdfImage = PdfImage.FromImage(image);
复制代码
然后对每页的PDF文档,进行单独的处理。
  1.     //每页都添加印章
  2.     for (int i = 0; i < doc.Pages.Count; i++)
复制代码
由于PDF文档,可以通过绘制 PdfTemplate 模板的方式贴上所需要的内容,如我们这里是图片,代码所示。
  1.     PdfPageBase page = doc.Pages[i];
  2.     //使用PdfTemplate模板绘制,可以拖动或锁定
  3.     var loStamp = new PdfRubberStampAnnotation(new RectangleF(new PointF(400, 600), new SizeF(imageWidth, imageHeight)));
  4.     var loApprearance = new PdfAppearance(loStamp);
  5.     var template = new PdfTemplate(imageWidth, imageHeight);
  6.     template.Graphics.DrawImage(pdfImage, 0, 0);
  7.     loApprearance.Normal = template;
  8.     loStamp.Appearance = loApprearance;
  9.     loStamp.Flags = PdfAnnotationFlags.ReadOnly | PdfAnnotationFlags.NoRotate | PdfAnnotationFlags.NoZoom | PdfAnnotationFlags.Locked; // 设置印章标志
  10.     page.AnnotationsWidget.Add(loStamp);
复制代码
最后保存文档并关闭对象即可。
  1.     //保存文档
  2.     if (!string.IsNullOrEmpty(fileSave))
  3.     {
  4.         doc.SaveToFile(fileSave);
  5.     }
  6.     doc.Close();
复制代码
以上就是在特定位置粘贴图片,实现印章处理的代码逻辑。
 
2、实现骑缝章的处理

骑缝章的处理类似,主要就是先拆分图片,如下是图片拆分的实现代码。
  1.         /// <summary>
  2.         /// 把图片根据份数进行拆分不同的图片集合
  3.         /// </summary>
  4.         /// <param name="num">多少份</param>
  5.         /// <param name="signImage">图片路径</param>
  6.         /// <returns></returns>
  7.         private static Image[] GetImage(int num, string signImage)
  8.         {
  9.             var lists = new List<Bitmap>();
  10.             var imageWidth = 150;
  11.             var imageHeight = 150;
  12.             var image = Image.FromFile(signImage);
  13.             image = ImageHelper.ResizeImageToAFixedSize(image, imageWidth, imageHeight, ImageHelper.ScaleMode.H, Color.White);
  14.             int w = image.Width / num;
  15.             Bitmap bitmap = null;
  16.             for (int i = 0; i < num; i++)
  17.             {
  18.                 bitmap = new Bitmap(w, image.Height);
  19.                 using (Graphics g = Graphics.FromImage(bitmap))
  20.                 {
  21.                     g.Clear(Color.White);
  22.                     var rect = new Rectangle(i * w, 0, w, image.Height);
  23.                     g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), rect, GraphicsUnit.Pixel);
  24.                 }
  25.                 lists.Add(bitmap);
  26.             }
  27.             return lists.ToArray();
  28.         }
复制代码
最后实现代码如下所示。
  1. /// <summary>
  2. /// 生成骑缝章
  3. /// </summary>
  4. /// <param name="signPdf">要盖章的文件</param>
  5. /// <param name="signImage">印章图片</param>
  6. /// <param name="fileSave">处理后的文件保存路径</param>
  7. public static void SplitSign(string signPdf, string signImage, string fileSave)
  8. {
  9.     //加载PDF文档
  10.     var doc = new PdfDocument();
  11.     doc.LoadFromFile(signPdf);
  12.     var convert = new PdfUnitConvertor();
  13.     //获取分割后的印章图片
  14.     Image[] images = GetImage(doc.Pages.Count, signImage);
  15.     float x = 0;
  16.     float y = 0;
  17.     float alpha = 0.5f;//设定透明比例
  18.     //将图片画到PDF页面上的指定位置
  19.     PdfPageBase pageBase = null;
  20.     for (int i = 0; i < doc.Pages.Count; i++)
  21.     {
  22.         pageBase = doc.Pages[i];
  23.         x = pageBase.Size.Width - convert.ConvertToPixels(images[i].Width, PdfGraphicsUnit.Point);
  24.         y = 150; //pageBase.Size.Height / 2;//中间靠上一点
  25.         pageBase.Canvas.SetTransparency(alpha, alpha, PdfBlendMode.Normal);//设置透明度
  26.         pageBase.Canvas.DrawImage(PdfImage.FromImage(images[i]), new PointF(x, y));
  27.     }
  28.     //保存PDF文件
  29.     if (!string.IsNullOrEmpty(fileSave))
  30.     {
  31.         doc.SaveToFile(fileSave);
  32.     }
  33.     doc.Close();
  34. }
复制代码

 
   

三个页面的骑缝章如上所示。
 

来源:https://www.cnblogs.com/wuhuacong/archive/2023/07/18/17563461.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具