Nó đã đến với tôi để làm lại mã cũ có dấu hiệu tập tin PDF vào một mới, trong đó dấu hiệu MemoryStreams (mảng byte) đến và được gửi bởi các dịch vụ web. Đơn giản, phải không? Vâng, đó là ngày hôm qua. Hôm nay tôi không thể làm cho nó hoạt động được.Bắt PdfStamper để làm việc với MemoryStreams (C#, itextsharp)
Đây là mã cũ, trong đó sử dụng FileStreams và nó hoạt động:
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;
}
}
}
Dưới đây là những gì tôi đã làm lại bản thân mình mà ném System.ObjectDisposedException: Không thể truy cập một Stream khép kín.
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();
}
}
}
và nếu tôi nhận xét ra
st.Close();
nó tạo ra một tài liệu trống. Tôi đang làm gì sai?
Hãy xem [câu trả lời này] (http://stackoverflow.com/a/25427872/1729265). – mkl
Sự an toàn của chữ ký là ** không ** trách nhiệm của tôi. Trách nhiệm duy nhất của tôi là áp dụng chữ ký cho MemoryStream thay vì một FileStream. Và tôi đã đặt 'st.Writer.CloseStream = false;' trước 'st.Close();' Có ai giúp tôi ký một MemoryStream không? – ADSMarko