Пришел ко мне, чтобы переделать старый код, который подписывает PDF-файлы на новый, который подписывает MemoryStreams (байтовые массивы), которые приходят и отправляются веб-службами. Простой, не так ли? Ну, это было вчера. Сегодня я просто не могу заставить его работать.Получение PdfStamper для работы с MemoryStreams (C#, itextsharp)
Это старый код, который использует и потокового видео он работает:
public static string OldPdfSigner(PdfReader pdfReader, string destination, string password, string reason, string location, string pathToPfx)
{
using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, FileAccess.Read))
{
...
using (PdfStamper st = PdfStamper.CreateSignature(pdfReader, new FileStream(destination, FileMode.Create, FileAccess.Write), '\0'))
{
PdfSignatureAppearance sap = st.SignatureAppearance;
sap.SetCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.Reason = reason;
sap.Location = location;
return destination;
}
}
}
Ниже то, что я переделана себя, который бросает System.ObjectDisposedException: Не удается получить доступ к закрытой Stream.
public static byte[] PdfSigner(PdfReader pdfReader, string password, string reason, string location, string pathToPfx)
{
using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, FileAccess.Read))
{
...
MemoryStream outputStream = new MemoryStream();
using (PdfStamper st = PdfStamper.CreateSignature(pdfReader, outputStream, '\0'))
{
st.Writer.CloseStream = false;
PdfSignatureAppearance sap = st.SignatureAppearance;
sap.SetCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.Reason = reason;
sap.Location = location;
st.Close();
outputStream.Position = 0;
return outputStream.ToArray();
}
}
}
и если я закомментировать
st.Close();
создает пустой документ. Что я делаю не так?
Посмотрите на [этот ответ] (http://stackoverflow.com/a/25427872/1729265). – mkl
Безопасность подписей - это ** не ** моя ответственность. Моя единственная ответственность - применять подпись к MemoryStream вместо FileStream. И я поставил 'st.Writer.CloseStream = false;' перед 'st.Close();' Может кто-нибудь помочь мне с подписью MemoryStream, пожалуйста? – ADSMarko