2014-11-28 6 views
15

Пришел ко мне, чтобы переделать старый код, который подписывает 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(); 

создает пустой документ. Что я делаю не так?

+0

Посмотрите на [этот ответ] (http://stackoverflow.com/a/25427872/1729265). – mkl

+0

Безопасность подписей - это ** не ** моя ответственность. Моя единственная ответственность - применять подпись к MemoryStream вместо FileStream. И я поставил 'st.Writer.CloseStream = false;' перед 'st.Close();' Может кто-нибудь помочь мне с подписью MemoryStream, пожалуйста? – ADSMarko

ответ

17

не специфичны для кода подписи, но при работе с MemoryStream и PdfStamper, следовать этой общей схеме:

using (MemoryStream ms = new MemoryStream()) { 
    using (PdfStamper stamper = new PdfStamper(reader, ms, '\0', true)) { 
// do stuff  
    }  
    return ms.ToArray(); 
} 
  • MemoryStream реализует IDisposable, поэтому включать using заявление.
  • Инструкция PdfStamperusing позаботится об утилизации объекта, поэтому вам не нужно звонить Close() и не нужно устанавливать CloseStream.
  • Вашего фрагмент кода возвращает массив байт слишком рано, в заявлении PdfStamperusing, так что ваш MemoryStream не эффективен не оп. Верните массив байтов за пределами из и внутриMemoryStreamusing заявление.
  • Как правило, нет необходимости возвращать MemoryStreamPosition.
  • Игнорировать конструктор PdfStamper выше - это из некоторого тестового кода, который у меня был для заполнения форм, и использовать любой конструктор/метод, который вам нужен для подписания.
+0

Спасибо, @kuujinbo, вы спасатель жизни. Теперь, как я могу избавиться от этого downvote, так как вопрос был совершенно законным? – ADSMarko

+0

@ADSMarko: Просто идиосинкразия SO, поэтому не позволяйте ей добраться до вас. :) По какой-то причине кому-то не понравился ваш вопрос. Для того, что это стоит, я бы не ответил, если бы думал, что это не законный вопрос, и я вижу, что ** намного хуже, чем не спускаться вниз, так что у меня есть верхняя часть. Если возможно, подумайте об изменении заголовка вопроса, чтобы отразить прямое отношение 'PdfStamper' /' MemoryStream', поскольку это была основная проблема. – kuujinbo

+0

сделаю, @kuujinbo. Спасибо – ADSMarko

Смежные вопросы