Sfoglia il codice sorgente

ComPDFKit(win) - 数字签名Samples

liuaoran 1 anno fa
parent
commit
97eac3455d

+ 0 - 1
Demo/Examples/Compdfkit_Tools/Common/Helper/CommonHelper.cs

@@ -40,7 +40,6 @@ namespace Compdfkit_Tools.Helper
             {
                 key = keyNode.InnerText;
                 secret = secretNode.InnerText;
-
             }
             else
             {

+ 1 - 0
Demo/Examples/Compdfkit_Tools/DigitalSignature/AddCertificationControl/SaveCerficateControl.xaml.cs

@@ -77,6 +77,7 @@ namespace Compdfkit_Tools.PDFControl
                 certificateInfo += "/D=" + CertificateInfo.OrganizationUnit;
             }
             certificateInfo += "/CN=" + CertificateInfo.GrantorName;
+            certificateInfo += "/emailAddress" + CertificateInfo.Email;
             bool is_2048 = CertificateInfo.AlgorithmType == AlgorithmType.RSA2048bit;
             if(CPDFPKCS12CertHelper.GeneratePKCS12Cert(certificateInfo, CertificateInfo.Password, FilePath, CertificateInfo.PurposeType, is_2048))
             {

+ 1 - 0
Demo/Examples/Compdfkit_Tools/DigitalSignature/CPDFSignatureListControl/CPDFSignatureListControl.xaml.cs

@@ -79,6 +79,7 @@ namespace Compdfkit_Tools.DigitalSignature.CPDFSignatureListControl
             if (index >= 0 && index < signatureList.Count)
             {
                 pdfViewer.Document.RemoveSignature(signatureList[index], true);
+
                 LoadSignatureList();
                 DeleteSignatureEvent?.Invoke(this, null);
             }

+ 0 - 5
Demo/Examples/Compdfkit_Tools/DigitalSignature/DigitalSignatureData/DigitalSignatureData.cs

@@ -37,9 +37,4 @@ namespace Compdfkit_Tools.PDFControl
         public string filePath;
         public string password; 
     }
-
-    internal class DigitalSignatureData
-    {
-          
-    }
 }

+ 3 - 3
Demo/Examples/Compdfkit_Tools/DigitalSignature/FillDigitalSignatureControl/FillDigitalSignatureControl.xaml.cs

@@ -66,7 +66,7 @@ namespace Compdfkit_Tools.PDFControl
             {
                 _password = value;
                 signatureCertificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path(SignaturePath, Password);
-                signatureName = DictionaryValueConverter.GetGrantorFormDictionary(signatureCertificate.SubjectDict);
+                signatureName = DictionaryValueConverter.GetGrantorFromDictionary(signatureCertificate.SubjectDict);
                 tempSignatureConfig.Text = signatureName;
                 CreateTempSignature();
             }
@@ -305,7 +305,7 @@ namespace Compdfkit_Tools.PDFControl
                 {
                     Text += "Name: ";
                 }
-                Text += DictionaryValueConverter.GetGrantorFormDictionary(signatureCertificate.SubjectDict) + "\n";
+                Text += DictionaryValueConverter.GetGrantorFromDictionary(signatureCertificate.SubjectDict) + "\n";
             }
 
             if ((bool)DateChk.IsChecked)
@@ -346,7 +346,7 @@ namespace Compdfkit_Tools.PDFControl
                 {
                     Text += "DN: ";
                 }
-                Text += DictionaryValueConverter.GetDNFromDictionary(signatureCertificate.SubjectDict) + "\n";
+                Text += signatureCertificate.Subject + "\n";
             }
 
             if ((bool)ComPDFKitVersionChk.IsChecked)

+ 1 - 1
Demo/Examples/Compdfkit_Tools/DigitalSignature/ViewCertificationControl/SummaryControl.xaml.cs

@@ -68,7 +68,7 @@ namespace Compdfkit_Tools.PDFControl
         public void LoadSummaryInfo(CPDFSignatureCertificate certificate)
         {
             string awardText;
-            string grantorText = DictionaryValueConverter.GetGrantorFormDictionary(certificate.SubjectDict);
+            string grantorText = DictionaryValueConverter.GetGrantorFromDictionary(certificate.SubjectDict);
             string email = DictionaryValueConverter.GetEmailFormDictionary(certificate.SubjectDict);
             var usageList = DictionaryValueConverter.GetUsage(certificate);
             string keyUsageText = "";

+ 2 - 2
Demo/Examples/Compdfkit_Tools/DigitalSignature/ViewCertificationControl/ViewCertificateDialog.xaml.cs

@@ -51,7 +51,7 @@ namespace Compdfkit_Tools.PDFControl
         {
             if (value is Dictionary<string, string> dictionary)
             {
-                return GetGrantorFormDictionary(dictionary);
+                return GetGrantorFromDictionary(dictionary);
             }
             return "Unknown Signer";
         }
@@ -61,7 +61,7 @@ namespace Compdfkit_Tools.PDFControl
             return null;
         }
         
-        public static string GetGrantorFormDictionary(Dictionary<string, string> dictionary)
+        public static string GetGrantorFromDictionary(Dictionary<string, string> dictionary)
         {
             string grantor = string.Empty;
             dictionary.TryGetValue("CN", out grantor);

+ 15 - 0
Demo/Examples/Examlpes.sln

@@ -70,6 +70,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Desk", "..\..\..\
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalSignature", "DigitalSignature\DigitalSignature.csproj", "{DD286D3B-0690-43D7-A3BA-AF8680FAD301}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalSignatureTest", "Samples\DigitalSignatureTest\DigitalSignatureTest.csproj", "{7372311C-7A31-4D97-A2C0-FC005FC345C1}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -438,6 +440,18 @@ Global
 		{DD286D3B-0690-43D7-A3BA-AF8680FAD301}.Release|x64.Build.0 = Release|Any CPU
 		{DD286D3B-0690-43D7-A3BA-AF8680FAD301}.Release|x86.ActiveCfg = Release|Any CPU
 		{DD286D3B-0690-43D7-A3BA-AF8680FAD301}.Release|x86.Build.0 = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|x64.Build.0 = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Debug|x86.Build.0 = Debug|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|x64.ActiveCfg = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|x64.Build.0 = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|x86.ActiveCfg = Release|Any CPU
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -463,6 +477,7 @@ Global
 		{7D255150-76CB-4A65-AFEA-F88778ABF03B} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
 		{0BB38D20-C3CF-47D7-8E2E-97195672AB67} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
 		{FB4B7306-DECC-457C-8F4C-6CE946F753D6} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
+		{7372311C-7A31-4D97-A2C0-FC005FC345C1} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {8EE774F1-5FBF-482A-9A31-5ABDEC216DEF}

+ 6 - 0
Demo/Examples/Samples/DigitalSignatureTest/App.config

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
+    </startup>
+</configuration>

+ 274 - 0
Demo/Examples/Samples/DigitalSignatureTest/DigitalSignatureTest.cs

@@ -0,0 +1,274 @@
+using ComPDFKit.DigitalSign;
+using ComPDFKit.Import;
+using ComPDFKit.PDFAnnotation;
+using ComPDFKit.PDFAnnotation.Form;
+using ComPDFKit.PDFDocument;
+using ComPDFKit.PDFPage;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Xml.Linq;
+
+namespace DigitalSignatureTest
+{
+    internal class DigitalSignatureTest
+    {
+        static private string outputPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))) + "\\Output\\DigitalSignature";
+        static void Main()
+        {
+            #region Preparation work
+            Console.WriteLine("Running digital signature sample...\n");
+
+            SDKLicenseHelper.LicenseVerify();
+            string certificatePath = "Certificate.pfx";
+            string password = "ComPDFKit";
+
+            if (!Directory.Exists(outputPath))
+            {
+                Directory.CreateDirectory(outputPath);
+            }
+            #endregion
+
+            //Sample 0: Create certificate 
+            GenerateCertificate();
+
+
+            //Sample 1: Create digital signature 
+            CPDFDocument document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf");
+            CreateDigitalSignature(document, certificatePath, password);
+            document.Release();
+
+            //Sample 2: Verify signature
+            CPDFDocument signedDoc = CPDFDocument.InitWithFilePath("Signed.pdf");
+            VerifyDigitalSignature(signedDoc);
+
+            //Sample 3: Verify certificate
+            VerifyCertificate(certificatePath, password);
+
+            //Sample 4: Trust Certificate
+            TrustCertificate(signedDoc);
+
+            //Sample 5: Remove digital signature
+            RemoveDigitalSignature(signedDoc);
+            signedDoc.Release();
+            Console.ReadLine();
+        }
+
+        /// <summary>
+        /// in the core function "CPDFPKCS12CertHelper.GeneratePKCS12Cert": 
+        /// 
+        /// Generate certificate
+        /// 
+        /// Password: ComPDFKit
+        /// 
+        /// info: /C=SG/O=ComPDFKit/D=R&D Department/CN=Alan/emailAddress=xxxx@example.com
+        /// 
+        /// C=SG: This represents the country code "SG," which typically stands for Singapore.
+        /// O=ComPDFKit: This is the Organization (O) field, indicating the name of the organization or entity, in this case, "ComPDFKit."
+        /// D=R&D Department: This is the Department (D) field, indicating the specific department within the organization, in this case, "R&D Department."
+        /// CN=Alan: This is the Common Name (CN) field, which usually represents the name of the individual or entity. In this case, it is "Alan."
+        /// emailAddress=xxxx@example.com: Email is xxxx@example.com
+        /// 
+        /// CPDFCertUsage.CPDFCertUsageAll: Used for both digital signing and data validation simultaneously.
+        /// 
+        /// is_2048 = true: Enhanced security encryption.
+        /// </summary>
+        private static void GenerateCertificate()
+        {
+            Console.WriteLine("--------------------");
+            Console.WriteLine("Create digital signature.");
+
+            string info = "/C=SG/O=ComPDFKit/D=R&D Department/CN=Alan/emailAddress=xxxx@example.com";
+            string password = "ComPDFKit";
+            if (CPDFPKCS12CertHelper.GeneratePKCS12Cert(info, password, outputPath + "/Certificate.pfx", CPDFCertUsage.CPDFCertUsageAll, true))
+            {
+                Console.WriteLine("Generate PKCS12 certificate done.");
+            }
+            else
+            {
+                Console.WriteLine("Generate PKCS12 certificate failed.");
+
+            }
+            Console.WriteLine("--------------------");
+        }
+
+        /// <summary>
+        /// 
+        /// Adding a signature is divided into two steps:
+        /// creating a signature field and filling in the signature.
+        /// 
+        /// Page Index: 0
+        /// Rect: CRect(28, 420, 150, 370)
+        /// Border RGB:{ 0, 0, 0 }  
+        /// Widget Background RGB: { 150, 180, 210 }
+        /// 
+        /// Text: Grantor Name
+        /// Content:
+        ///     Name: get grantor name from certificate
+        ///     Date: now(yyyy.mm.dd)
+        ///     Reason: I am the owner of the document.
+        ///     DN: Subject
+        ///     Location: Singapor
+        ///     IsContentAlginLeft: false
+        ///     IsDrawLogo: True
+        ///     LogoBitmap: logo.png
+        ///     text color RGB: { 0, 0, 0 }
+        ///     Output file name: document.FileName + "_Signed.pdf"
+        /// </summary>
+        private static void CreateDigitalSignature(CPDFDocument document, string certificatePath, string password)
+        {
+            Console.WriteLine("--------------------");
+            Console.WriteLine("Create digital signature.");
+            CPDFSignatureCertificate certificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path("Certificate.pfx", "ComPDFKit");
+
+            CPDFPage page = document.PageAtIndex(0);
+            CPDFSignatureWidget signatureField = page.CreateWidget(C_WIDGET_TYPE.WIDGET_SIGNATUREFIELDS) as CPDFSignatureWidget;
+            signatureField.SetRect(new CRect(28, 420, 150, 370));
+
+            signatureField.SetWidgetBorderRGBColor(new byte[] { 0, 0, 0 });
+            signatureField.SetWidgetBgRGBColor(new byte[] { 150, 180, 210 });
+
+            CPDFSignatureConfig signatureConfig = new CPDFSignatureConfig
+            {
+                Text = GetGrantorFromDictionary(certificate.SubjectDict),
+                Content =
+                "Name: " + GetGrantorFromDictionary(certificate.SubjectDict) + "\n" +
+                "Date: " + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss") + "\n" +
+                "Reason: I am the owner of the document.\n" +
+                "Location: Singapor\n" +
+                "DN: " + certificate.Subject + "\n",
+                IsContentAlginLeft = false,
+                IsDrawLogo = true,
+                LogoBitmap = new Bitmap("Logo.png"),
+                textColor = new float[] { 0, 0, 0 }
+            };
+            signatureField.UpdataApWithSignature(signatureConfig);
+            if (document.WriteSignatureToFilePath(signatureField,
+                outputPath + "/" + document.FileName + "_Signed.pdf",
+                certificatePath, password,
+                "Singapore",
+                "I am the owner of the document.", CPDFSignaturePermissions.CPDFSignaturePermissionsNone))
+            {
+                Console.WriteLine("File saved in " + outputPath + "/" + document.FileName + "_Signed.pdf.");
+                Console.WriteLine("Create digital signature done.");
+            }
+            else
+            {
+                Console.WriteLine("Create digital signature failed.");
+
+            }
+            Console.WriteLine("--------------------");
+        }
+
+        /// <summary>
+        /// Remove signature
+        /// </summary>
+        /// <param name="document"></param>
+        private static void RemoveDigitalSignature(CPDFDocument document)
+        {
+            Console.WriteLine("--------------------");
+            Console.WriteLine("Remove digital signature.");
+            CPDFSignature signature = document.GetSignatureList()[0];
+            document.RemoveSignature(signature, true);
+            document.WriteToFilePath(outputPath + "/" + document.FileName + "_RemovedSign.pdf");
+            Console.WriteLine("File saved in " + outputPath + "/" + document.FileName + "_RemovedSign.pdf");
+            Console.WriteLine("Remove digital signature done.");
+            Console.WriteLine("--------------------");
+        }
+
+        /// <summary>
+        /// There are two steps can help you to trust a certificate.
+        /// Set "CPDFSignature.SignCertTrustedFolder" as a folder path,
+        /// then call CPDFSignatureCertificate.AddToTrustedCertificates()
+        /// </summary>
+        private static void TrustCertificate(CPDFDocument document)
+        {
+            Console.WriteLine("--------------------");
+            Console.WriteLine("Trust certificate.");
+
+            CPDFSignature signature = document.GetSignatureList()[0];
+            CPDFSignatureCertificate signatureCertificate = signature.SignerList[0].CertificateList[0];
+
+            Console.WriteLine("Certificate trusted status: " + signatureCertificate.IsTrusted.ToString());
+
+            Console.WriteLine("---Begin trusted---");
+
+            CPDFSignature.SignCertTrustedFolder = AppDomain.CurrentDomain.BaseDirectory + @"\TrustedFolder\";
+            if (signatureCertificate.AddToTrustedCertificates())
+            {
+                Console.WriteLine("Certificate trusted status: " + signatureCertificate.IsTrusted.ToString());
+                Console.WriteLine("Trust certificate done.");
+            }
+            else
+            {
+                Console.WriteLine("Trust certificate failed.");
+            }
+            Console.WriteLine("--------------------");
+        }
+
+        /// <summary>
+        /// Verify certificate
+        /// 
+        /// To verify the trustworthiness of a certificate, 
+        /// you need to verify that all certificates in the certificate chain are trustworthy.
+        /// 
+        /// In ComPDFKit,this progess is automatic.
+        /// You should call the "CPDFSignatureCertificate.CheckCertificateIsTrusted" first.
+        /// then you can view the "CPDFSignatureCertificate.IsTrusted" property.
+        /// </summary>
+        /// <param name="document">A signed document</param>
+        private static void VerifyCertificate(string certificatePath, string password)
+        {
+            Console.WriteLine("--------------------");
+            Console.WriteLine("Verify certificate.");
+            CPDFSignatureCertificate certificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path(certificatePath, password);
+            certificate.CheckCertificateIsTrusted();
+            if (certificate.IsTrusted)
+            {
+                Console.WriteLine("Certificate is trusted");
+            }
+            else
+            {
+                Console.WriteLine("Certificate is not trusted");
+            }
+            Console.WriteLine("Verify certificate done.");
+            Console.WriteLine("--------------------");
+        }
+
+        /// <summary>
+        /// Verify digital signature
+        /// 
+        /// 
+        /// 
+        /// </summary> 
+        private static void VerifyDigitalSignature(CPDFDocument document)
+        {
+            bool isSignVerified = document.GetSignatureList()[0].SignerList[0].IsSignVerified;
+            bool isCertTrusted = document.GetSignatureList()[0].SignerList[0].IsCertTrusted;
+
+
+        }
+
+        public static string GetGrantorFromDictionary(Dictionary<string, string> dictionary)
+        {
+            string grantor = string.Empty;
+            dictionary.TryGetValue("CN", out grantor);
+            if (string.IsNullOrEmpty(grantor))
+            {
+                dictionary.TryGetValue("OU", out grantor);
+            }
+            if (string.IsNullOrEmpty(grantor))
+            {
+                dictionary.TryGetValue("O", out grantor);
+            }
+            if (string.IsNullOrEmpty(grantor))
+            {
+                grantor = "Unknown Signer";
+            }
+            return grantor;
+        }
+
+
+    }
+}

+ 98 - 0
Demo/Examples/Samples/DigitalSignatureTest/DigitalSignatureTest.csproj

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{7372311C-7A31-4D97-A2C0-FC005FC345C1}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>ConsoleApp1</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\LicenseKey.cs">
+      <Link>LicenseKey.cs</Link>
+    </Compile>
+    <Compile Include="DigitalSignatureTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\TestFile\Signed.pdf">
+      <Link>Signed.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="App.config" />
+    <None Include="Certificate.pfx">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitDesktop\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
+      <Project>{18ec356d-8130-49d4-b4e6-ac290e1065b7}</Project>
+      <Name>ComPDFKit.Viewer</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Logo.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Import Project="..\..\packages\ComPDFKit.NetFramework.1.9.1\build\ComPDFKit.NetFramework.targets" Condition="Exists('..\..\packages\ComPDFKit.NetFramework.1.9.1\build\ComPDFKit.NetFramework.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\..\packages\ComPDFKit.NetFramework.1.9.1\build\ComPDFKit.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\ComPDFKit.NetFramework.1.9.1\build\ComPDFKit.NetFramework.targets'))" />
+  </Target>
+</Project>

BIN
Demo/Examples/Samples/DigitalSignatureTest/Logo.png


+ 36 - 0
Demo/Examples/Samples/DigitalSignatureTest/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("ConsoleApp1")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ConsoleApp1")]
+[assembly: AssemblyCopyright("Copyright ©  2023")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("7372311c-7a31-4d97-a2c0-fc005fc345c1")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 4 - 0
Demo/Examples/Samples/DigitalSignatureTest/packages.config

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="ComPDFKit.NetFramework" version="1.9.1" targetFramework="net461" />
+</packages>

+ 4 - 0
Demo/Examples/Samples/DocumentCompare/DocumentCompareTest.csproj

@@ -69,6 +69,10 @@
       <Link>ElectricalDiagram_New.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="..\..\TestFile\Signed.pdf">
+      <Link>Signed.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="..\..\TestFile\Text.pdf">
       <Link>Text.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 2 - 1
Demo/Examples/Samples/LicenseKey.cs

@@ -19,7 +19,8 @@ public static class SDKLicenseHelper
         if (keyNode != null && secretNode != null)
         {
             key = keyNode.InnerText;
-            secret = secretNode.InnerText; 
+            secret = secretNode.InnerText;
+
         }
         else
         {

BIN
Demo/Examples/TestFile/Signed.pdf