7

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

 1 year ago
source link: https://www.cnblogs.com/wuhuacong/p/17563461.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

1、实现效果和处理代码

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

8867-20230718163656697-1900850640.png

全章的位置定位好后,绘制一个图片即可,骑缝章则是根据多少页,把图片拆分来,然后每页指定位置绘制上图片就可以,逻辑上相对比较简单,只需要便于对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();
}
8867-20230718163656697-1900850640.png

8867-20230718164934614-2110921615.png 

8867-20230718164948756-1332570655.png

   8867-20230718165011391-1812161977.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK