C# and Java Code to Digitally Sign PDF Files With a Certificate

Posted on 2021-10-05 Gabriel Smith

document_security-300

In the “Secure PDF Files With a Password in C#, VB, and Java” article, we described how to use the PDFFile class from the PDF SDK to password protect and encrypt PDF files. Using the PDFFile class also makes digitally signing PDF files just as easy! The PDFFile class is available for .NET FX, .NET Core, and Java.

Digitally signing PDF files provides assurance to users that they are seeing an unmodified version of the PDF. Any change to the PDF content will invalidate the digital signature and alert the user that something has changed.

Signed PDF Signed PDF with modified content

Below are some C# and Java code snippets that digitally sign PDF files with the PDFFile class. Be sure to check out the tutorials in our documentation as well.

Digitally Sign PDF Files - C# Code


private static void Main()
{
   if (SetLicense() == false)
   {
      Console.WriteLine("Bad LEADTOOLS license or license not set.");
      return;
   }
   if (CheckDigitalSignatureSupportStatus() == false)
   {
      Console.WriteLine("Digital Signature functionality is not available. "
                        + "Make sure you have the Open SSL libs: "
                        + "https://www.leadtools.com/help/sdk/v22/dh/to/lead-compiled-openssl-binaries.html");
      return;
   }

   SignPdf();
}

private static void SignPdf()
{
   const string  password = "password1234";
   var pdfFile = new Leadtools.Pdf.PDFFile(LeadtoolsInstallPath + "\\Resources\\Images\\pdf\\sign\\input.pdf");
   pdfFile.SignDocument(LeadtoolsInstallPath + "\\Resources\\Images\\pdf\\sign\\signed.pdf",
                        LeadtoolsInstallPath + "\\Resources\\Images\\pdf\\sign\\pdf.pfx",
                        password);
}

public static bool SetLicense()
{
   if (!RasterSupport.KernelExpired) return !RasterSupport.KernelExpired;
   try
   {
      var licString = File.ReadAllText(Program.LeadtoolsLicensePath);
      var developerKey = File.ReadAllText(Program.LeadtoolsLicensePath + ".key");
      var licBytes = System.Text.Encoding.UTF8.GetBytes(licString);
      RasterSupport.SetLicense(licBytes, developerKey);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
   return !RasterSupport.KernelExpired;
}

public static bool CheckDigitalSignatureSupportStatus()
{
   SetOpenSslBinFolder();
   // https://www.leadtools.com/help/sdk/v22/dh/pdf/pdfdocument-getdigitalsignaturesupportstatus.html
   return PDFDocument.GetDigitalSignatureSupportStatus() == RasterExceptionCode.Success;
}

public static void SetOpenSslBinFolder()
{
   RasterDefaults.SetResourceDirectory(LEADResourceDirectory.OpenSSL, LeadtoolsInstallPath + "\\Bin\\CDLL\\x64");
}

Digitally Sign PDF Files - Java Code


public static void main(String[] args) throws Exception {
    LoadLibs();
    if(SetLicense() == false){
        System.out.println("Bad LEADTOOLS license or license not set.");
        return;
    }
    if(CheckDigitalSignatureSupportStatus() == false){
        System.out.println(
           "Digital Signature functionality is not available. "
           + "Make sure you have the Open SSL libs: "
           + "https://www.leadtools.com/help/sdk/v22/dh/to/lead-compiled-openssl-binaries.html");
        return;
    }
    SignPdf();
}
    
private static void SignPdf() {
    final String password = "password1234";
    final PDFFile pdfFile = new PDFFile(LEADTOOLSINSTALLPATH + "\\Resources\\Images\\pdf\\sign\\input.pdf");
    pdfFile.signDocument(LEADTOOLSINSTALLPATH + "\\Resources\\Images\\pdf\\sign\\signed.pdf",
                            LEADTOOLSINSTALLPATH + "\\Resources\\Images\\pdf\\sign\\pdf.pfx",
                            password);
}

public static Boolean CheckDigitalSignatureSupportStatus() {
    // https://www.leadtools.com/help/sdk/v22/dh/pdf/pdfdocument-getdigitalsignaturesupportstatus.html
    return PDFDocument.getDigitalSignatureSupportStatus() == RasterExceptionCode.SUCCESS;
}
private static void LoadLibs() {
    Platform.setLibPath(LEADTOOLSINSTALLPATH + "\\Bin\\CDLL\\x64");
    Platform.loadLibrary(LTLibrary.LEADTOOLS);
    Platform.loadLibrary(LTLibrary.PDF);
}
private static boolean SetLicense() {
    if (!RasterSupport.getKernelExpired()) return !RasterSupport.getKernelExpired();
    try {
        final String licensePathString = LEADTOOLSINSTALLPATH + "\\Support\\Common\\License\\LEADTOOLS.lic";
        final String licenseKeyPathString = licensePathString + ".key";
        RasterSupport.setLicense(licensePathString, Files.readString(Path.of(licenseKeyPathString)));
    }
    catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
    return !RasterSupport.getKernelExpired();
}

Create Self-signed Certificate in PowerShell

To create a proof of concept, you can quickly generate a self-signed certificate to use for testing. Below is the PowerShell script that I used. This script requires that you run PowerShell with elevated permissions.


$myName = "Your Name"
$myEmail = "your@emaildomain.tld"
$certPassword = "password1234"

$cert = New-SelfSignedCertificate -Type Custom -certstorelocation cert:\localmachine\my -Container test* -Subject "CN=$myName" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=$myEmail") -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -NotAfter (Get-Date).AddMonths(6)

$pwd = ConvertTo-SecureString -String "$certPassword" -Force -AsPlainText
$path = "cert:\localMachine\my\" + $cert.thumbprint

Export-PfxCertificate -cert $path -FilePath c:\temp\pdf\pdf.pfx -Password $pwd

See For Yourself - Free Evaluation

Download the LEADTOOLS SDK for free. It’s fully-functional for 60 days and comes with free chat and email support.

Stay Tuned For More Conversion Samples

Did you see our previous post, “Convert HTML to PDF in C#, VB, and Java”? Stay tuned for more PDF examples to see how LEADTOOLS easily fits into any workflow involving PDF files. Need help in the meantime? Contact our support team for free technical support! For pricing or licensing questions, you can contact our sales team via email or call us at +1-704-332-5532.

LEADTOOLS Blog

LEADTOOLS Powered by Apryse,the Market Leading PDF SDK,All Rights Reserved