It is hard to imagine our life without electronic document management. Such documents are convenient because they do not deteriorate over time, they are more difficult to lose, easy to store, and quickly transfer to any distance. But as it is known, only signed document comes into force.
Electronic signatures are ciphers that guarantee uniqueness and originality, allowing to establish a definitive authorship and protect the document from changes.
However, signing every generated PDF file can be time-consuming. What if you have a thousand or more generated files — should you sign them manually? Of course not. FastReport VCL can sign the generated files with your signature. Next, we will look into an example of digital signing.
For clarity, we will use a small application that exports files to PDF and signs them.
procedure TForm1.Button1Click(Sender: TObject); const FR3FileName = 'Signatures.fr3'; var PDFExport: TfrxPDFExport; Report: TfrxReport; begin Report := TfrxReport.Create(nil); try Report.LoadFromFile(FR3FileName); Report.PrepareReport; // upload and prepare a report PDFExport := TfrxPDFExport.Create(nil); try PDFExport.Report := Report; PDFExport.ShowDialog := False; PDFExport.FileName := ExtractFileName(FR3FileName) + '.pdf'; Report.Export(PDFExport); // export the report SignExport(PDFExport); // sign the file finally PDFExport.Free; end; finally Report.Free; end; end; procedure SignExport(PDFExport: TfrxPDFExport); const CertificatePath = 'JaneDoe.pfx'; // The name of our certificate PasCert = '123'; // certificate password var Lookup: TCertificateStoreLookup; FS: TfrxFileSignature; FSO: Integer; begin Lookup := TCertificateStoreLookup.Create; Lookup.IgnoreCase := true; Lookup.CertificatePath := CertificatePath; FSO := FileSignatureOptions( true, // Detached = true Signature in a detached file false, // Chain = false Certificate chain false, // OnlyGOST= true GOST certificate true, // DebugLog = true Debugging Information true); // PFX = false (true) indicates that the certificate should be searched in the pfx/p12 file. At the same time, the file name and, possibly, the password must be specified. FS := TfrxFileSignature.Create( Lookup, PDFExport.FileName, // PDF file name PDFExport.FileName + '.sig', // Name of the generated signature AnsiString(PasCert), FSO); FS.Sign; FS.Free; Lookup.Free; end;
After writing the program, let's move on to running it.
After starting, click on the "Export" button. Then we get a signed PDF file with a signature file:
We should check whether the PDF file was signed correctly. For this, open the console and enter the following commands:
openssl pkcs12 -in JohnDoe.pfx -out JohnDoe.pem
After we enter the password and check with the following command:
openssl smime -verify -binary -inform DER -in Signatures.fr3.pdf.sig -content Signatures.fr3.pdf -certfile JohnDoe.pem -nointern -noverify 1> /dev/null
This screenshot shows that the PDF file has passed the signature check, so we did it.
Thus, we got a properly exported PDF file signed using FastReport VCL in a fast and easy way.