2014-11-19 7 views
0

Мне нужно динамически создавать PDF-файл, поэтому я использую MemoryStream и iTextSharp для редактирования PDF. Но я хочу, чтобы цифровая подпись PDF-файла перед отправкой в ​​браузер. Я видел в примерном проекте, что iTextSharp имеет класс PDFSigner, который в основном выполняет всю работу. Но, как я видел его, он работает так:Значок iTextSharp PDF, созданный в MemoryStream

PDFSigner signer = new PDFSigner(inputFileName, outputFileName, certificate, metaData); 
signer.Sign(......) 

Но с MemoryStream, я не могу обеспечить физическое имя файла для ввода или вывода сигнала. Мой код ниже:

MemoryStream memoryStream = new MemoryStream(); 
var document = new Document(iTextSharp.text.PageSize.LETTER, 40, 40, 60, 40); 
PdfWriter.GetInstance(document, memoryStream).CloseStream = false; 

document.Open(); 
PopulatePDF(document, someId); 
document.Close(); 

byte[] byteArray = memoryStream.ToArray(); 

memoryStream.Write(byteArray, 0, byteArray.Length); 
memoryStream.Position = 0; 

return new FileStreamResult(memoryStream, "application/pdf"); 

Мой вопрос, как я могу использовать объект PDFSigner подписать документ, дающий, что PDFSigner принимает только строки - имена файлов в качестве аргументов.

+2

Я мог ошибаться, но я не думаю, что iText на самом деле имеет класс под названием «PDFSigner», по крайней мере, тот, который я мог найти. Вы нашли этот код через онлайн-учебник? Кроме того, какую версию iTextSharp вы используете? –

+0

Я использую iTextSharp 5.5.3, а приведенный выше код из этого проекта: (который использует класс PDFSigner, который работает и делает подпись) http://www.codeproject.com/Articles/14488/E-signing- PDF-документы-с-iTextSharp – byby9999

ответ

0

Как объяснил Крис Хаас, в iText нет класса с именем PdfSigner. Возможно, вы используете неофициальную версию iText, и в этом случае вам нужно убедиться, что вы правильно применяете цифровую подпись.

Подробнее о правильных цифровых подписях читайте в книге, которую я написал о digital signatures.

В принципе, это то, как вы бы подписать с помощью PKCS # 12: хранилище ключей

Pkcs12Store store = new Pkcs12Store(new FileStream(KEYSTORE, FileMode.Open), PASSWORD); 
String alias = ""; 
ICollection<X509Certificate> chain = new List<X509Certificate>(); 
// searching for private key 
foreach (string al in store.Aliases) 
    if (store.IsKeyEntry(al) && store.GetKey(al).Key.IsPrivate) { 
     alias = al; 
     break; 
    } 
AsymmetricKeyEntry pk = store.GetKey(alias); 
foreach (X509CertificateEntry c in store.GetCertificateChain(alias)) 
    chain.Add(c.Certificate); 
RsaPrivateCrtKeyParameters parameters = pk.Key as RsaPrivateCrtKeyParameters; 

PdfReader reader = new PdfReader(src); 
FileStream os = new FileStream(dest, FileMode.Create); 
PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0'); 
// Creating the appearance 
PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
appearance.Reason = "My reason for signing"; 
appearance.Location = "The middle of nowhere"; 
appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
// Creating the signature 
IExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256); 
MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, CryptoStandard.CMS); 

Очевидно, что вы хотите заменить null значения с реализациями, которые получают информацию об аннулировании и, возможно, даже позволяют метку времени, но это не ваш вопрос.

Ваш вопрос: могу ли я предоставить PDF-документ, который существует только в памяти? Ответ да: параметр src при создании экземпляра PdfReader может быть путем к файлу на диске, но он также может быть byte[], который получается из MemoryStream.

+0

Спасибо. Да, на самом деле нет официального класса PDFSigner, автор проекта, который я нашел, создал этот класс в качестве помощника, и он использовал PdfStamper в нем. – byby9999

+0

Каков вход для KEYSTORE на первой строке? – Cerveser

+0

@Cerveser Это путь к хранилищу ключей, например, файл '.p12', который содержит открытую и закрытую пару ключей. Поскольку закрытый ключ является закрытым, его нельзя использовать. –

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