• 利用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、实现骑缝章的处理

    骑缝章的处理类似,主要就是先拆分图片,如下是图片拆分的实现代码。

    复制代码
            /// 
            /// 把图片根据份数进行拆分不同的图片集合
            /// 
            /// 多少份
            /// 图片路径
            /// 
            private static Image[] GetImage(int num, string signImage)
            {
                var lists = new List();
                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();
            }
    复制代码

    最后实现代码如下所示。

    复制代码
    /// 
    /// 生成骑缝章
    /// 
    /// 要盖章的文件
    /// 印章图片
    /// 处理后的文件保存路径
    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();
    }
    复制代码

        

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

     

  • 相关阅读:
    小程序源码:云之道知识付费独立线传版V2-2.4.9-多玩法安装简单
    变电站自动化监控系统
    基于springboot的高校毕业设计选题系统
    【一文讲明白什么是云原生,有什么优势】
    js到vue到react的发展
    Linux 环境删除Conda
    数据结构_笔记_第1章:绪论
    使用SpringBoot和ZXing实现二维码生成与解析
    软件测试----基础篇(1)
    Mybatis02动态sql和分页
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/17563461.html