欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

通過代碼實現 PDF文件自動蓋章

freeflydom
2024年7月22日 11:40 本文熱度 947

序言

在數字化時代,電子文檔的安全性和真實性越來越受到重視。電子印章作為一種數字化的身份驗證工具,已經成為確保文檔合法性和不可篡改性的重要手段。然而,傳統的電子印章往往需要人工操作,不僅效率低下,而且在處理大量文件時容易出錯。為了解決這一問題,自動化地給PDF文件蓋電子章成為了一個迫切的需求。本文將詳細介紹,如何通過 .net 程序實現這一功能,廢話不多說,步入正題

Nuget 包

本文的核心包為:

  • iTextSharp,用它來操作 pdf 文件非常方便,具體的用法這里不多贅述,請參考官網

  • DynamicExpresso,一個非常好用的動態表達式解析工具包

<ItemGroup>

  <PackageReference Include="DynamicExpresso.Core" Version="2.16.1" />

  <PackageReference Include="iTextSharp" Version="5.5.13.3" />

  <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

</ItemGroup>



素材準備

本案例用到的素材包括:用于測試的 pdf 文件一個,模擬電子章圖片一張,以及蓋章配置文件,文件內容如下:

[

  {

    "SignType" : "image",//素材類型,image表示圖片素材,text 表示文本素材

    "LastPage" : true,//是否僅最后一頁蓋章

    "ImageUrl" : "https://xxxxxxxx",//圖片素材的下載鏈接

    "FileName" : "sign.png",//圖片素材文件名稱

    "ScalePercent" : 20,//圖片縮放百分比,100 表示不縮放

    "Opacity" : 0.6,//圖片透明度,1 表示不透明

    "LocationX" : "(input.Width/10)*6",//圖片素材的絕對位置表達式,(0,0) 表示左下角

    "LocationY" : "input.Height/23 +20",//input.With 和 input.Height 代表 pdf 文件的寬度及高度

    "Rotation" : 0//素材的旋轉角度

  },

  {

    "SignType" : "text",

    "LastPage" : true,

    "LocationX" : "(input.Width/10)*6+85",

    "LocationY" : "input.Height/23 ",

    "Rotation" : 0,

    "FontSize" : 20,

    "Opacity" : 0.6,

    "FontColor" : {//文本素材的字體顏色值

      "R" : 255,

      "G" : 0,

      "B" : 0

    },

    "Text" : "input.Date"//文本素材的表達式,也可以直接寫固定文本

  }

]


說明:

  1. 這里之所以設計為一個數組,是因為可能有些場景下,不僅需要蓋電子章,還需要自動簽上日期,比如本案例。

  2. 簽署位置可以自定義,坐標(0,0)代表的是左下角,x 變大即表示橫向右移,y 變大表示縱向上移。

  3. 配置文件存儲,我這里是把配置文件放在了本地,當然你可以存儲在任何地方,比如 MongoDB等。

代碼展示

本案例采用的是 .net7.0,當然 .net6及以后都是可以的。

  1. 配置文件類,與上一步的 json 配置文件對應

namespace PdfSign;


public class SignOpt

{

    public string SignType { get; set; }

    public bool LastPage { get; set; }

    public string ImageUrl { get; set; }

    public string FileName { get; set; }

    public int ScalePercent { get; set; } = 50;

    public string LocationX { get; set; }

    public string LocationY { get; set; }

    public float LocationYf { get; set; }

    public float Rotation { get; set; } = 0;

    public int FontSize { get; set; }

    public float Opacity { get; set; }

    public RBGColor FontColor { get; set; }

    public string? Text { get; set; }

    

    public record RBGColor(int R, int G, int B);

}


  1. pdf 簽署方法

using System.Dynamic;

using DynamicExpresso;

using iTextSharp.text;

using iTextSharp.text.pdf;

using Newtonsoft.Json.Linq;


namespace PdfSign;


public class SignService

{

    public static string PdfSign(List<SignOpt> signOpts, string pdfName)

    {

        var beforeFileName = pdfName; //簽名之前文件名

        var afterFileName = pdfName + "_sign"; //簽名之后文件名

        var idx = 0;

        foreach (var opt in signOpts)

        {

            //創建蓋章后生成pdf

            var outputPdfStream =

                new FileStream(afterFileName + ".pdf", FileMode.Create, FileAccess.Write, FileShare.None);

            //讀取原有pdf

            var pdfReader = new PdfReader(beforeFileName + ".pdf");

            var pdfStamper = new PdfStamper(pdfReader, outputPdfStream);

            //讀取頁數

            var pdfPageSize = pdfReader.NumberOfPages;

            //讀取pdf文件第一頁尺寸,得到 With 和 Height

            var size = pdfReader.GetPageSize(1);

            //通過表達式計算出簽署的絕對坐標

            var locationX = Eval<float>(opt.LocationX, new { size.Width, size.Height });

            var locationY = Eval<float>(opt.LocationY, new { size.Width, size.Height });


            if (opt.LastPage)

            {

                //蓋章在最后一頁

                var pdfContentByte = pdfStamper.GetOverContent(pdfPageSize);

                var gs = new PdfGState

                {

                    FillOpacity = opt.Opacity

                };

                pdfContentByte.SetGState(gs);

                switch (opt.SignType.ToLower())

                {

                    case "image":

                        //獲取圖片

                        var image = Image.GetInstance(opt.FileName);

                        //設置圖片比例

                        image.ScalePercent(opt.ScalePercent);

                        //設置圖片的絕對位置,位置偏移方向為:左到右,下到上

                        image.SetAbsolutePosition(locationX, locationY);

                        //圖片添加到文檔

                        pdfContentByte.AddImage(image);

                        break;

                    case "text":

                        if (string.IsNullOrWhiteSpace(opt.Text))

                            continue;

                        var font = BaseFont.CreateFont();

                        var text = Eval<string>(opt.Text, new { Date = DateTime.Now.ToString("yyyy-MM-dd") });

                        //開始寫入文本

                        pdfContentByte.BeginText();

                        pdfContentByte.SetColorFill(

                            new BaseColor(opt.FontColor.R, opt.FontColor.G, opt.FontColor.B));

                        pdfContentByte.SetFontAndSize(font, opt.FontSize);

                        pdfContentByte.SetTextMatrix(0, 0);

                        pdfContentByte.ShowTextAligned(Element.ALIGN_CENTER, text,

                            locationX, locationY, opt.Rotation);


                        pdfContentByte.EndText();

                        break;

                }

            }


            pdfStamper.Close();

            pdfReader.Close();

            idx++;

            if (idx >= signOpts.Count) continue;

            //文件名重新賦值

            beforeFileName = afterFileName;

            afterFileName += "_sign";

        }


        return afterFileName + ".pdf";

    }


    //計算動態表達式的值

    public static T? Eval<T>(string expr, object context)

    {

        if (string.IsNullOrWhiteSpace(expr))

            return default;


        var target = new Interpreter();

        var input = JObject.FromObject(context);


        target.SetVariable("input", input.ToObject<ExpandoObject>());

        return target.Eval<T>(expr);

    }

}

  1. 測試調用

using Newtonsoft.Json;

using PdfSign;


//讀取簽名所需配置文件

var signOpts = await GetSignOpt();


if (signOpts != null && signOpts.Any())

{

    //執行 pdf 文件蓋章

    var signFileName= SignService.PdfSign(signOpts, "test");

}


//讀取配置文件

static async Task<List<SignOpt>?> GetSignOpt()

{

    var strSign = await File.ReadAllTextAsync("cfg.json");

    return JsonConvert.DeserializeObject<List<SignOpt>>(strSign);

}

  1. 效果展示
    原 pdf 文件如下圖:

  2. 最終效果如下圖:


作者:架構師小任
鏈接:https://juejin.cn/post/7377643248187080715
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。



該文章在 2024/7/22 11:41:31 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved