C#编程下对PDF文件进行图片签名的方法教程
小标 2018-08-14 来源 : 阅读 2995 评论 0

摘要:本文主要向大家介绍了C#编程下对PDF文件进行图片签名的方法教程,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程下对PDF文件进行图片签名的方法教程,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

能够对pdf进行图片签名的,网上找来找去,就一个iText是免费的,但这个免费是AGPL协议,当然它也有商业协议,iText现在有5和7两个版本,这里我采用的是版本5。
然后为了多做比较,我这里还找了Spire.PDF进行测试,其免费版本Free.Spire.PDF还是3.2版本,而其收费版本目前为4.2版本,这里先直接说测试结果,免费版本可以进行数字签名,但图片签名不行,只要将图片赋给对应参数,保存时必定报转化异常,而4.2版本代码与3.2的相比需要稍作调整(只是建议性质,不调整也能运行),可以成功保存,另外收费版本的我还找了PDF-Writer,因为它的例子本身就包含了图片签名部分,所以这里不做描述,以下是iText和Spire代码:
using iTextSharp.text.pdf.security;using Org.BouncyCastle.Pkcs;//这是itext自带的,不需要单独添加BouncyCastle包using System.Drawing; public class PdfDigstSign{    static string pfxPath = "001180530510644.pfx";    static string pfxPwd = "111111";    static string sourcePdf = "template.pdf";    static string imgPath = "password_1.png";    public static void PDFSignWithIText5Demo()    {        string outPutPdf = "ImageStampWithIText5.pdf";        var reader = new iTextSharp.text.pdf.PdfReader(sourcePdf);        using (FileStream fs = new FileStream(outPutPdf, FileMode.Create))        {            var stamper = iTextSharp.text.pdf.PdfStamper.CreateSignature(reader, fs, '\0', null, true);            var appearance = stamper.SignatureAppearance;            appearance.Reason = "签名测试原因";            appearance.Location = "签名位置";            appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(200, 200, 300, 300), 1, "itext");            //itext会自动对图片进行等比例缩放            appearance.SignatureGraphic = iTextSharp.text.Image.GetInstance(imgPath);            appearance.CertificationLevel = iTextSharp.text.pdf.PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED;            appearance.SignatureRenderingMode = iTextSharp.text.pdf.PdfSignatureAppearance.RenderingMode.GRAPHIC;              using (var stream = File.OpenRead(pfxPath))            {                Pkcs12Store store = new Pkcs12Store(stream, pfxPwd.ToCharArray());                string keyAlias = null;                foreach (string alias in store.Aliases)                {                    keyAlias = alias;                    break;                }                var chains = store.GetCertificateChain(keyAlias).Select(c => c.Certificate).ToList();                var signature = new PrivateKeySignature(store.GetKey(keyAlias).Key, DigestAlgorithms.SHA1);                MakeSignature.SignDetached(appearance, signature, chains, null, null, null, 0, CryptoStandard.CADES);            }        }    }    public static void PDFSignWithSpirePDF4_2Demo()    {        //必须要商业版才行        var doc = new Spire.Pdf.PdfDocument();        doc.LoadFromFile(sourcePdf);        var page = doc.Pages[0];         var cert = new Spire.Pdf.Security.PdfCertificate(pfxPath, pfxPwd);        var signature = new Spire.Pdf.Security.PdfSignature(doc, page, cert, "spire");        //        var loApprearance = signature.Appearence;        var image = Spire.Pdf.Graphics.PdfImage.FromFile(imgPath);        var template = new Spire.Pdf.Graphics.PdfTemplate(image.Width, image.Height);        template.Graphics.DrawImage(image, 0, 0,100,100);//spire由代码指定缩放        loApprearance.Normal = template;        signature.Bounds = new RectangleF(new PointF(100, 100), new SizeF(100, 100));        signature.Reason = "签名原因";        signature.LocationInfo = "签名位置";        signature.GraphicsMode = Spire.Pdf.Security.GraphicMode.SignNameOnly;        signature.DocumentPermissions = Spire.Pdf.Security.PdfCertificationFlags.ForbidChanges;        string output = "ImageStampWithSpirePDF4_2.pdf";        doc.SaveToFile(output);    }}
上述代码运行完后,两者的签名面板部分稍有不同,具体如下:


生成的pdf虽然都无法修改,但感觉还是iText生成的更靠谱些……    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved