我有一个对PDF文件进行数字签名的应用程序。
但我无法在开发人员计算机上对超过400mb的文件进行数字签名。
我使用以下代码进行签名。调用Close
的方法PdfSignatureAppearance
时,此代码会抛出OutOfMemoryException。
使用较小的文件,它可以正常工作。
当我需要签署大文件时,我该怎么做才能避免内存不足?
这是我的代码:
private static void ApplySignatureDictionary(PdfSignatureAppearance sap, byte[] pk)
{
try
{
byte[] outc = new byte[8092];
PdfDictionary dicSignature = new PdfDictionary();
Array.Copy(pk, 0, outc, 0, pk.Length);
dicSignature.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));
sap.Close(dicSignature); //This throws a OutOfMemoryException, for files bigger than 400mb
}
catch (OutOfMemoryException omEx)
{
throw new Exception("Not enough memory to sign the file.", omEx);
}
catch (Exception ex)
{
throw ex;
}
}
其中pk
是Org.BouncyCastle.Cms.CmsSignedData.GetEncoded()
编辑:
我以这种方式实例化PdfReader和PdfStamper:
PdfReader:
PdfReader reader = new PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(inputPDF), null);
和
PdfStamper:
MemoryStream mFile = new MemoryStream();
PdfStamper stamper = PdfStamper.CreateSignature(reader, mFile, '\0');