利用Spire.Pdf實現PDF新增印章的操作

2023-07-18 18:00:34

在一些檔案處理中,我們需要對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();
}

    

三個頁面的騎縫章如上所示。