公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

通過代碼實(shí)現(xiàn) PDF文件自動(dòng)蓋章

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

序言

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

Nuget 包

本文的核心包為:

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

  • DynamicExpresso,一個(gè)非常好用的動(dòng)態(tài)表達(dá)式解析工具包

<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>



素材準(zhǔn)備

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

[

  {

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

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

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

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

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

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

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

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

    "Rotation" : 0//素材的旋轉(zhuǎn)角度

  },

  {

    "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"//文本素材的表達(dá)式,也可以直接寫固定文本

  }

]


說明:

  1. 這里之所以設(shè)計(jì)為一個(gè)數(shù)組,是因?yàn)榭赡苡行﹫?chǎng)景下,不僅需要蓋電子章,還需要自動(dòng)簽上日期,比如本案例。

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

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

代碼展示

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

  1. 配置文件類,與上一步的 json 配置文件對(duì)應(yīng)

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)

        {

            //創(chuàng)建蓋章后生成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);

            //讀取頁數(shù)

            var pdfPageSize = pdfReader.NumberOfPages;

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

            var size = pdfReader.GetPageSize(1);

            //通過表達(dá)式計(jì)算出簽署的絕對(duì)坐標(biāo)

            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);

                        //設(shè)置圖片比例

                        image.ScalePercent(opt.ScalePercent);

                        //設(shè)置圖片的絕對(duì)位置,位置偏移方向?yàn)椋鹤蟮接?下到上

                        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";

    }


    //計(jì)算動(dòng)態(tài)表達(dá)式的值

    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. 測(cè)試調(diào)用

using Newtonsoft.Json;

using PdfSign;


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

var signOpts = await GetSignOpt();


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

{

    //執(zhí)行 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. 最終效果如下圖:


作者:架構(gòu)師小任
鏈接:https://juejin.cn/post/7377643248187080715
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。



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

主站蜘蛛池模板: 国产指交视频在线观看 | 91午夜在线 | 91大神精品长腿在线观看网站 | 91欧美在线视频 | 国产自偷在线拍精品热乐播av | 国产精品露脸国 | 国产麻豆91传媒入口 | 国产成人精品自在线拍 | 国产美女a做受大片在线观看 | 国产a毛片精品日日夜 | 精品无码国产一区二区三区51安 | 精品久久久久久无码专区 | 国产精品免费av片 | 国产女人喷潮视频在线观看 | 国产成人做受免费视频 | 97人妻久久公开视频 | 成人精品国产一区 | 99久久久精品综合 | av中文字幕不卡无码 | 国产午夜福利电影免费在线观看 | 国产一区二区三区免费观看久久 | 国产成人综合亚洲日韩欧美 | 国产成人综合αv在线 | 国产猛烈高潮 | 国产精品黄页网站在线播放免费 | 国产综合久久一区二区三区 | 变态另类sm一区二区三区 | 国产超碰人人模人人爽人人喊 | 国产欧美精品国产第一区 | 国产日韩成人精品视频 | 国产亚洲人成在线影院 | 国产激情久久亚洲欧美视频在线 | 国产成年女人免费视频播放a | 成人午夜性a级毛片免费 | 激情国产原创在线观看 | 国语做受对白xxx | 国产成人在线播放免费视频 | 国产成人无码久久 | 99国产精品免费观看视频 | www内射国产在 | 91国在线国内在线播放 |