public ActionResult Start(int id) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set a SecurityContext to be used to determine trust in the certificate chain SecurityContextId = StandardSecurityContexts.PkiBrazil, // Note: By changing the SecurityContext above you can accept certificates from a custom security context created on the Rest PKI website. // Set a visual representation for the signature VisualRepresentation = new PadesVisualRepresentation() { // The tags {{signerName}} and {{signerNationalId}} will be substituted according to the user's certificate // signerName -> full name of the signer // signerNationalId -> if the certificate is ICP-Brasil, contains the signer's CPF Text = new PadesVisualText("Signed by {{signerName}} ({{signerNationalId}})") { // Specify that the signing time should also be rendered IncludeSigningTime = true, // Optionally set the horizontal alignment of the text ('Left' or 'Right'), if not set the default is Left HorizontalAlign = PadesTextHorizontalAlign.Left }, // We'll use as background the image in Content/PdfStamp.png Image = new PadesVisualImage(Util.GetPdfStampContent(), "image/png") { // Opacity is an integer from 0 to 100 (0 is completely transparent, 100 is completely opaque). Opacity = 50, // Align the image to the right HorizontalAlign = PadesHorizontalAlign.Right }, // Position of the visual representation. We have encapsulated this code in a method to include several // possibilities depending on the argument passed. Experiment changing the argument to see different examples // of signature positioning. Once you decide which is best for your case, you can place the code directly here. Position = getVisualPositioning(1) } }; // Set the document to be signed based on its ID (passed to us from the page) signatureStarter.SetPdfToSign(Util.GetBatchDocContent(id)); // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see javascript on the view) and also to complete the signature // on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); // Notice: it is not necessary to call SetNoCacheHeaders() because this action is a POST action, therefore no caching // of the response will be made by browsers. // Return a JSON with the token obtained from REST PKI (the page will use jQuery to decode this value) return(Json(token)); }
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set the security context to be used to determine trust in the certificate chain SecurityContextId = Util.GetSecurityContextId(), // Set a visual representation for the signature (see function below) VisualRepresentation = getVisualRepresentation(), }; /* * Optionally, add marks to the PDF before signing. These differ from the signature visual representation in that * they are actually changes done to the document prior to signing, not binded to any signature. Therefore, any number * of marks can be added, for instance one per page, whereas there can only be one visual representation per signature. * However, since the marks are in reality changes to the PDF, they can only be added to documents which have no previous * signatures, otherwise such signatures would be made invalid by the changes to the document (see property * PadesSignatureStarter.BypassMarksIfSigned). This problem does not occur with signature visual representations. * * We have encapsulated this code in a method to include several possibilities depending on the argument passed. * Experiment changing the argument to see different examples of PDF marks. Once you decide which is best for your case, * you can place the code directly here. */ //signatureStarter.PdfMarks.Add(PadesVisualElements.GetPdfMark(1)); // If the user was redirected here by Upload (signature with file uploaded by user), the "userfile" URL argument // will contain the filename under the "App_Data" folder. Otherwise (signature with server file), we'll sign a sample // document. UserFile = Request.QueryString["userfile"]; if (string.IsNullOrEmpty(UserFile)) { // Set the PDF to be signed as a byte array signatureStarter.SetPdfToSign(Util.GetSampleDocContent()); } else { // Set the path of the file to be signed signatureStarter.SetPdfToSign(Server.MapPath("~/App_Data/" + UserFile)); } // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see javascript on the view) and also to complete the signature // on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); ViewState["Token"] = token; } }
public static string Start(int id) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set the security context to be used to determine trust in the certificate chain SecurityContextId = Util.GetSecurityContextId(), // Set a visual representation for the signature (see function below) VisualRepresentation = getVisualRepresentation(), }; /* * Optionally, add marks to the PDF before signing. These differ from the signature visual representation in that * they are actually changes done to the document prior to signing, not binded to any signature. Therefore, any number * of marks can be added, for instance one per page, whereas there can only be one visual representation per signature. * However, since the marks are in reality changes to the PDF, they can only be added to documents which have no previous * signatures, otherwise such signatures would be made invalid by the changes to the document (see property * PadesSignatureStarter.BypassMarksIfSigned). This problem does not occurr with signature visual representations. * * We have encapsulated this code in a method to include several possibilities depending on the argument passed. * Experiment changing the argument to see different examples of PDF marks. Once you decide which is best for your case, * you can place the code directly here. */ //signatureStarter.PdfMarks.Add(PadesVisualElements.GetPdfMark(1)); // Set the PDF to be signed signatureStarter.SetPdfToSign(Util.GetBatchDocContent(id)); // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see batch-signature-optimized-form.js) and also to complete // the signature on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); // Send to the javascript the token of the signature process to be used to call Web PKI to perform the signature return(token); }
public ActionResult Index(string userfile) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set a SecurityContext to be used to determine trust in the certificate chain SecurityContextId = StandardSecurityContexts.PkiBrazil, // Note: By changing the SecurityContext above you can accept certificates from a custom security context created on the Rest PKI website. // Set a visual representation for the signature VisualRepresentation = new PadesVisualRepresentation() { // The tags {{signerName}} and {{signerNationalId}} will be substituted according to the user's certificate // signerName -> full name of the signer // signerNationalId -> if the certificate is ICP-Brasil, contains the signer's CPF Text = new PadesVisualText("Signed by {{signerName}} ({{signerNationalId}})") { // Specify that the signing time should also be rendered IncludeSigningTime = true, // Optionally set the horizontal alignment of the text ('Left' or 'Right'), if not set the default is Left HorizontalAlign = PadesTextHorizontalAlign.Left }, // We'll use as background the image in Content/PdfStamp.png Image = new PadesVisualImage(Util.GetPdfStampContent(), "image/png") { // Opacity is an integer from 0 to 100 (0 is completely transparent, 100 is completely opaque). Opacity = 50, // Align the image to the right HorizontalAlign = PadesHorizontalAlign.Right }, // Position of the visual representation. We have encapsulated this code in a method to include several // possibilities depending on the argument passed. Experiment changing the argument to see different examples // of signature positioning. Once you decide which is best for your case, you can place the code directly here. Position = PadesVisualElements.GetVisualPositioning(1) }, }; // If the user was redirected here by UploadController (signature with file uploaded by user), the "userfile" URL argument // will contain the filename under the "App_Data" folder. Otherwise (signature with server file), we'll sign a sample // document. if (string.IsNullOrEmpty(userfile)) { // Set the PDF to be signed as a byte array signatureStarter.SetPdfToSign(Util.GetSampleDocContent()); } else { // Set the path of the file to be signed signatureStarter.SetPdfToSign(Server.MapPath("~/App_Data/" + userfile.Replace("_", "."))); // Note: we're passing the filename argument with "." as "_" because of limitations of ASP.NET MVC } /* * Optionally, add marks to the PDF before signing. These differ from the signature visual representation in that * they are actually changes done to the document prior to signing, not binded to any signature. Therefore, any number * of marks can be added, for instance one per page, whereas there can only be one visual representation per signature. * However, since the marks are in reality changes to the PDF, they can only be added to documents which have no previous * signatures, otherwise such signatures would be made invalid by the changes to the document (see property * PadesSignatureStarter.BypassMarksIfSigned). This problem does not occurr with signature visual representations. * * We have encapsulated this code in a method to include several possibilities depending on the argument passed. * Experiment changing the argument to see different examples of PDF marks. Once you decide which is best for your case, * you can place the code directly here. */ //signatureStarter.PdfMarks.Add(PadesVisualElements.GetPdfMark(1)); // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see javascript on the view) and also to complete the signature // on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); // The token acquired above can only be used for a single signature attempt. In order to retry the signature it is // necessary to get a new token. This can be a problem if the user uses the back button of the browser, since the // browser might show a cached page that we rendered previously, with a now stale token. To prevent this from happening, // we call the method SetNoCacheHeaders() (in BaseController) which sets HTTP headers to prevent caching of the page. base.SetNoCacheHeaders(); // Render the signature page with the token obtained from REST PKI return(View(new Models.PadesSignatureModel() { Token = token, UserFile = userfile })); }
private void startNextSignature() { // Increment the index of the document currently being signed DocumentIndex += 1; // Check if we have reached the end of the batch, in which case we fill the hidden field "TokenField" with value "(end)", // which signals to the javascript on batch-signature-form.js that the process is completed and the page can be unblocked. if (DocumentIndex == DocumentIds.Count) { TokenField.Value = "(end)"; return; } // Get the ID of the document currently being signed var docId = DocumentIds[DocumentIndex]; string token; try { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set the security context to be used to determine trust in the certificate chain SecurityContextId = Util.GetSecurityContextId(), // Set a visual representation for the signature (see function below) VisualRepresentation = getVisualRepresentation(), }; /* * Optionally, add marks to the PDF before signing. These differ from the signature visual representation in that * they are actually changes done to the document prior to signing, not binded to any signature. Therefore, any number * of marks can be added, for instance one per page, whereas there can only be one visual representation per signature. * However, since the marks are in reality changes to the PDF, they can only be added to documents which have no previous * signatures, otherwise such signatures would be made invalid by the changes to the document (see property * PadesSignatureStarter.BypassMarksIfSigned). This problem does not occurr with signature visual representations. * * We have encapsulated this code in a method to include several possibilities depending on the argument passed. * Experiment changing the argument to see different examples of PDF marks. Once you decide which is best for your case, * you can place the code directly here. */ //signatureStarter.PdfMarks.Add(PadesVisualElements.GetPdfMark(1)); // Set the PDF to be signed signatureStarter.SetPdfToSign(Util.GetBatchDocContent(docId)); // Call the StartWithWebPki() method, which initiates the signature. token = signatureStarter.StartWithWebPki(); } catch (ValidationException ex) { // One or more validations failed. We log the error, update the page with a summary of what happened to this document and start the next signature setValidationError(ex.ValidationResults); startNextSignature(); return; } catch (Exception ex) { // An error has occurred. We log the error, update the page with a summary of what happened to this document and start the next signature setError(ex.Message); startNextSignature(); return; } // Send to the javascript the token of the signature process to be used to call Web PKI to perform the signature TokenField.Value = token; }
public ActionResult Start(int id) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set a SecurityContext to be used to determine trust in the certificate chain SecurityContextId = StandardSecurityContexts.PkiBrazil, // Note: By changing the SecurityContext above you can accept certificates from a custom security context created on the Rest PKI website. // Set a visual representation for the signature VisualRepresentation = new PadesVisualRepresentation() { // The tags {{signerName}} and {{signerNationalId}} will be substituted according to the user's certificate // signerName -> full name of the signer // signerNationalId -> if the certificate is ICP-Brasil, contains the signer's CPF Text = new PadesVisualText("Signed by {{signerName}} ({{signerNationalId}})") { // Specify that the signing time should also be rendered IncludeSigningTime = true, // Optionally set the horizontal alignment of the text ('Left' or 'Right'), if not set the default is Left HorizontalAlign = PadesTextHorizontalAlign.Left }, // We'll use as background the image in Content/PdfStamp.png Image = new PadesVisualImage(Util.GetPdfStampContent(), "image/png") { // Opacity is an integer from 0 to 100 (0 is completely transparent, 100 is completely opaque). Opacity = 50, // Align the image to the right HorizontalAlign = PadesHorizontalAlign.Right }, // Position of the visual representation. We have encapsulated this code in a method to include several // possibilities depending on the argument passed. Experiment changing the argument to see different examples // of signature positioning. Once you decide which is best for your case, you can place the code directly here. Position = getVisualPositioning(1) } }; // Set the document to be signed based on its ID (passed to us from the page) signatureStarter.SetPdfToSign(Util.GetBatchDocContent(id)); // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see javascript on the view) and also to complete the signature // on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); // Notice: it is not necessary to call SetNoCacheHeaders() because this action is a POST action, therefore no caching // of the response will be made by browsers. // Return a JSON with the token obtained from REST PKI (the page will use jQuery to decode this value) return Json(token); }
private void startNextSignature() { // Increment the index of the document currently being signed DocumentIndex += 1; // Check if we have reached the end of the batch, in which case we fill the hidden field "TokenField" with value "(end)", // which signals to the javascript on batch-signature-form.js that the process is completed and the page can be unblocked. if (DocumentIndex == DocumentIds.Count) { TokenField.Value = "(end)"; return; } // Get the ID of the document currently being signed var docId = DocumentIds[DocumentIndex]; string token; try { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.PkiBrazil.BasicWithPkiBrazilCerts, // Note: Depending on the signature policy chosen above, setting the security context below may be mandatory (this is not // the case for ICP-Brasil policies, which will automatically use the PkiBrazil security context if none is passed) // Optionally, set a SecurityContext to be used to determine trust in the certificate chain //SecurityContextId = new Guid("ID OF YOUR CUSTOM SECURITY CONTEXT"), // For instance, to use the test certificates on Lacuna Test PKI (for development purposes only!): //SecurityContextId = new Guid("803517ad-3bbc-4169-b085-60053a8f6dbf"), // Set a visual representation for the signature VisualRepresentation = getVisualRepresentation(), }; // Set the PDF to sign signatureStarter.SetPdfToSign(Util.GetBatchDocPath(docId)); // Call the StartWithWebPki() method, which initiates the signature. token = signatureStarter.StartWithWebPki(); } catch (ValidationException ex) { // One or more validations failed. We log the error, update the page with a summary of what happened to this document and start the next signature //logger.Error(ex, "Validation error starting the signature of a batch document"); setValidationError(ex.ValidationResults); startNextSignature(); return; } catch (Exception ex) { // An error has occurred. We log the error, update the page with a summary of what happened to this document and start the next signature //logger.Error(ex, "Error starting the signature of a batch document"); setError(ex.Message); startNextSignature(); return; } // Send to the javascript the token of the signature process to be used to call Web PKI to perform the signature TokenField.Value = token; }
public ActionResult Index(string userfile) { // Get an instance of the PadesSignatureStarter class, responsible for receiving the signature elements and start the // signature process var signatureStarter = new PadesSignatureStarter(Util.GetRestPkiClient()) { // Set the unit of measurement used to edit the pdf marks and visual representations MeasurementUnits = PadesMeasurementUnits.Centimeters, // Set the signature policy SignaturePolicyId = StandardPadesSignaturePolicies.Basic, // Set a SecurityContext to be used to determine trust in the certificate chain SecurityContextId = StandardSecurityContexts.PkiBrazil, // Note: By changing the SecurityContext above you can accept certificates from a custom security context created on the Rest PKI website. // Set a visual representation for the signature VisualRepresentation = new PadesVisualRepresentation() { // The tags {{signerName}} and {{signerNationalId}} will be substituted according to the user's certificate // signerName -> full name of the signer // signerNationalId -> if the certificate is ICP-Brasil, contains the signer's CPF Text = new PadesVisualText("Signed by {{signerName}} ({{signerNationalId}})") { // Specify that the signing time should also be rendered IncludeSigningTime = true, // Optionally set the horizontal alignment of the text ('Left' or 'Right'), if not set the default is Left HorizontalAlign = PadesTextHorizontalAlign.Left }, // We'll use as background the image in Content/PdfStamp.png Image = new PadesVisualImage(Util.GetPdfStampContent(), "image/png") { // Opacity is an integer from 0 to 100 (0 is completely transparent, 100 is completely opaque). Opacity = 50, // Align the image to the right HorizontalAlign = PadesHorizontalAlign.Right }, // Position of the visual representation. We have encapsulated this code in a method to include several // possibilities depending on the argument passed. Experiment changing the argument to see different examples // of signature positioning. Once you decide which is best for your case, you can place the code directly here. Position = PadesVisualElements.GetVisualPositioning(1) }, }; // If the user was redirected here by UploadController (signature with file uploaded by user), the "userfile" URL argument // will contain the filename under the "App_Data" folder. Otherwise (signature with server file), we'll sign a sample // document. if (string.IsNullOrEmpty(userfile)) { // Set the PDF to be signed as a byte array signatureStarter.SetPdfToSign(Util.GetSampleDocContent()); } else { // Set the path of the file to be signed signatureStarter.SetPdfToSign(Server.MapPath("~/App_Data/" + userfile.Replace("_", "."))); // Note: we're passing the filename argument with "." as "_" because of limitations of ASP.NET MVC } /* Optionally, add marks to the PDF before signing. These differ from the signature visual representation in that they are actually changes done to the document prior to signing, not binded to any signature. Therefore, any number of marks can be added, for instance one per page, whereas there can only be one visual representation per signature. However, since the marks are in reality changes to the PDF, they can only be added to documents which have no previous signatures, otherwise such signatures would be made invalid by the changes to the document (see property PadesSignatureStarter.BypassMarksIfSigned). This problem does not occurr with signature visual representations. We have encapsulated this code in a method to include several possibilities depending on the argument passed. Experiment changing the argument to see different examples of PDF marks. Once you decide which is best for your case, you can place the code directly here. */ //signatureStarter.PdfMarks.Add(PadesVisualElements.GetPdfMark(1)); // Call the StartWithWebPki() method, which initiates the signature. This yields the token, a 43-character // case-sensitive URL-safe string, which identifies this signature process. We'll use this value to call the // signWithRestPki() method on the Web PKI component (see javascript on the view) and also to complete the signature // on the POST action below (this should not be mistaken with the API access token). var token = signatureStarter.StartWithWebPki(); // The token acquired above can only be used for a single signature attempt. In order to retry the signature it is // necessary to get a new token. This can be a problem if the user uses the back button of the browser, since the // browser might show a cached page that we rendered previously, with a now stale token. To prevent this from happening, // we call the method SetNoCacheHeaders() (in BaseController) which sets HTTP headers to prevent caching of the page. base.SetNoCacheHeaders(); // Render the signature page with the token obtained from REST PKI return View(new Models.PadesSignatureModel() { Token = token, UserFile = userfile }); }