ITextSharp 批量电子签章

ITextSharp 批量电子签章

网上查了很多资料,都没找到可以批量签章的控件,只能自己翻资料PDF签名格式解析、ITextSharp源码,总算是解决了。
其实实现只需要改几行ITextSharp源码,
iTextSharp.text.pdf.PdfSignatureAppearance
添加属性

        /// <summary>
        /// 多页签章
        /// </summary>
        private List<int> pageList = new List<int> { 1, 2 };

修改PreClose方法

        virtual public void PreClose(Dictionary<PdfName, int> exclusionSizes)
        {
            if (preClosed)
                throw new DocumentException(MessageLocalization.GetComposedMessage("document.already.pre.closed"));
            stamper.MergeVerification();
            preClosed = true;
            AcroFields af = writer.GetAcroFields();
            String name = FieldName;
            bool fieldExists = af.DoesSignatureFieldExist(name);
            PdfIndirectReference refSig = writer.PdfIndirectReference;
            writer.SigFlags = 3;
            PdfDictionary fieldLock = null;
            if (fieldExists)
            {
                PdfDictionary widget = af.GetFieldItem(name).GetWidget(0);
                writer.MarkUsed(widget);
                fieldLock = widget.GetAsDict(PdfName.LOCK);

                if (fieldLock == null && FieldLockDict != null)
                {
                    widget.Put(PdfName.LOCK, writer.AddToBody(FieldLockDict).IndirectReference);
                    fieldLock = FieldLockDict;
                }

                widget.Put(PdfName.P, writer.GetPageReference(Page));
                widget.Put(PdfName.V, refSig);
                PdfObject obj = PdfReader.GetPdfObjectRelease(widget.Get(PdfName.F));
                int flags = 0;
                if (obj != null && obj.IsNumber())
                    flags = ((PdfNumber)obj).IntValue;
                flags |= PdfAnnotation.FLAGS_LOCKED;
                widget.Put(PdfName.F, new PdfNumber(flags));
                PdfDictionary ap = new PdfDictionary();
                ap.Put(PdfName.N, GetAppearance().IndirectReference);
                widget.Put(PdfName.AP, ap);
            }
            else
            {
                PdfFormField sigField = PdfFormField.CreateSignature(writer);
                sigField.FieldName = name;
                sigField.Put(PdfName.V, refSig);
                sigField.Flags = PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED;

                if (FieldLockDict != null)
                {
                    sigField.Put(PdfName.LOCK, writer.AddToBody(FieldLockDict).IndirectReference);
                    fieldLock = FieldLockDict;
                }

                int pagen = Page;
                if (!IsInvisible())
                    sigField.SetWidget(PageRect, null);
                else
                    sigField.SetWidget(new Rectangle(0, 0), null);
                sigField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, GetAppearance());

                foreach (var item in pageList)
                {
                    sigField.Page = item;
                    writer.AddAnnotation(sigField, item);
                }
            }

            exclusionLocations = new Dictionary<PdfName, PdfLiteral>();
            if (cryptoDictionary == null)
            {
                throw new DocumentException("No crypto dictionary defined.");
            }
            else
            {
                PdfLiteral lit = new PdfLiteral(80);
                exclusionLocations[PdfName.BYTERANGE] = lit;
                cryptoDictionary.Put(PdfName.BYTERANGE, lit);
                foreach (KeyValuePair<PdfName, int> entry in exclusionSizes)
                {
                    PdfName key = entry.Key;
                    int v = entry.Value;
                    lit = new PdfLiteral(v);
                    exclusionLocations[key] = lit;
                    cryptoDictionary.Put(key, lit);
                }
                if (certificationLevel > 0)
                    AddDocMDP(cryptoDictionary);
                if (fieldLock != null)
                    AddFieldMDP(cryptoDictionary, fieldLock);
                if (signatureEvent != null)
                    signatureEvent.GetSignatureDictionary(cryptoDictionary);
                writer.AddToBody(cryptoDictionary, refSig, false);
            }
            if (certificationLevel > 0)
            {
                // add DocMDP entry to root
                PdfDictionary docmdp = new PdfDictionary();
                docmdp.Put(new PdfName("DocMDP"), refSig);
                writer.reader.Catalog.Put(new PdfName("Perms"), docmdp);
            }
            writer.Close(stamper.MoreInfo);

            range = new long[exclusionLocations.Count * 2];
            long byteRangePosition = exclusionLocations[PdfName.BYTERANGE].Position;
            exclusionLocations.Remove(PdfName.BYTERANGE);
            int idx = 1;
            foreach (PdfLiteral lit in exclusionLocations.Values)
            {
                long n = lit.Position;
                range[idx++] = n;
                range[idx++] = lit.PosLength + n;
            }
            Array.Sort(range, 1, range.Length - 2);
            for (int k = 3; k < range.Length - 2; k += 2)
                range[k] -= range[k - 1];

            if (tempFile == null)
            {
                bout = sigout.Buffer;
                boutLen = sigout.Size;
                range[range.Length - 1] = boutLen - range[range.Length - 2];
                ByteBuffer bf = new ByteBuffer();
                bf.Append('[');
                for (int k = 0; k < range.Length; ++k)
                    bf.Append(range[k]).Append(' ');
                bf.Append(']');
                Array.Copy(bf.Buffer, 0, bout, byteRangePosition, bf.Size);
            }
            else
            {
                try
                {
                    raf = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite);
                    long len = raf.Length;
                    range[range.Length - 1] = len - range[range.Length - 2];
                    ByteBuffer bf = new ByteBuffer();
                    bf.Append('[');
                    for (int k = 0; k < range.Length; ++k)
                        bf.Append(range[k]).Append(' ');
                    bf.Append(']');
                    raf.Seek(byteRangePosition, SeekOrigin.Begin);
                    raf.Write(bf.Buffer, 0, bf.Size);
                }
                catch (IOException e)
                {
                    try { raf.Close(); } catch { }
                    try { File.Delete(tempFile); } catch { }
                    throw e;
                }
            }
        }

改动只有这一块,每页都添加上签名图像

                foreach (var item in pageList)
                {
                    sigField.Page = item;
                    writer.AddAnnotation(sigField, item);
                }

pageList可以自己写个Set方法赋上值

代码很简单,但是找到要改哪块代码却挺费劲,以后有时间再写写解决思路…

也算是劳动成功,我要加上句转载请注明原文链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iTextSharp是一个流行的用于生成和修改PDF文件的开源库。虽然它可以在PDF中添加图片,但是由于PDF的特性限制,直接在PDF中手写签名图片是不可能的。但是,可以使用iTextSharp来实现将手写签名图片作为一个图像对象插入到PDF中的功能。 首先,我们需要将手写签名图片保存为一个图像文件,比如PNG或JPEG格式。然后,使用iTextSharp提供的Image类来创建一个图像对象,将手写签名图片读入该对象。可以通过指定图像的路径或使用内存流的方式实现。 下一步是定位和放置手写签名图片。可以通过设置图像的坐标和尺寸来实现。例如,使用PdfWriter来绘制图像的位置并调整图像的大小。 最后,将修改后的PDF保存到文件或内存流中。 以下是一个简单的示例代码: ```csharp using iTextSharp.text; using iTextSharp.text.pdf; // 打开PDF文件并创建PdfReader对象 PdfReader reader = new PdfReader("原PDF文件路径"); // 创建PdfStamper对象,并指定输出文件路径 PdfStamper stamper = new PdfStamper(reader, new FileStream("输出PDF文件路径", FileMode.Create)); // 加载手写签名图片 Image signatureImage = Image.GetInstance("手写签名图片路径"); // 设置手写签名图片的位置和尺寸 signatureImage.SetAbsolutePosition(x, y); // 设置图片左下角的坐标(x, y) signatureImage.ScaleToFit(width, height); // 设置图片缩放比例 // 获取PDF的第一页 PdfContentByte content = stamper.GetOverContent(1); // 将手写签名图片添加到PDF中 content.AddImage(signatureImage); // 关闭PdfStamper和PdfReader stamper.Close(); reader.Close(); ``` 通过这种方法,我们可以将手写签名图片作为一个图像对象插入到PDF中。但需要注意的是,iTextSharp仅提供了将图像对象插入到PDF中的功能,具体的手写签名图片生成过程需要借助其他的工具或技术来实现。 ### 回答2: iTextSharp是一个用于生成和处理PDF文档的开源库,它提供了丰富的功能和方法来创建和编辑PDF文件。要在PDF文件中添加手写签名图片,可以按照以下步骤进行: 1. 准备手写签名图片:首先,您需要准备一张手写签名的图片。可以使用各种工具或设备(如平板电脑、手机等)手写签名,并将签名保存为图片格式,如JPEG或PNG。 2. 导入iTextSharp库:在使用iTextSharp之前,您需要将iTextSharp库导入到您的项目中。可以从iTextSharp的官方网站上下载最新版本的库,并按照安装说明将它导入到您的项目中。 3. 创建PDF文件:使用iTextSharp库的API,您可以创建一个空的PDF文件或加载现有的PDF文件。 4. 添加签名图片:使用iTextSharp库的API,您可以在PDF文件的指定位置添加图片。首先,您需要确定签名应该放置在PDF页面的哪个位置。然后,您可以使用以下代码将签名图片添加到指定位置: ```C# using iTextSharp.text; using iTextSharp.text.pdf; // 创建PDF文档对象 Document document = new Document(); // 创建PDF写入器 PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("output.pdf", FileMode.Create)); // 打开PDF文档 document.Open(); // 读取签名图片 Image image = Image.GetInstance("signature.jpg"); image.ScaleToFit(100, 100); // 将签名图片添加到PDF页面的指定位置 image.SetAbsolutePosition(100, 100); document.Add(image); // 关闭PDF文档 document.Close(); ``` 在上述代码中,您需要将"signature.jpg"替换为您准备好的手写签名图片的文件路径。image.ScaleToFit(100, 100)用于调整签名图片的大小,您可以根据需要进行调整。image.SetAbsolutePosition(100, 100)用于指定签名图片在PDF页面上的位置。 5. 保存PDF文件:使用iTextSharp库的API,您可以将生成的PDF文件保存到本地文件系统中。 以上就是用iTextSharp库实现手写签名图片添加到PDF文件中的基本步骤和代码实例。希望对您有所帮助! ### 回答3: iTextSharp是一个用于创建和处理PDF文件的开源库,可以在C#中使用。这个库可以用来在PDF文档中插入图片,因此我们可以使用它来手写签名图片。 首先,我们需要准备一张手写签名的图片。可以使用任何绘图工具,例如Photoshop或者在线绘图工具,在一个透明背景的画布上手写签名,然后导出为PNG或者JPEG格式的图片。 然后,我们需要使用iTextSharp库加载需要进行签名的PDF文档。可以使用PdfReader类来打开PDF文件,例如: PdfReader reader = new PdfReader("input.pdf"); 接下来,我们需要创建一个PdfStamper对象,它允许我们向PDF文档添加内容。可以使用PdfStamper的构造函数来创建一个PdfStamper对象,例如: PdfStamper stamper = new PdfStamper(reader, new FileStream("output.pdf", FileMode.Create)); 现在,我们可以使用PdfContentByte对象将手写签名图片添加到PDF文档中。可以使用CreateAppearance方法创建一个PdfAppearance对象,并使用AddImage方法将手写签名图片添加到PdfAppearance对象中,例如: PdfContentByte canvas = stamper.GetOverContent(1); Image image = Image.GetInstance("signature.png"); image.ScaleAbsolute(100, 100); PdfAppearance appearance = canvas.CreateAppearance(100, 100); appearance.AddImage(image); 最后,我们需要定义签名的位置,并将PdfAppearance对象添加到PDF文档中。可以使用Rectangle对象定义签名的位置,然后使用AddAnnotation方法将签名添加到PDF文档中,例如: Rectangle rect = new Rectangle(100, 100, 200, 200); PdfAnnotation signature = PdfAnnotation.CreateSignature(stamper.Writer, rect, "Signature", "xxx", PdfAnnotation.FLAGS_PRINT); signature.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, appearance); stamper.AddAnnotation(signature, 1); 最后,我们需要保存修改后的PDF文档,并关闭相关的对象,例如: stamper.Close(); reader.Close(); 以上就是使用iTextSharp库在PDF文档中添加手写签名图片的步骤。使用这个方法,我们可以简单地将手写签名图片嵌入到PDF文档中,达到手写签名的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值