Assinar PDF com certificado digital armazenado em um banco de dados
PROCEDURE AssinarPDF()
MyExtractedCertificate is Certificate
HReset(CERTIFICADO)
IF HReadSeek(CERTIFICADO,AGRONOMO_ID,EDT_AGRONOMO_ID,hIdentical) = True THEN
EDT_CertificadoEncodado = CERTIFICADO.CERTIFICADO_ENCODE
bufSignature is Buffer = Decode(CERTIFICADO.CERTIFICADO_ENCODE,encodeBASE64)
MyExtractedCertificate = CertificateExtract(bufSignature,certificateFromBuffer)
IF MyExtractedCertificate = Null THEN
RESULT False
END
IF MyExtractedCertificate..EndValidityDate<DateSys() THEN
Info("Certificado Vencido")
RESULT False
END
CERTIFICADO is string = MyExtractedCertificate.Name +CR
CERTIFICADO += MyExtractedCertificate.StartValidityDate +CR
CERTIFICADO += MyExtractedCertificate.EndValidityDate +CR
CERTIFICADO += MyExtractedCertificate.ValidForSignature +CR
CERTIFICADO += MyExtractedCertificate.FullIssuer +CR
CERTIFICADO += MyExtractedCertificate.Issuer +CR
CERTIFICADO += MyExtractedCertificate.KeyUsage +CR
CERTIFICADO += MyExtractedCertificate.Reliability +CR
CERTIFICADO += MyExtractedCertificate.SerialNumber +CR
CERTIFICADO += MyExtractedCertificate.Subject
EDT_Certificado = CERTIFICADO
bt_assinar..State = Active
MyAssinatura is pdfSignature
MySignature is pdfSignature
MySignature..Certificate = MyExtractedCertificate
MySignature..Caption = " ASSINADO DIGITALMENTE POR:" + MyExtractedCertificate..Name + " em " + DateToString(DateSys())
MySignature..Height = 264 //xAlturaTexto
MySignature..Width = 167 //xLarguraTexto
MySignature..X = 1 //xPosicaoTextoX
MySignature..Y = 15 //xPosicaoTextoY
MySignature..VerticalAlignment = iBottom
MySignature..HorizontalAlignment= iRight
MyAssinatura = MySignature
sArquivoPDF is string = edt_arquivo_selecionado
pdfdestino is string = sArquivoPDF
pdfdestino = Replace(pdfdestino,"","")
pdfdestino += "-assinado"+".pdf"
IF fFileExist(edt_arquivo_selecionado) = False THEN
Info("Selecione o pdf")
RESULT False
ELSE
IF fCopyFile(sArquivoPDF,pdfdestino)=False THEN
Error(ErrorInfo()+HErrorInfo())
ELSE
//ASSINA O PDF
mRes is boolean = PDFSign(pdfdestino, MyAssinatura)
IF mRes = False OR fFileExist(pdfdestino) = False
Info("PDF Não Assinado ")
RESULT False
ELSE IF fFileExist(pdfdestino) = True AND mRes = True
DocumentReader1 = pdfdestino
Info("Processo Concluído, PDF Assinado")
RESULT True
END
END
END
ELSE
Info("Certificado nao localizado")
END
//----------------------------------------------------------------------------
// Summary: <specify the procedure action>
// Syntax:
// Evento_Encodar_Certificado ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE Evento_Encodar_Certificado()
SEL is string = fSelect("","","Selecione um Certificado","Todos os Arquivos *.*"+TAB+"*.*"+CR+"PFX"+TAB+"*.PFX","*.PFX")
EDT_PATH = SEL
MyCertificate is Certificate
MyCertificate = CertificateSelect()
IF MyCertificate.Name = "" THEN
RESULT False
END
IF MyCertificate.ValidForSignature = False THEN
Info("The selected certificate cannot be used to generate a signature.")
RESULT False
END
IF MyCertificate..EndValidityDate<DateSys() THEN
Info("Certificado Vencido")
RESULT False
END
IF MyCertificate..Name = "" THEN
Info("Certificado Não Selecionado.")
RESULT False
END
// Retrieve the buffer containing the signature
bufSignature is Buffer = CertificateSignString("Character string to sign", MyCertificate)
EDT_CERTIFICADO_ENCODE = Encode(bufSignature,encodeBASE64) //MEMO
//------------------------------------------------------------------------------------------------------------------------------------------
IF Open(Win_TableForm_Agronomo) = True THEN
HReset(AGRONOMO)
IF HReadSeek(AGRONOMO,AGRONOMO_ID,gn_ID,hIdentical) = True THEN
EDT_AGRONOMO_ID = gn_ID
EDT_NOMEAGRONOMO = AGRONOMO.NOME
END
END