codeprj上有itextsharp3制作pdf签名的范例。但是由于itextsharp签名显示为英文,所有需要修改。网上只有itextsharp5的源码了,下载编译发现接口变了。网上搜了很久才找到代码完成,故贴出供大家参考
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Crypto.Parameters;
namespace ConsoleApplication1
{
class Program
{
public static string certFile = @"C:\Users\Administrator\Desktop\你的数字签名文件.pfx";
public static string certPassword = "你的数字签名文件密码";
public static string SRC = @"C:\Users\Administrator\Desktop\支付申请.pdf";
public static string DEST = @"C:\Users\Administrator\Desktop\支付申请aa2.pdf";
public static string imageFile = @"C:\Users\Administrator\Desktop\sign.png";
static void Main(string[] args)
{
FileStream stream = File.OpenRead(SRC);
var b = new byte[stream.Length];
stream.Read(b, 0, b.Length);
var res = SignPdf(certFile, certPassword, b);
File.Delete(DEST);
var f = File.OpenWrite(DEST);
f.Write(res, 0, res.Length);
f.Close();
}
static byte[] SignPdf(string pfxFile,string pfxPass,byte[] input)
{
byte[] data = null;
var store = new Pkcs12Store(new FileStream(pfxFile, FileMode.Open), pfxPass.ToCharArray());
var alias = "";
// searching for private key
foreach (string al in store.Aliases)
if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate)
{
alias = al;
break;
}
var pk = store.GetKey(alias);
ICollection<Org.BouncyCastle.X509.X509Certificate> chain = store.GetCertificateChain(alias).Select(c => c.Certificate).ToList();
var parameters = pk.Key as RsaPrivateCrtKeyParameters;
using (MemoryStream output = new MemoryStream())
{
PdfReader reader = new PdfReader(input);
// Set the reader (PdfReader) and output (Stream) first
PdfStamper stamper = PdfStamper.CreateSignature(reader, output, '\0');
PdfSignatureAppearance signatureAppearance = stamper.SignatureAppearance;
signatureAppearance.Acro6Layers = false;
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
signatureAppearance.Reason = "I love signing";
signatureAppearance.LocationCaption = "";
signatureAppearance.SignatureGraphic = Image.GetInstance(imageFile);
signatureAppearance.SetVisibleSignature(
new Rectangle(470, 10, 600, 60),
reader.NumberOfPages,
"Signature");
IExternalSignature signature = new PrivateKeySignature(parameters, DigestAlgorithms.SHA256);
MakeSignature.SignDetached(signatureAppearance, signature, chain, null, null, null, 0, CryptoStandard.CMS);
stamper.Close();
data = output.ToArray();
}
return data;
}
}
}