나는 주어진 pdf의 각 페이지를 디지털 방식으로 서명하는 것을 시도하고있다. 그러나 첫 번째 또는 마지막 페이지에만 서명합니다. 나는 그 문제가 MakeSignature.SignDetached() 메쏘드에 있다는 것을 알아 냈다고 생각한다. 이 메소드는 모든 스트림을 닫고 추가 서명을 위해 pdf를 닫습니다.MakeSignature.SignDetached() 메소드없이 PDF에 디지털 서명하는 방법은 무엇입니까?
내 코드 :
public static void SignInForEveryPage(string input, string output, PDFEncryption pdfEnc, bool encrypt, bool passCheck, string pass) {
X509CertificateParser cp = new X509CertificateParser();
X509Certificate[] chain = { cp.ReadCertificate(CertInfo.MyCert.RawData) };
IExternalSignature externalSignature = new X509Certificate2Signature(CertInfo.MyCert, "SHA-1");
//Setup signature
if(File.Exists(output)) {
File.Delete(output);
}
PdfSignatureAppearance signatureAppearance=null;
PdfSignatureAppearance tempAppearance = null;
PdfReader reader = new PdfReader(input);
FileStream firstFileStream = new FileStream(output, FileMode.Create, FileAccess.ReadWrite);
PdfStamper pdfStamper = PdfStamper.CreateSignature(reader, firstFileStream, '\0', null, true);
for(int index = 1; index <= reader.NumberOfPages; index++) {
if(encrypt && pdfEnc != null) {
pdfEnc.Encrypt(pdfStamper);
}
if(passCheck) {
pdfStamper.SetEncryption(PdfWriter.STRENGTH128BITS, "123", "123", PdfWriter.ALLOW_COPY);
//Set password of output file
}
//Write the metadata
pdfStamper.MoreInfo = MetaData.GetMetaData();
pdfStamper.XmpMetadata = MetaData.GetStreamedMetaData();
//Set signature appearance
signatureAppearance = pdfStamper.SignatureAppearance;
signatureAppearance.Reason = ReasonText; //Reason
signatureAppearance.Contact = ContactText; //Contact
signatureAppearance.Location = LocationText; //Location
byte[] rawData = null;
var customText = "";
//Set the text shown in signature
customText += "Digitally Signed by:\n";
customText += CertInfo.CertName + "\n";
if(!string.IsNullOrEmpty(LocationText)) {
customText += "Location: ";
customText += LocationText + "\n";
}
if(!string.IsNullOrEmpty(ReasonText)) {
customText += "Reason: ";
customText += ReasonText + "\n";
}
customText += "Date: ";
customText += DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss K") + "\n";
customText = customText.TrimEnd();
//set the image shown in signature
if(ShowImage && SignaturePictureImage != null) {
using(MemoryStream memoryStream = new MemoryStream()) {
SignaturePictureImage.Save(memoryStream, ImageFormat.Bmp);
rawData = memoryStream.ToArray();
}
}
//For signature position and size
var sigX = Mm2Pt(LeftNumValue);
var sigY = Mm2Pt(BottomNumValue);
var sigW = Mm2Pt(WidthNumValue);
var sigH = Mm2Pt(HeightNumValue);
//Draw the rectangle for signature field
//pdfStamper.Reader.GetPageSize(index);
signatureAppearance.SignatureGraphic = rawData == null ? null : iTextSharp.text.Image.GetInstance(rawData);
signatureAppearance.Layer2Text = customText;
signatureAppearance.Layer4Text = ""; //if null or not set then it will show 'signature not valid'
signatureAppearance.Acro6Layers = true;
if(signatureAppearance.SignatureGraphic != null) {
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
//show image first then text in the signature
}
signatureAppearance.SetVisibleSignature(new Rectangle(sigX, sigY, sigX + sigW, sigY + sigH), index, null);
signatureAppearance.GetLayer(1);
tempAppearance = signatureAppearance;
MakeSignature.SignDetached(tempAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
}
}
내가 iTextSharp 라이브러리를 사용하고 있습니다. 이 코드를 수정하는 방법이 있습니까?
엄밀히 말하면 "iText를 사용하여 모든 문서 페이지에 디지털 PDF 서명을 표시하는 방법 (http://stackoverflow.com/a/35724742/1729265)"은 iTextSharp가 아니라 iText에 관한 것이지만 그곳의 인수는 동일하게 유지하십시오. – mkl
감사합니다. @mkl, 나는 모든 주장을 요약 한 것을 몰랐습니다. 나는 방금 그것을 upvoted. –
@furiousNoob *이 메서드는 모든 스트림을 닫고 추가 서명을 위해 pdf를 닫습니다. * 이미 통합 된 PDF 서명 문제를 알고있는 경우 "각 단일 시각화로 여러 서명 (한 페이지 당 하나씩)"을 선택했습니다. 내가 참조한 대답, 그리고 지금 구현에 어려움이 있으니 그에 맞게 질문을 업데이트하십시오. 결국 다시 열리고 대답 될 것입니다. – mkl