Преглед на файлове

compdfkit(win) - VB Samples

weixiangjie преди 1 година
родител
ревизия
7b48e25e88
променени са 100 файла, в които са добавени 6106 реда и са изтрити 22 реда
  1. 333 0
      Demo/Examples/Examlpes.sln
  2. 70 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vb
  3. 150 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vbproj
  4. 6 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/App.config
  5. BIN
      Demo/Examples/Samples/AnnotationImportExportTest/VB/ComPDFKit_Logo.ico
  6. 13 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Application.Designer.vb
  7. 10 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Application.myapp
  8. 35 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/AssemblyInfo.vb
  9. 62 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Resources.Designer.vb
  10. 117 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Resources.resx
  11. 73 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Settings.Designer.vb
  12. 7 0
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Settings.settings
  13. 258 0
      Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vb
  14. 160 0
      Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vbproj
  15. 6 0
      Demo/Examples/Samples/AnnotationTest/VB/App.config
  16. 13 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Application.Designer.vb
  17. 10 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Application.myapp
  18. 35 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/AssemblyInfo.vb
  19. 62 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Resources.Designer.vb
  20. 117 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Resources.resx
  21. 73 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Settings.Designer.vb
  22. 7 0
      Demo/Examples/Samples/AnnotationTest/VB/My Project/Settings.settings
  23. 6 0
      Demo/Examples/Samples/BackgroundTest/VB/App.config
  24. 147 0
      Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vb
  25. 155 0
      Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vbproj
  26. BIN
      Demo/Examples/Samples/BackgroundTest/VB/ComPDFKit_Logo.ico
  27. 13 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Application.Designer.vb
  28. 10 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Application.myapp
  29. 35 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/AssemblyInfo.vb
  30. 62 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Resources.Designer.vb
  31. 117 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Resources.resx
  32. 73 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Settings.Designer.vb
  33. 7 0
      Demo/Examples/Samples/BackgroundTest/VB/My Project/Settings.settings
  34. 6 0
      Demo/Examples/Samples/BatesTest/VB/App.config
  35. 145 0
      Demo/Examples/Samples/BatesTest/VB/BatesTest.vb
  36. 147 0
      Demo/Examples/Samples/BatesTest/VB/BatesTest.vbproj
  37. 13 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Application.Designer.vb
  38. 10 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Application.myapp
  39. 35 0
      Demo/Examples/Samples/BatesTest/VB/My Project/AssemblyInfo.vb
  40. 62 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Resources.Designer.vb
  41. 117 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Resources.resx
  42. 73 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Settings.Designer.vb
  43. 7 0
      Demo/Examples/Samples/BatesTest/VB/My Project/Settings.settings
  44. 6 0
      Demo/Examples/Samples/BookmarkTest/VB/App.config
  45. 151 0
      Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vb
  46. 147 0
      Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vbproj
  47. 13 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Application.Designer.vb
  48. 10 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Application.myapp
  49. 35 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/AssemblyInfo.vb
  50. 62 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Resources.Designer.vb
  51. 117 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Resources.resx
  52. 73 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Settings.Designer.vb
  53. 7 0
      Demo/Examples/Samples/BookmarkTest/VB/My Project/Settings.settings
  54. 6 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/App.config
  55. BIN
      Demo/Examples/Samples/DigitalSignatureTest/VB/Certificate.pfx
  56. BIN
      Demo/Examples/Samples/DigitalSignatureTest/VB/ComPDFKit_Logo.ico
  57. 316 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/DigitalSignatureTest.vb
  58. 153 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/DigitalSignatureTest.vbproj
  59. BIN
      Demo/Examples/Samples/DigitalSignatureTest/VB/Logo.png
  60. 13 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Application.Designer.vb
  61. 10 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Application.myapp
  62. 35 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/AssemblyInfo.vb
  63. 62 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Resources.Designer.vb
  64. 117 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Resources.resx
  65. 73 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Settings.Designer.vb
  66. 7 0
      Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Settings.settings
  67. 28 22
      Demo/Examples/Samples/DocumentCompareTest/CS/DocumentCompareTest.csproj
  68. 6 0
      Demo/Examples/Samples/DocumentCompareTest/VB/App.config
  69. BIN
      Demo/Examples/Samples/DocumentCompareTest/VB/ComPDFKit_Logo.ico
  70. 75 0
      Demo/Examples/Samples/DocumentCompareTest/VB/DocumentCompareTest.vb
  71. 161 0
      Demo/Examples/Samples/DocumentCompareTest/VB/DocumentCompareTest.vbproj
  72. 13 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Application.Designer.vb
  73. 10 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Application.myapp
  74. 35 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/AssemblyInfo.vb
  75. 63 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Resources.Designer.vb
  76. 117 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Resources.resx
  77. 73 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Settings.Designer.vb
  78. 7 0
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Settings.settings
  79. BIN
      Demo/Examples/Samples/DocumentCompareTest/VB/TextChanged.pdf
  80. 6 0
      Demo/Examples/Samples/DocumentInfoTest/VB/App.config
  81. BIN
      Demo/Examples/Samples/DocumentInfoTest/VB/ComPDFKit_Logo.ico
  82. 70 0
      Demo/Examples/Samples/DocumentInfoTest/VB/DocumentInfoTest.vb
  83. 146 0
      Demo/Examples/Samples/DocumentInfoTest/VB/DocumentInfoTest.vbproj
  84. 13 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Application.Designer.vb
  85. 10 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Application.myapp
  86. 35 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/AssemblyInfo.vb
  87. 63 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Resources.Designer.vb
  88. 117 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Resources.resx
  89. 73 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Settings.Designer.vb
  90. 7 0
      Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Settings.settings
  91. 6 0
      Demo/Examples/Samples/EncryptTest/VB/App.config
  92. BIN
      Demo/Examples/Samples/EncryptTest/VB/ComPDFKit_Logo.ico
  93. 314 0
      Demo/Examples/Samples/EncryptTest/VB/EncryptTest.vb
  94. 150 0
      Demo/Examples/Samples/EncryptTest/VB/EncryptTest.vbproj
  95. 13 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/Application.Designer.vb
  96. 10 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/Application.myapp
  97. 35 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/AssemblyInfo.vb
  98. 63 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/Resources.Designer.vb
  99. 117 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/Resources.resx
  100. 0 0
      Demo/Examples/Samples/EncryptTest/VB/My Project/Settings.Designer.vb

+ 333 - 0
Demo/Examples/Examlpes.sln

@@ -74,6 +74,52 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PDFToImage", "Samples\PDFTo
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Desk", "..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj", "{56E518AD-C126-4B48-9A09-0A64C87020E4}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VB", "VB", "{4BA54455-4B01-46A8-B19E-82489DAB2FD5}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "AnnotationImportExportTest", "Samples\AnnotationImportExportTest\VB\AnnotationImportExportTest.vbproj", "{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "AnnotationTest", "Samples\AnnotationTest\VB\AnnotationTest.vbproj", "{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "BackgroundTest", "Samples\BackgroundTest\VB\BackgroundTest.vbproj", "{481B43E1-2183-4B34-8994-FFF58EA3B108}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "BatesTest", "Samples\BatesTest\VB\BatesTest.vbproj", "{8FE5F6A4-92B5-4041-B659-50C032EBB965}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "BookmarkTest", "Samples\BookmarkTest\VB\BookmarkTest.vbproj", "{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DigitalSignatureTest", "Samples\DigitalSignatureTest\VB\DigitalSignatureTest.vbproj", "{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DocumentCompareTest", "Samples\DocumentCompareTest\VB\DocumentCompareTest.vbproj", "{F22C3E06-1B62-4516-AFC8-11F9B706206D}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DocumentInfoTest", "Samples\DocumentInfoTest\VB\DocumentInfoTest.vbproj", "{9E6E96F8-C900-4374-A7A3-93481F733379}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EncryptTest", "Samples\EncryptTest\VB\EncryptTest.vbproj", "{36760764-DC79-4857-8500-9BD7CF77101E}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "FlattenTest", "Samples\FlattenTest\VB\FlattenTest.vbproj", "{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HeaderFooterTest", "Samples\HeaderFooterTest\VB\HeaderFooterTest.vbproj", "{BF771C7A-78C3-4775-963C-A5632426CA1A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ImageExtractTest", "Samples\ImageExtractTest\VB\ImageExtractTest.vbproj", "{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "InteractiveFormsTest", "Samples\InteractiveFormsTest\VB\InteractiveFormsTest.vbproj", "{805251B5-D40B-4920-B725-6C92B4C9DBE2}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "OutlineTest", "Samples\OutlineTest\VB\OutlineTest.vbproj", "{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PDFATest", "Samples\PDFATest\VB\PDFATest.vbproj", "{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PDFPageTest", "Samples\PDFPageTest\VB\PDFPageTest.vbproj", "{6494E133-B334-4183-AF63-1287AC4E9085}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PDFRedactTest", "Samples\PDFRedactTest\VB\PDFRedactTest.vbproj", "{E1E76750-042A-4EB5-A753-402C5AD07780}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PDFToImageTest", "Samples\PDFToImageTest\VB\PDFToImageTest.vbproj", "{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TextExtractTest", "Samples\TextExtractTest\VB\TextExtractTest.vbproj", "{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TextSearchTest", "Samples\TextSearchTest\VB\TextSearchTest.vbproj", "{72F0E73F-C5E7-4059-AE51-D285221A79F6}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WatermarkTest", "Samples\WatermarkTest\VB\WatermarkTest.vbproj", "{0A17E1EE-3912-491F-A9DB-E5F72B36938D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocumentCompareTest", "Samples\DocumentCompareTest\CS\DocumentCompareTest.csproj", "{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -443,6 +489,270 @@ Global
 		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|x64.Build.0 = Release|x64
 		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|x86.ActiveCfg = Release|x86
 		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|x86.Build.0 = Release|x86
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|x64.Build.0 = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Debug|x86.Build.0 = Debug|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|x64.ActiveCfg = Release|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|x64.Build.0 = Release|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|x86.ActiveCfg = Release|Any CPU
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}.Release|x86.Build.0 = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|x64.Build.0 = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Debug|x86.Build.0 = Debug|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|x64.ActiveCfg = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|x64.Build.0 = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|x86.ActiveCfg = Release|Any CPU
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}.Release|x86.Build.0 = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|x64.Build.0 = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Debug|x86.Build.0 = Debug|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|Any CPU.Build.0 = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|x64.ActiveCfg = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|x64.Build.0 = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|x86.ActiveCfg = Release|Any CPU
+		{481B43E1-2183-4B34-8994-FFF58EA3B108}.Release|x86.Build.0 = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|x64.Build.0 = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Debug|x86.Build.0 = Debug|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|x64.ActiveCfg = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|x64.Build.0 = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|x86.ActiveCfg = Release|Any CPU
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965}.Release|x86.Build.0 = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|x64.Build.0 = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Debug|x86.Build.0 = Debug|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|x64.ActiveCfg = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|x64.Build.0 = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|x86.ActiveCfg = Release|Any CPU
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}.Release|x86.Build.0 = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|x64.Build.0 = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Debug|x86.Build.0 = Debug|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|x64.ActiveCfg = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|x64.Build.0 = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|x86.ActiveCfg = Release|Any CPU
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}.Release|x86.Build.0 = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|x64.Build.0 = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Debug|x86.Build.0 = Debug|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|x64.ActiveCfg = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|x64.Build.0 = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|x86.ActiveCfg = Release|Any CPU
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D}.Release|x86.Build.0 = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|x64.Build.0 = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Debug|x86.Build.0 = Debug|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|x64.ActiveCfg = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|x64.Build.0 = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|x86.ActiveCfg = Release|Any CPU
+		{9E6E96F8-C900-4374-A7A3-93481F733379}.Release|x86.Build.0 = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|x64.Build.0 = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Debug|x86.Build.0 = Debug|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|x64.ActiveCfg = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|x64.Build.0 = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|x86.ActiveCfg = Release|Any CPU
+		{36760764-DC79-4857-8500-9BD7CF77101E}.Release|x86.Build.0 = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|x64.Build.0 = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Debug|x86.Build.0 = Debug|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|x64.ActiveCfg = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|x64.Build.0 = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|x86.ActiveCfg = Release|Any CPU
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD}.Release|x86.Build.0 = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|x64.Build.0 = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Debug|x86.Build.0 = Debug|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|x64.ActiveCfg = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|x64.Build.0 = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|x86.ActiveCfg = Release|Any CPU
+		{BF771C7A-78C3-4775-963C-A5632426CA1A}.Release|x86.Build.0 = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|x64.Build.0 = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Debug|x86.Build.0 = Debug|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|x64.ActiveCfg = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|x64.Build.0 = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|x86.ActiveCfg = Release|Any CPU
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9}.Release|x86.Build.0 = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|x64.Build.0 = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Debug|x86.Build.0 = Debug|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|x64.ActiveCfg = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|x64.Build.0 = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|x86.ActiveCfg = Release|Any CPU
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2}.Release|x86.Build.0 = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|x64.Build.0 = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Debug|x86.Build.0 = Debug|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|x64.ActiveCfg = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|x64.Build.0 = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|x86.ActiveCfg = Release|Any CPU
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A}.Release|x86.Build.0 = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|x64.Build.0 = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Debug|x86.Build.0 = Debug|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|x64.ActiveCfg = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|x64.Build.0 = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|x86.ActiveCfg = Release|Any CPU
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF}.Release|x86.Build.0 = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|x64.Build.0 = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Debug|x86.Build.0 = Debug|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|x64.ActiveCfg = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|x64.Build.0 = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|x86.ActiveCfg = Release|Any CPU
+		{6494E133-B334-4183-AF63-1287AC4E9085}.Release|x86.Build.0 = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|x64.Build.0 = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Debug|x86.Build.0 = Debug|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|x64.ActiveCfg = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|x64.Build.0 = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|x86.ActiveCfg = Release|Any CPU
+		{E1E76750-042A-4EB5-A753-402C5AD07780}.Release|x86.Build.0 = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|x64.Build.0 = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Debug|x86.Build.0 = Debug|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|x64.ActiveCfg = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|x64.Build.0 = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|x86.ActiveCfg = Release|Any CPU
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A}.Release|x86.Build.0 = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|x64.Build.0 = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Debug|x86.Build.0 = Debug|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|x64.ActiveCfg = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|x64.Build.0 = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|x86.ActiveCfg = Release|Any CPU
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A}.Release|x86.Build.0 = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|x64.Build.0 = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Debug|x86.Build.0 = Debug|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|x64.ActiveCfg = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|x64.Build.0 = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|x86.ActiveCfg = Release|Any CPU
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6}.Release|x86.Build.0 = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|x64.Build.0 = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Debug|x86.Build.0 = Debug|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|x64.ActiveCfg = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|x64.Build.0 = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|x86.ActiveCfg = Release|Any CPU
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D}.Release|x86.Build.0 = Release|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|x64.ActiveCfg = Debug|x64
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|x64.Build.0 = Debug|x64
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Debug|x86.Build.0 = Debug|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|x64.ActiveCfg = Release|x64
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|x64.Build.0 = Release|x64
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|x86.ActiveCfg = Release|Any CPU
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -469,6 +779,29 @@ Global
 		{7372311C-7A31-4D97-A2C0-FC005FC345C1} = {04BEFA57-85D7-404D-9720-55393023F118}
 		{04BEFA57-85D7-404D-9720-55393023F118} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
 		{0A932BB1-EEE5-40EF-9FA9-233027389364} = {04BEFA57-85D7-404D-9720-55393023F118}
+		{4BA54455-4B01-46A8-B19E-82489DAB2FD5} = {812D8275-2791-4CEF-A4E8-39A78E49D8FB}
+		{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{481B43E1-2183-4B34-8994-FFF58EA3B108} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{8FE5F6A4-92B5-4041-B659-50C032EBB965} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{D922B3BB-3823-4506-BC8B-7C682B7F8AB9} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{F22C3E06-1B62-4516-AFC8-11F9B706206D} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{9E6E96F8-C900-4374-A7A3-93481F733379} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{36760764-DC79-4857-8500-9BD7CF77101E} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{BB1E309D-A937-4E41-B8A3-C2F52AE509CD} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{BF771C7A-78C3-4775-963C-A5632426CA1A} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{AE11BDA6-8A50-405C-A5F2-54EFCD3C76F9} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{805251B5-D40B-4920-B725-6C92B4C9DBE2} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{8506EBB7-AAC4-49AF-ACAD-616D500ECF2A} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{24A7C9D4-042C-4687-ABAD-339F3C07CDDF} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{6494E133-B334-4183-AF63-1287AC4E9085} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{E1E76750-042A-4EB5-A753-402C5AD07780} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{6D1DE0A5-8E7D-403E-8470-F72BB06FD35A} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{9E580A41-AD4F-4106-AA50-EFDB46DEA40A} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{72F0E73F-C5E7-4059-AE51-D285221A79F6} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{0A17E1EE-3912-491F-A9DB-E5F72B36938D} = {4BA54455-4B01-46A8-B19E-82489DAB2FD5}
+		{E756BD5D-7433-4CF5-96B6-A8EF4B7B2D8C} = {04BEFA57-85D7-404D-9720-55393023F118}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {8EE774F1-5FBF-482A-9A31-5ABDEC216DEF}

+ 70 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vb

@@ -0,0 +1,70 @@
+Imports ComPDFKit.PDFDocument
+Imports System
+Imports System.IO
+
+Module AnnotationImportExportTest
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+    Private tempPath As String = Path.Combine(outputPath, "temp")
+
+    Sub Main()
+        ' Preparation work
+        Console.WriteLine("Running header and footer test sample…" & Environment.NewLine)
+
+        SDKLicenseHelper.LicenseVerify()
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+        If Not Directory.Exists(tempPath) Then
+            Directory.CreateDirectory(tempPath)
+        End If
+
+        ' Sample 1: Export Annotation
+        Dim annotationsDocument As CPDFDocument = CPDFDocument.InitWithFilePath("Annotations.pdf")
+
+        If ExportAnnotation(annotationsDocument) Then
+            Console.WriteLine("Export annotation done.")
+        End If
+
+        Console.WriteLine("--------------------")
+
+        ' Sample 2: Import Annotations
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If ImportAnnotation(document) Then
+            Console.WriteLine("Import annotation done.")
+        End If
+
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done")
+        Console.WriteLine("--------------------")
+        Console.ReadLine()
+    End Sub
+
+    ' Export the annotations in the document to XFDF format
+    Private Function ExportAnnotation(document As CPDFDocument) As Boolean
+        Dim filePath As String = Path.Combine(outputPath, "ExportAnnotationTest.xfdf")
+        If Not document.ExportAnnotationToXFDFPath(filePath, tempPath) Then
+            Return False
+        End If
+        Console.WriteLine("Xfdf file in " & filePath)
+        Return True
+    End Function
+
+    ' Importing XFDF into the document
+    Private Function ImportAnnotation(document As CPDFDocument) As Boolean
+        Dim filePath As String = Path.Combine(outputPath, "ImportAnnotationTest.pdf")
+
+        If Not document.ImportAnnotationFromXFDFPath("Annotations.xfdf", tempPath) Then
+            Return False
+        End If
+        If Not document.WriteToFilePath(filePath) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & filePath)
+        Return True
+    End Function
+
+End Module

+ 150 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vbproj

@@ -0,0 +1,150 @@
+<?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>{FFBD38E6-2CAE-4A9F-9E51-2A3CEFD82A0D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>AnnotationImportExportTest.AnnotationImportExportTest</StartupObject>
+    <RootNamespace>AnnotationImportExportTest</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="AnnotationImportExportTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\Annotations.pdf">
+      <Link>Annotations.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\Annotations.xfdf">
+      <Link>Annotations.xfdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 6 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/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>

BIN
Demo/Examples/Samples/AnnotationImportExportTest/VB/ComPDFKit_Logo.ico


+ 13 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("AnnotationImportExportTest")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("AnnotationImportExportTest")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("ded7cb5f-83e4-4322-b250-aebebda3cfcd")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("AnnotationImportExportTest.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.AnnotationImportExportTest.My.MySettings
+            Get
+                Return Global.AnnotationImportExportTest.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 258 - 0
Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vb

@@ -0,0 +1,258 @@
+Imports System.IO
+Imports ComPDFKit.PDFDocument
+Imports ComPDFKit.PDFPage
+Imports ComPDFKit.PDFAnnotation
+Imports ComPDFKit.Import
+Imports System.Runtime.InteropServices
+Imports System.Drawing
+Imports System.Drawing.Imaging
+
+Module AnnotationTest
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+
+    Sub Main()
+        ' Preparation work
+        SDKLicenseHelper.LicenseVerify()
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+        ' Sample 1: Create annotations
+        If CreateAnnots(document) Then
+            Console.WriteLine("Create annots done.")
+        End If
+        Console.WriteLine("--------------------")
+
+        ' Sample 2: Delete annotations
+        Dim annotsDocument As CPDFDocument = CPDFDocument.InitWithFilePath("Annotations.pdf")
+        If DeleteAnnotations(annotsDocument) Then
+            Console.WriteLine("Delete annots done.")
+        End If
+
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done")
+        Console.WriteLine("--------------------")
+
+        Console.ReadLine()
+
+
+    End Sub
+
+    Private Sub CreateFreetextAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim str As String = "ComPDFKit Samples"
+        Dim freeText As CPDFFreeTextAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_FREETEXT), CPDFFreeTextAnnotation)
+        freeText.SetContent(str)
+        freeText.SetRect(New CRect(0, 100, 160, 0))
+        Dim textAttribute As New CTextAttribute()
+        textAttribute.FontName = "Helvetica"
+        textAttribute.FontSize = 12
+        Dim fontColor As Byte() = {255, 0, 0}
+        textAttribute.FontColor = fontColor
+        freeText.SetFreetextDa(textAttribute)
+        freeText.SetFreetextAlignment(C_TEXT_ALIGNMENT.ALIGNMENT_CENTER)
+        freeText.UpdateAp()
+    End Sub
+
+    Private Sub CreateFreehandAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim ink As CPDFInkAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_INK), CPDFInkAnnotation)
+        ink.SetInkColor(New Byte() {255, 0, 0})
+        ink.SetBorderWidth(2)
+        ink.SetTransparency(128)
+
+        Dim points As New List(Of List(Of CPoint))()
+
+        ink.SetInkPath(points)
+        ink.SetThickness(8)
+
+        points.Clear()
+        points.Add(New List(Of CPoint)() From
+    {
+        New CPoint(10, 100),
+        New CPoint(100, 10)
+    })
+
+        ink.SetInkPath(points)
+        ink.SetInkRect(New CRect(10, 10, 200, 200))
+
+        ink.UpdateAp()
+    End Sub
+
+    Private Sub CreateShapeAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim dashArray As Single() = {2.0F, 1.0F}
+        Dim lineColor As Byte() = {255, 0, 0}
+        Dim bgColor As Byte() = {0, 255, 0}
+
+        ' Square
+        Dim square As CPDFSquareAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SQUARE), CPDFSquareAnnotation)
+        square.SetRect(New CRect(10, 250, 200, 200))
+        square.SetLineColor(lineColor)
+        square.SetBgColor(bgColor)
+        square.SetTransparency(120)
+        square.SetLineWidth(1)
+        square.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray)
+        square.UpdateAp()
+
+        ' Circle
+        Dim circle As CPDFCircleAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_CIRCLE), CPDFCircleAnnotation)
+        circle.SetRect(New CRect(10, 300, 110, 410))
+        circle.SetLineColor(lineColor)
+        circle.SetBgColor(bgColor)
+        circle.SetTransparency(120)
+        circle.SetLineWidth(1)
+        circle.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray)
+        circle.UpdateAp()
+
+        ' Line
+        Dim line As CPDFLineAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_LINE), CPDFLineAnnotation)
+        line.SetLinePoints(New CPoint(300, 300), New CPoint(350, 350))
+        line.SetLineType(C_LINE_TYPE.LINETYPE_NONE, C_LINE_TYPE.LINETYPE_CLOSEDARROW)
+        line.SetLineColor(lineColor)
+        line.SetTransparency(120)
+        line.SetLineWidth(1)
+        line.SetBorderStyle(C_BORDER_STYLE.BS_DASHDED, dashArray)
+        line.UpdateAp()
+    End Sub
+
+    Private Sub CreateNoteAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim textAnnotation As CPDFTextAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_TEXT), CPDFTextAnnotation)
+        textAnnotation.SetColor(New Byte() {255, 0, 0})
+        textAnnotation.SetTransparency(255)
+        textAnnotation.SetContent("ComPDFKit")
+        textAnnotation.SetRect(New CRect(300, 600, 350, 650))
+        textAnnotation.UpdateAp()
+    End Sub
+    Private Sub CreateSoundAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim sound As CPDFSoundAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SOUND), CPDFSoundAnnotation)
+        sound.SetRect(New CRect(400, 700, 450, 750))
+        sound.SetSoundPath("","Bird.wav")
+        sound.UpdateAp()
+    End Sub
+
+    Private Sub CreateMarkupAnnotation(document As CPDFDocument)
+        Dim cRectList As New List(Of CRect)()
+        Dim rect As New CRect(300, 240, 400, 300)
+        cRectList.Add(rect)
+        Dim color As Byte() = {255, 0, 0}
+
+        ' Highlight
+        Dim page1 As CPDFPage = document.PageAtIndex(0)
+        Dim highlight As CPDFHighlightAnnotation = TryCast(page1.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_HIGHLIGHT), CPDFHighlightAnnotation)
+        highlight.SetColor(color)
+        highlight.SetTransparency(120)
+        highlight.SetQuardRects(cRectList)
+        highlight.UpdateAp()
+
+        ' Underline
+        Dim page2 As CPDFPage = document.PageAtIndex(1)
+        Dim underline As CPDFUnderlineAnnotation = TryCast(page2.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_UNDERLINE), CPDFUnderlineAnnotation)
+        underline.SetColor(color)
+        underline.SetTransparency(120)
+        underline.SetQuardRects(cRectList)
+        underline.UpdateAp()
+
+        ' Strikeout
+        Dim page3 As CPDFPage = document.PageAtIndex(2)
+        Dim strikeout As CPDFStrikeoutAnnotation = TryCast(page3.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STRIKEOUT), CPDFStrikeoutAnnotation)
+        strikeout.SetColor(color)
+        strikeout.SetTransparency(120)
+        strikeout.SetQuardRects(cRectList)
+        strikeout.UpdateAp()
+
+        ' Squiggly
+        Dim page4 As CPDFPage = document.PageAtIndex(3)
+        Dim squiggy As CPDFSquigglyAnnotation = TryCast(page4.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_SQUIGGLY), CPDFSquigglyAnnotation)
+        squiggy.SetColor(color)
+        squiggy.SetTransparency(120)
+        squiggy.SetQuardRects(cRectList)
+        squiggy.UpdateAp()
+    End Sub
+
+    Public Function BitmapToByteArray(bitmap As Bitmap) As Byte()
+        Dim bmpdata As BitmapData = Nothing
+
+        Try
+            bmpdata = bitmap.LockBits(New Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat)
+            Dim numbytes As Integer = bmpdata.Stride * bitmap.Height
+            Dim bytedata As Byte() = New Byte(numbytes - 1) {}
+            Dim ptr As IntPtr = bmpdata.Scan0
+
+            Marshal.Copy(ptr, bytedata, 0, numbytes)
+
+            Return bytedata
+        Finally
+            If bmpdata IsNot Nothing Then
+                bitmap.UnlockBits(bmpdata)
+            End If
+        End Try
+    End Function
+
+    Private Sub CreateStampAnnotation(document As CPDFDocument)
+        Dim page As CPDFPage = document.PageAtIndex(0)
+
+        ' Standard
+        Dim standard As CPDFStampAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP), CPDFStampAnnotation)
+        standard.SetStandardStamp("Approved")
+        standard.SetRect(New CRect(300, 100, 450, 160))
+        standard.UpdateAp()
+
+        ' Text
+        Dim text As CPDFStampAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP), CPDFStampAnnotation)
+        text.SetTextStamp("test", "detail text", C_TEXTSTAMP_SHAPE.TEXTSTAMP_LEFT_TRIANGLE, C_TEXTSTAMP_COLOR.TEXTSTAMP_RED)
+        text.SetRect(New CRect(300, 220, 450, 300))
+        text.UpdateAp()
+
+        ' Image
+        Dim bitmap As New Bitmap("logo.png")
+        Dim image As CPDFStampAnnotation = TryCast(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_STAMP), CPDFStampAnnotation)
+        image.SetImageStamp(BitmapToByteArray(bitmap), bitmap.Width, bitmap.Height)
+        image.SetRect(New CRect(300, 320, 380, 400))
+        image.SetTransparency(255)
+        image.UpdateAp()
+    End Sub
+
+    Private Function CreateAnnots(document As CPDFDocument) As Boolean
+        CreateFreetextAnnotation(document)
+        CreateFreehandAnnotation(document)
+        CreateShapeAnnotation(document)
+        CreateNoteAnnotation(document)
+        CreateShapeAnnotation(document)
+        CreateSoundAnnotation(document)
+        CreateMarkupAnnotation(document)
+        CreateStampAnnotation(document)
+        Dim path As String = outputPath & "\CreateAnnotsTest.pdf"
+        If Not document.WriteToFilePath(path) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & path)
+        Return True
+    End Function
+
+    Private Function DeleteAnnotations(document As CPDFDocument) As Boolean
+        Dim page As CPDFPage = document.PageAtIndex(0)
+
+        Dim annotList As List(Of CPDFAnnotation) = page.GetAnnotations()
+        Dim annotNum = annotList.Count
+
+        If Not annotList(0).RemoveAnnot() Then
+            Return False
+        End If
+
+        Dim path As String = outputPath & "\DeleteAnnotsTest.pdf"
+        If Not document.WriteToFilePath(path) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & path)
+
+        Return True
+    End Function
+
+
+End Module

+ 160 - 0
Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vbproj

@@ -0,0 +1,160 @@
+<?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>{AAE10F2E-F7B0-4487-BEDE-274CE74CA55E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>VB.AnnotationTest</StartupObject>
+    <RootNamespace>VB</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="AnnotationTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\Annotations.pdf">
+      <Link>Annotations.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\Bird.wav">
+      <Link>Bird.wav</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\logo.png">
+      <Link>logo.png</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 6 - 0
Demo/Examples/Samples/AnnotationTest/VB/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>

+ 13 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("662816a6-43d6-478f-a540-3b7fefa7f231")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.VB.My.MySettings
+            Get
+                Return Global.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/AnnotationTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 6 - 0
Demo/Examples/Samples/BackgroundTest/VB/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>

+ 147 - 0
Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vb

@@ -0,0 +1,147 @@
+Imports System.IO
+Imports ComPDFKit.PDFDocument
+Imports System.Runtime.InteropServices
+Imports System.Drawing
+Imports System.Drawing.Imaging
+
+Module BackgroundTest
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+
+    Sub Main()
+        ' Preparation work
+        Console.WriteLine("Running Watermark test sample..." & Environment.NewLine)
+        SDKLicenseHelper.LicenseVerify()
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+
+        ' Sample 1: Add color background
+        If AddColorBackground(document) Then
+            Console.WriteLine("Add color background done.")
+        End If
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Sample 2: Add image background
+        document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+        If AddImageBackground(document) Then
+            Console.WriteLine("Add image background done.")
+        End If
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Sample 3: Remove background
+        Dim colorBgDocument As CPDFDocument = CPDFDocument.InitWithFilePath("ColorBackground.pdf")
+        Dim imageBgDocument As CPDFDocument = CPDFDocument.InitWithFilePath("ImageBackground.pdf")
+
+        If RemoveBackground(colorBgDocument, imageBgDocument) Then
+            Console.WriteLine("Remove background done.")
+        End If
+        colorBgDocument.Release()
+        imageBgDocument.Release()
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done!")
+        Console.WriteLine("--------------------")
+        Console.ReadLine()
+    End Sub
+
+
+    ' Add color background
+    ' Parameters:
+    ' - document: Regular document
+    Private Function AddColorBackground(document As CPDFDocument) As Boolean
+        Dim background As CPDFBackground = document.GetBackground()
+        background.SetBackgroundType(C_Background_Type.BG_TYPE_COLOR)
+        background.SetColor(New Byte() {255, 0, 0})
+        background.SetOpacity(255) ' 0-255
+        background.SetScale(1) ' 1 == 100%
+        background.SetRotation(0) ' Use radians
+        background.SetHorizalign(C_Background_Horizalign.BG_HORIZALIGN_CENTER)
+        background.SetVertalign(C_Background_Vertalign.BG_VERTALIGN_CENTER)
+        background.SetXOffset(0)
+        background.SetYOffset(0)
+        background.SetPages("0-2") ' Page numbering from 0
+        background.Update() ' Note: update after setup is complete
+
+        Dim path As String = outputPath & "\AddColorBackgroundTest.pdf"
+        If Not document.WriteToFilePath(path) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & path)
+
+        Return True
+    End Function
+
+    ' Convert the bitmap to an array that can be set as an image watermark
+    ' Parameters:
+    ' - bitmap: Image source to be used as an image watermark.
+    ' Returns: An array for setting image
+    Public Function BitmapToByteArray(bitmap As Bitmap) As Byte()
+        Dim bmpdata As BitmapData = Nothing
+
+        Try
+            bmpdata = bitmap.LockBits(New Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat)
+            Dim numbytes As Integer = bmpdata.Stride * bitmap.Height
+            Dim bytedata(numbytes - 1) As Byte
+            Dim ptr As IntPtr = bmpdata.Scan0
+
+            Marshal.Copy(ptr, bytedata, 0, numbytes)
+
+            Return bytedata
+        Finally
+            If bmpdata IsNot Nothing Then
+                bitmap.UnlockBits(bmpdata)
+            End If
+        End Try
+    End Function
+
+    Private Function AddImageBackground(document As CPDFDocument) As Boolean
+        Dim background As CPDFBackground = document.GetBackground()
+        background.SetBackgroundType(C_Background_Type.BG_TYPE_IMAGE)
+        Dim bitmap As New Bitmap("logo.png")
+        background.SetImage(BitmapToByteArray(bitmap), bitmap.Width, bitmap.Height, ComPDFKit.Import.C_Scale_Type.fitCenter)
+        background.SetOpacity(128) ' 0-255
+        background.SetScale(1) ' 1 == 100%
+        background.SetRotation(1.0F) ' Use radians
+        background.SetHorizalign(C_Background_Horizalign.BG_HORIZALIGN_CENTER)
+        background.SetVertalign(C_Background_Vertalign.BG_VERTALIGN_CENTER)
+        background.SetXOffset(0)
+        background.SetYOffset(0)
+        background.SetPages("0-2") ' Page numbering from 0
+        background.Update() ' Note: update after setup is complete
+        Dim filePath As String = Path.Combine(outputPath, "AddImageBackgroundTest.pdf")
+        If Not document.WriteToFilePath(filePath) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & filePath)
+        Return True
+    End Function
+
+    Private Function RemoveBackground(ByVal colorBgDocument As CPDFDocument, ByVal imageBgDocument As CPDFDocument) As Boolean
+        Dim colorBackground As CPDFBackground = colorBgDocument.GetBackground()
+        If colorBackground.GetBackgroundType() <> C_Background_Type.BG_TYPE_COLOR Then
+            Return False
+        End If
+
+        colorBackground.Clear()
+        Dim path1 As String = outputPath & "\ClearColorBgTest.pdf"
+        If Not colorBgDocument.WriteToFilePath(path1) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & path1)
+
+        Dim imageBackground As CPDFBackground = imageBgDocument.GetBackground()
+        imageBackground.Clear()
+        Dim path2 As String = outputPath & "\ClearImageBgTest.pdf"
+        If Not imageBgDocument.WriteToFilePath(path2) Then
+            Return False
+        End If
+        Console.WriteLine("Browse the changed file in " & path2)
+
+        Return True
+    End Function
+
+End Module

+ 155 - 0
Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vbproj

@@ -0,0 +1,155 @@
+<?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>{481B43E1-2183-4B34-8994-FFF58EA3B108}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>VB.BackgroundTest</StartupObject>
+    <RootNamespace>VB</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="BackgroundTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\ColorBackground.pdf">
+      <Link>ColorBackground.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\ImageBackground.pdf">
+      <Link>ImageBackground.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\logo.png">
+      <Link>logo.png</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

BIN
Demo/Examples/Samples/BackgroundTest/VB/ComPDFKit_Logo.ico


+ 13 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("a7c35725-7446-4fad-847b-e9f159bc3a42")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.VB.My.MySettings
+            Get
+                Return Global.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/BackgroundTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 6 - 0
Demo/Examples/Samples/BatesTest/VB/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>

+ 145 - 0
Demo/Examples/Samples/BatesTest/VB/BatesTest.vb

@@ -0,0 +1,145 @@
+Imports System.IO
+Imports ComPDFKit.PDFDocument
+
+Module BatesTest
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+    Private IntToLocationDic As New Dictionary(Of Integer, String)() From
+    {
+        {0, "Top Left"},
+        {1, "Top Middle"},
+        {2, "Top Right"},
+        {3, "Bottom Left"},
+        {4, "Bottom Middle"},
+        {5, "Bottom Right"}
+    }
+
+    Sub Main()
+#Region "Preparation work"
+        Console.WriteLine("Running bates test sample..." & vbCrLf)
+        SDKLicenseHelper.LicenseVerify()
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+#End Region
+
+#Region "Sample 1: Add bates"
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If AddBates(document) Then
+            Console.WriteLine("Add bates done.")
+        End If
+
+        document.Release()
+
+        Console.WriteLine("--------------------")
+#End Region
+
+#Region "Samples 2: Edit bates"
+        document = CPDFDocument.InitWithFilePath("Bates.pdf")
+
+        If EditBates(document) Then
+            Console.WriteLine("Edit bates done.")
+        End If
+
+        document.Release()
+
+        Console.WriteLine("--------------------")
+#End Region
+
+#Region "Sample 3: Clear bates"
+        document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If ClearBates(document) Then
+            Console.WriteLine("Clear bates done.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+#End Region
+
+        Console.WriteLine("Done!")
+        Console.WriteLine("--------------------")
+
+        Console.ReadLine()
+
+    End Sub
+
+    Private Function AddBates(document As CPDFDocument) As Boolean
+        Dim addBatesPath As String = outputPath & "\AddBates.pdf"
+
+        Dim bates As CPDFBates = document.GetBates()
+        Dim color As Byte() = {255, 0, 0}
+
+        bates.SetPages("0-" & (document.PageCount - 1)) ' Page numbering from 0
+
+        For i As Integer = 0 To 5
+            bates.SetText(i, "<<#3#5#Prefix-#-Suffix>>") ' 3 digits, starting from 5
+            bates.SetTextColor(i, color)
+            bates.SetFontSize(i, 14)
+
+            Console.WriteLine("Text: {0}", bates.GetText(i))
+            Console.WriteLine("Location: {0}" & vbCrLf, IntToLocationDic(i))
+        Next
+
+        bates.Update()
+
+        If Not document.WriteToFilePath(addBatesPath) Then
+            Return False
+        End If
+
+        Console.WriteLine("Browse the changed file in " & addBatesPath)
+        Return True
+    End Function
+
+    Private Function EditBates(document As CPDFDocument) As Boolean
+        Dim bates As CPDFBates = document.GetBates()
+
+        ' Get the old Bates text from index 0
+        If Not String.IsNullOrEmpty(bates.GetText(0)) Then
+            Console.WriteLine("Get old Bates 0 done, text is {0}", bates.GetText(0))
+        Else
+            Console.WriteLine("Get Bates 0 failed, or it does not exist")
+            Return False
+        End If
+
+        ' Edit the Bates text at index 0
+        bates.SetText(0, "<<#3#1#ComPDFKit-#-ComPDFKit>>")
+
+        ' Update the Bates text
+        bates.Update()
+
+        Console.WriteLine("Change Bates 0 done, new text is {0}", bates.GetText(0))
+
+        Dim editBatesPath As String = outputPath & "\EditBatesTest.pdf"
+
+        If document.WriteToFilePath(editBatesPath) Then
+            Console.WriteLine("Browse the changed file in " & editBatesPath)
+            Return True
+        Else
+            Return False
+        End If
+    End Function
+
+    ''' <summary>
+    ''' Clear bates.
+    ''' </summary>
+    ''' <param name="document">Document with bates</param>
+    Private Function ClearBates(document As CPDFDocument) As Boolean
+        Dim bates As CPDFBates = document.GetBates()
+
+        bates.Clear()
+
+        Dim clearBatesPath As String = outputPath & "\ClearBatesTest.pdf"
+
+        If document.WriteToFilePath(clearBatesPath) Then
+            Console.WriteLine("Browse the changed file in " & clearBatesPath)
+            Return True
+        Else
+            Return False
+        End If
+    End Function
+
+
+End Module

+ 147 - 0
Demo/Examples/Samples/BatesTest/VB/BatesTest.vbproj

@@ -0,0 +1,147 @@
+<?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>{8FE5F6A4-92B5-4041-B659-50C032EBB965}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>VB.BatesTest</StartupObject>
+    <RootNamespace>VB</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="BatesTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\Bates.pdf">
+      <Link>Bates.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 13 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("a4abc9c3-c78a-4bba-8ab9-dec63d7e8408")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.VB.My.MySettings
+            Get
+                Return Global.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/BatesTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 6 - 0
Demo/Examples/Samples/BookmarkTest/VB/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>

+ 151 - 0
Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vb

@@ -0,0 +1,151 @@
+Imports ComPDFKit.PDFDocument
+Imports System
+Imports System.IO
+
+Module BookmarkTest
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+
+    Sub Main()
+        ' Preparation work
+        Console.WriteLine("Running Bookmark test sample…" + Environment.NewLine)
+        SDKLicenseHelper.LicenseVerify()
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("ThreeBookmark.pdf")
+
+#Region "Sample 1: Access bookmark"
+
+        If AccessBookmark(document) Then
+            Console.WriteLine("Check bookmark list done.")
+        Else
+            Console.WriteLine("Check bookmark list failed.")
+            Console.WriteLine("--------------------")
+            Console.WriteLine("Stop.")
+            Console.WriteLine("--------------------")
+            Console.ReadLine()
+            Return
+        End If
+        document.Release()
+        Console.WriteLine("--------------------")
+
+#End Region
+
+#Region "Sample 2: Create bookmark"
+
+        document = CPDFDocument.InitWithFilePath("ThreeBookmark.pdf")
+
+        If CreateBookmark(document) Then
+            Console.WriteLine("Add bookmark done.")
+        Else
+            Console.WriteLine("Add bookmark failed.")
+        End If
+        document.Release()
+        Console.WriteLine("--------------------")
+
+#End Region
+
+#Region "Sample 3: Remove bookmark"
+
+        document = CPDFDocument.InitWithFilePath("ThreeBookmark.pdf")
+
+        If RemoveBookmark(document) Then
+            Console.WriteLine("Remove bookmark done.")
+        Else
+            Console.WriteLine("Remove bookmark failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+#End Region
+
+        Console.WriteLine("Done!")
+        Console.WriteLine("--------------------")
+        Console.ReadLine()
+
+
+
+    End Sub
+
+    ''' <summary>
+    ''' Access bookmark
+    ''' </summary> 
+    Private Function AccessBookmark(document As CPDFDocument) As Boolean
+        Dim bookmarkList As List(Of CPDFBookmark) = document.GetBookmarkList()
+
+        ' Check if there are 3 bookmarks in the document
+        If bookmarkList.Count = 3 Then
+            Console.WriteLine("Access bookmark list done.")
+        Else
+            Return False
+        End If
+
+        ' Check the title of the bookmark for page index 0
+        If document.BookmarkForPageIndex(0).Title = "Bookmark1" Then
+            Console.WriteLine("Access bookmark for a page done.")
+        Else
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    ''' <summary>
+    ''' Create bookmark
+    ''' </summary> 
+    Private Function CreateBookmark(document As CPDFDocument) As Boolean
+        Dim bookmarkCount As Integer = document.GetBookmarkList().Count
+
+        Dim bookmark As New CPDFBookmark()
+        bookmark.Title = "new bookmark"
+        bookmark.PageIndex = 4
+
+        ' Add the new bookmark to the document
+        document.AddBookmark(bookmark)
+
+        ' Check if the number of bookmarks has increased by 1
+        If document.GetBookmarkList().Count - bookmarkCount = 1 Then
+            Console.WriteLine("Add bookmark in page {0}. ", bookmark.PageIndex + 1)
+        Else
+            Return False
+        End If
+
+        ' Save the modified document
+        Dim addBookmarkPath As String = outputPath & "//AddBookmarkTest.pdf"
+        If document.WriteToFilePath(addBookmarkPath) Then
+            Console.WriteLine("Browse the changed file in " & addBookmarkPath)
+            Return True
+        Else
+            Return False
+        End If
+    End Function
+
+    ''' <summary>
+    ''' Remove bookmark
+    ''' </summary> 
+    Private Function RemoveBookmark(document As CPDFDocument) As Boolean
+        Dim bookmarkCount As Integer = document.GetBookmarkList().Count
+
+        ' Remove the first bookmark
+        document.RemoveBookmark(0)
+
+        ' Check if the number of bookmarks has decreased by 1
+        If bookmarkCount - document.GetBookmarkList().Count = 1 Then
+            Console.WriteLine("Bookmark removed.")
+        Else
+            Return False
+        End If
+
+        ' Save the modified document
+        Dim removeBookmarkPath As String = outputPath & "//RemoveBookmarkTest.pdf"
+        If document.WriteToFilePath(removeBookmarkPath) Then
+            Console.WriteLine("Browse the changed file in " & removeBookmarkPath)
+            Return True
+        Else
+            Return False
+        End If
+    End Function
+
+End Module

+ 147 - 0
Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vbproj

@@ -0,0 +1,147 @@
+<?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>{D922B3BB-3823-4506-BC8B-7C682B7F8AB9}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>VB.BookmarkTest</StartupObject>
+    <RootNamespace>VB</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="BookmarkTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\ThreeBookmark.pdf">
+      <Link>ThreeBookmark.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 13 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("0b396ff9-54fd-4bf4-9d0f-0ad91d8d8443")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.VB.My.MySettings
+            Get
+                Return Global.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/BookmarkTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 6 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/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>

BIN
Demo/Examples/Samples/DigitalSignatureTest/VB/Certificate.pfx


BIN
Demo/Examples/Samples/DigitalSignatureTest/VB/ComPDFKit_Logo.ico


+ 316 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/DigitalSignatureTest.vb

@@ -0,0 +1,316 @@
+Imports System.Drawing
+Imports System.IO
+Imports ComPDFKit.DigitalSign
+Imports ComPDFKit.Import
+Imports ComPDFKit.PDFAnnotation.Form
+Imports ComPDFKit.PDFDocument
+Imports ComPDFKit.PDFPage
+
+Module DigitalSignatureTest
+
+    Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
+    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
+
+    Sub Main()
+#Region "Preparation work"
+        Console.WriteLine("Running digital signature sample..." & vbCrLf)
+
+        SDKLicenseHelper.LicenseVerify()
+        Dim certificatePath As String = "Certificate.pfx"
+        Dim password As String = "ComPDFKit"
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+#End Region
+
+#Region "Sample 0: Create certificate"
+        GenerateCertificate()
+#End Region
+
+#Region "Sample 1: Create digital signature"
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+        CreateDigitalSignature(document, certificatePath, password)
+        document.Release()
+#End Region
+
+#Region "Sample 2: Verify signature"
+        Dim signedDoc As CPDFDocument = CPDFDocument.InitWithFilePath("Signed.pdf")
+        VerifyDigitalSignature(signedDoc)
+#End Region
+
+#Region "Sample 3: Verify certificate"
+        VerifyCertificate(certificatePath, password)
+#End Region
+
+#Region "Sample 4: Print digital signature info"
+        PrintDigitalSignatureInfo(signedDoc)
+#End Region
+
+#Region "Sample 5: Trust Certificate"
+        TrustCertificate(signedDoc)
+#End Region
+
+#Region "Sample 6: Remove digital signature"
+        RemoveDigitalSignature(signedDoc)
+        signedDoc.Release()
+#End Region
+
+        Console.WriteLine("Done!")
+
+        Console.ReadLine()
+
+    End Sub
+
+
+    ''' <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 Sub GenerateCertificate()
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Generate certificate signature.")
+
+        Dim info As String = "/C=SG/O=ComPDFKit/D=R&D Department/CN=Alan/emailAddress=xxxx@example.com"
+        Dim password As String = "ComPDFKit"
+        Dim filePath As String = outputPath & "\Certificate.pfx"
+
+        If CPDFPKCS12CertHelper.GeneratePKCS12Cert(info, password, filePath, CPDFCertUsage.CPDFCertUsageAll, True) Then
+            Console.WriteLine("File saved in " & filePath)
+            Console.WriteLine("Generate PKCS12 certificate done.")
+        Else
+            Console.WriteLine("Generate PKCS12 certificate failed.")
+        End If
+
+        Console.WriteLine("--------------------")
+    End Sub
+    ''' <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
+    '''     IsContentAlignLeft: False
+    '''     IsDrawLogo: True
+    '''     LogoBitmap: logo.png
+    '''     text color RGB: {0, 0, 0}
+    '''     content color RGB: {0, 0, 0}
+    '''     Output file name: document.FileName + "_Signed.pdf"
+    ''' </summary>
+    Private Sub CreateDigitalSignature(document As CPDFDocument, certificatePath As String, password As String)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Create digital signature.")
+        Dim certificate As CPDFSignatureCertificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path("Certificate.pfx", "ComPDFKit")
+
+        Dim page As CPDFPage = document.PageAtIndex(0)
+        Dim signatureField As CPDFSignatureWidget = TryCast(page.CreateWidget(C_WIDGET_TYPE.WIDGET_SIGNATUREFIELDS), CPDFSignatureWidget)
+        signatureField.SetRect(New CRect(28, 420, 150, 370))
+        signatureField.SetWidgetBorderRGBColor(New Byte() {0, 0, 0})
+        signatureField.SetWidgetBgRGBColor(New Byte() {150, 180, 210})
+        signatureField.UpdateAp()
+
+        Dim name As String = GetGrantorFromDictionary(certificate.SubjectDict) & vbCrLf
+        Dim [date] As String = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
+        Dim reason As String = "I am the owner of the document."
+        Dim location As String = certificate.SubjectDict("C")
+        Dim DN As String = certificate.Subject
+        Dim signatureConfig As New CPDFSignatureConfig With {
+        .Text = GetGrantorFromDictionary(certificate.SubjectDict),
+        .Content = "Name: " & name & Environment.NewLine &
+                   "Date: " & [date] & Environment.NewLine &
+                   "Reason: " & reason & " " & Environment.NewLine &
+                   "Location: " & location & Environment.NewLine &
+                   "DN: " & DN & Environment.NewLine,
+        .IsContentAlignLeft = False,
+        .IsDrawLogo = True,
+        .LogoData = File.ReadAllBytes("logo.png"),
+        .TextColor = New Single() {0, 0, 0},
+        .ContentColor = New Single() {0, 0, 0}
+    }
+        Dim filePath As String = outputPath & "\" & document.FileName & "_Signed.pdf"
+        signatureField.UpdataApWithSignature(signatureConfig)
+        If document.WriteSignatureToFilePath(signatureField,
+        filePath,
+        certificatePath, password,
+        location,
+        reason, CPDFSignaturePermissions.CPDFSignaturePermissionsNone) Then
+            Console.WriteLine("File saved in " & filePath)
+            Console.WriteLine("Create digital signature done.")
+        Else
+            Console.WriteLine("Create digital signature failed.")
+        End If
+        Console.WriteLine("--------------------")
+    End Sub
+
+    ''' <summary>
+    ''' Remove digital signature
+    ''' You can choose if you want to remove the appearance
+    ''' </summary>
+    ''' <param name="document"></param>
+    Private Sub RemoveDigitalSignature(document As CPDFDocument)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Remove digital signature.")
+
+        Dim signature As CPDFSignature = document.GetSignatureList()(0)
+        document.RemoveSignature(signature, True)
+        Dim filePath As String = outputPath & "\" & document.FileName & "_RemovedSign.pdf"
+        document.WriteToFilePath(filePath)
+        Console.WriteLine("File saved in " & filePath)
+
+        Console.WriteLine("Remove digital signature done.")
+        Console.WriteLine("--------------------")
+    End Sub
+
+    ''' <summary>
+    ''' There are two steps can help you to trust a certificate.
+    ''' Set your trust path as a folder path,
+    ''' then add your certificate to the trust path.
+    ''' </summary>
+    Private Sub TrustCertificate(document As CPDFDocument)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Trust certificate.")
+
+        Dim signature As CPDFSignature = document.GetSignatureList()(0)
+        Dim signatureCertificate As CPDFSignatureCertificate = signature.SignerList(0).CertificateList(0)
+
+        Console.WriteLine("Certificate trusted status: " & signatureCertificate.IsTrusted.ToString())
+
+        Console.WriteLine("---Begin trusted---")
+
+        Dim trustedFolder As String = AppDomain.CurrentDomain.BaseDirectory & "\TrustedFolder\"
+        If Not Directory.Exists(trustedFolder) Then
+            Directory.CreateDirectory(trustedFolder)
+        End If
+        CPDFSignature.SignCertTrustedFolder = trustedFolder
+        If signatureCertificate.AddToTrustedCertificates() Then
+            Console.WriteLine("Certificate trusted status: " & signatureCertificate.IsTrusted.ToString())
+            Console.WriteLine("Trust certificate done.")
+        Else
+            Console.WriteLine("Trust certificate failed.")
+        End If
+        Console.WriteLine("--------------------")
+    End Sub
+
+    ''' <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 progress is automatic.
+    ''' You should call the "CPDFSignatureCertificate.CheckCertificateIsTrusted" first.
+    ''' then you can view the "CPDFSignatureCertificate.IsTrusted" property.
+    ''' </summary>
+    ''' <param name="certificatePath">Path to the certificate</param>
+    ''' <param name="password">Password for the certificate</param>
+    Private Sub VerifyCertificate(certificatePath As String, password As String)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Verify certificate.")
+        Dim certificate As CPDFSignatureCertificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path(certificatePath, password)
+        certificate.CheckCertificateIsTrusted()
+        If certificate.IsTrusted Then
+            Console.WriteLine("Certificate is trusted")
+        Else
+            Console.WriteLine("Certificate is not trusted")
+        End If
+        Console.WriteLine("Verify certificate done.")
+        Console.WriteLine("--------------------")
+    End Sub
+
+    ''' <summary>
+    ''' Verify digital signature
+    '''
+    ''' Refresh the validation status before reading the attributes, or else you may obtain inaccurate results.
+    ''' Is the signature verified: indicating whether the document has been tampered with.
+    ''' Is the certificate trusted: referring to the trust status of the certificate.
+    ''' </summary> 
+    ''' <param name="document">A signed document</param>
+    Private Sub VerifyDigitalSignature(document As CPDFDocument)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Verify digital signature.")
+        For Each signature As CPDFSignature In document.GetSignatureList()
+            signature.VerifySignatureWithDocument(document)
+            For Each signer As CPDFSigner In signature.SignerList
+                Console.WriteLine("Is the certificate trusted: " & signer.IsCertTrusted.ToString())
+                Console.WriteLine("Is the signature verified: " & signer.IsSignVerified.ToString())
+                If signer.IsCertTrusted AndAlso signer.IsSignVerified Then
+                    ' Signature is valid and the certificate is trusted
+                    ' Perform corresponding actions
+                ElseIf Not signer.IsCertTrusted AndAlso signer.IsSignVerified Then
+                    ' Signature is valid but the certificate is not trusted
+                    ' Perform corresponding actions
+                Else
+                    ' Signature is invalid
+                    ' Perform corresponding actions
+                End If
+            Next
+        Next
+        Console.WriteLine("Verify digital signature done.")
+        Console.WriteLine("--------------------")
+    End Sub
+
+    Public Function GetGrantorFromDictionary(dictionary As Dictionary(Of String, String)) As String
+        Dim grantor As String = String.Empty
+        dictionary.TryGetValue("CN", grantor)
+        If String.IsNullOrEmpty(grantor) Then
+            dictionary.TryGetValue("OU", grantor)
+        End If
+        If String.IsNullOrEmpty(grantor) Then
+            dictionary.TryGetValue("O", grantor)
+        End If
+        If String.IsNullOrEmpty(grantor) Then
+            grantor = "Unknown Signer"
+        End If
+        Return grantor
+    End Function
+
+    ''' <summary>
+    ''' This sample shows how to get main properties in a digital signature.
+    ''' Read API reference to see all of the properties that can be obtained.
+    ''' </summary>
+    ''' <param name="document">A signed document</param>
+    Private Sub PrintDigitalSignatureInfo(document As CPDFDocument)
+        Console.WriteLine("--------------------")
+        Console.WriteLine("Print digital signature info.")
+        For Each signature As CPDFSignature In document.GetSignatureList()
+            signature.VerifySignatureWithDocument(document)
+            Console.WriteLine("Name: " & signature.Name)
+            Console.WriteLine("Location: " & signature.Location)
+            Console.WriteLine("Reason: " & signature.Reason)
+            For Each signer As CPDFSigner In signature.SignerList
+                Console.WriteLine("Date: " & signer.AuthenDate)
+                For Each certificate As CPDFSignatureCertificate In signer.CertificateList
+                    Console.WriteLine("Subject: " & certificate.Subject)
+                Next
+            Next
+        Next
+        Console.WriteLine("Print digital signature info done.")
+        Console.WriteLine("--------------------")
+    End Sub
+
+End Module

+ 153 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/DigitalSignatureTest.vbproj

@@ -0,0 +1,153 @@
+<?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>{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>VB.DigitalSignatureTest</StartupObject>
+    <RootNamespace>VB</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="DigitalSignatureTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <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="Certificate.pfx">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+    <None Include="Logo.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

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


+ 13 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("36375b36-b03d-4554-8355-f034b9bc3898")>
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 62 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
+    Friend Module Resources
+
+        Private resourceMan As Global.System.Resources.ResourceManager
+
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set(ByVal value As Global.System.Globalization.CultureInfo)
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.42000
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+        Private Shared addedHandler As Boolean
+
+        Private Shared addedHandlerLockObject As New Object
+
+        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+        Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+            If My.Application.SaveMySettingsOnExit Then
+                My.Settings.Save()
+            End If
+        End Sub
+#End If
+#End Region
+
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+
+#If _MyType = "WindowsForms" Then
+                   If Not addedHandler Then
+                        SyncLock addedHandlerLockObject
+                            If Not addedHandler Then
+                                AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                                addedHandler = True
+                            End If
+                        End SyncLock
+                    End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
+    Friend Module MySettingsProperty
+
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
+        Friend ReadOnly Property Settings() As Global.VB.My.MySettings
+            Get
+                Return Global.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/DigitalSignatureTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 28 - 22
Demo/Examples/Samples/DocumentCompareTest/CS/DocumentCompareTest.csproj

@@ -14,51 +14,57 @@
     </PropertyGroup>
 
     <ItemGroup>
-      <Compile Include="..\LicenseKey.cs">
-        <Link>LicenseKey.cs</Link>
-      </Compile>
-    </ItemGroup>
-
-    <ItemGroup>
-      <Content Include="..\..\build\x64\ComPDFKit.dll">
-        <Link>x64\ComPDFKit.dll</Link>
-        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      </Content>
-      <Content Include="..\..\build\x86\ComPDFKit.dll">
-        <Link>x86\ComPDFKit.dll</Link>
-        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      </Content>
-      <Content Include="..\..\TestFile\CommonFivePage.pdf">
+      <Content Include="..\..\..\TestFile\CommonFivePage.pdf">
         <Link>CommonFivePage.pdf</Link>
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\..\TestFile\ElectricalDiagram.pdf">
+      <Content Include="..\..\..\TestFile\ElectricalDiagram.pdf">
         <Link>ElectricalDiagram.pdf</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\..\TestFile\ElectricalDiagram_New.pdf">
+      <Content Include="..\..\..\TestFile\ElectricalDiagram_New.pdf">
         <Link>ElectricalDiagram_New.pdf</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\..\TestFile\Signed.pdf">
+      <Content Include="..\..\..\TestFile\Signed.pdf">
         <Link>Signed.pdf</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\..\TestFile\Text.pdf">
+      <Content Include="..\..\..\TestFile\Text.pdf">
         <Link>Text.pdf</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\..\TestFile\TextChanged.pdf">
+      <Content Include="..\..\..\TestFile\TextChanged.pdf">
         <Link>TextChanged.pdf</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      </Content>
+      <Content Include="..\..\build\x64\ComPDFKit.dll">
+        <Link>x64\ComPDFKit.dll</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\ComPDFKit_Logo.ico">
+      <Content Include="..\..\build\x86\ComPDFKit.dll">
+        <Link>x86\ComPDFKit.dll</Link>
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      </Content>
+      <Content Include="..\..\ComPDFKit_Logo.ico">
         <Link>ComPDFKit_Logo.ico</Link>
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
-      <Content Include="..\license_key_windows.txt">
+      <Content Include="..\..\license_key_windows.txt">
         <Link>license_key_windows.txt</Link>
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
     </ItemGroup>
 
     <ItemGroup>
+      <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj" />
       <ProjectReference Include="..\ComPDFKitCSharp\ComPDFKit.Desk.csproj" />
     </ItemGroup>
 
+    <ItemGroup>
+      <Compile Include="..\..\LicenseKey.cs">
+        <Link>LicenseKey.cs</Link>
+      </Compile>
+    </ItemGroup>
+
 </Project>

+ 6 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/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>

BIN
Demo/Examples/Samples/DocumentCompareTest/VB/ComPDFKit_Logo.ico


+ 75 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/DocumentCompareTest.vb

@@ -0,0 +1,75 @@
+Imports ComPDFKit.Compare
+Imports ComPDFKit.PDFDocument
+Imports System
+Imports System.IO
+
+Module DocumentCompareTest
+    Private outputPath As String = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))) & "\Output\VB"
+
+    Sub Main(args As String())
+        Console.WriteLine("Running PDFPage test sample..." & vbCrLf)
+
+        SDKLicenseHelper.LicenseVerify()
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+
+        Dim document1 As CPDFDocument = CPDFDocument.InitWithFilePath("ElectricalDiagram.pdf")
+        Dim document2 As CPDFDocument = CPDFDocument.InitWithFilePath("ElectricalDiagram_New.pdf")
+        If OverlayCompareDocument(document1, document2) Then
+            Console.WriteLine("Compare document done.")
+        Else
+            Console.WriteLine("Compare document failed.")
+        End If
+
+        document1.Release()
+        document2.Release()
+        Console.WriteLine("--------------------")
+
+        Dim document3 As CPDFDocument = CPDFDocument.InitWithFilePath("Text.pdf")
+        Dim document4 As CPDFDocument = CPDFDocument.InitWithFilePath("TextChanged.pdf")
+        If ContentCompareDocument(document3, document4) Then
+            Console.WriteLine("Compare document done.")
+        Else
+            Console.WriteLine("Compare document failed.")
+        End If
+
+        document3.Release()
+        document4.Release()
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done!")
+        Console.WriteLine("--------------------")
+        Console.ReadLine()
+    End Sub
+
+    Private Function OverlayCompareDocument(document1 As CPDFDocument, document2 As CPDFDocument) As Boolean
+        Dim compareOverlay As New CPDFCompareOverlay(document1, "1-5", document2, "1-5")
+        compareOverlay.Compare()
+        Dim comparisonDocument As CPDFDocument = compareOverlay.ComparisonDocument()
+        Dim path As String = outputPath & "\CompareDocumentTest.pdf"
+        If Not comparisonDocument.WriteToFilePath(path) Then
+            Return False
+        End If
+
+        Console.WriteLine("Browse the changed file in " & path)
+        Return True
+    End Function
+
+    Private Function ContentCompareDocument(document As CPDFDocument, documentNew As CPDFDocument) As Boolean
+        Dim compareContent As New CPDFCompareContent(document, documentNew)
+        Dim pageCount As Integer = Math.Min(document.PageCount, documentNew.PageCount)
+        For i As Integer = 0 To pageCount - 1
+            Console.WriteLine("Page: {0}", i)
+
+            Dim compareResults As CPDFCompareResults = compareContent.Compare(i, i, CPDFCompareType.CPDFCompareTypeAll, True)
+            Console.WriteLine("Replace count: {0}", compareResults.ReplaceCount)
+            Console.WriteLine("TextResults count: {0}", compareResults.TextResults.Count)
+            Console.WriteLine("Delete count: {0}", compareResults.DeleteCount)
+            Console.WriteLine("Insert count: {0}", compareResults.InsertCount)
+        Next
+
+        Return True
+    End Function
+End Module

+ 161 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/DocumentCompareTest.vbproj

@@ -0,0 +1,161 @@
+<?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>{F22C3E06-1B62-4516-AFC8-11F9B706206D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>DocumentCompareTest.DocumentCompareTest</StartupObject>
+    <RootNamespace>DocumentCompareTest</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>ComPDFKit_Logo.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="DocumentCompareTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\ElectricalDiagram.pdf">
+      <Link>ElectricalDiagram.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\ElectricalDiagram_New.pdf">
+      <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>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+    <None Include="TextChanged.pdf">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 13 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' 有关程序集的一般信息由以下
+' 控制。更改这些特性值可修改
+' 与程序集关联的信息。
+
+'查看程序集特性的值
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
+<Assembly: Guid("5d6926d5-a122-4c79-8a86-76edea15983e")>
+
+' 程序集的版本信息由下列四个值组成: 
+'
+'      主版本
+'      次版本
+'      生成号
+'      修订号
+'
+'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+'通过使用 "*",如下所示:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 63 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    '此类是由 StronglyTypedResourceBuilder
+    '类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    '若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    '(以 /str 作为命令选项),或重新生成 VS 项目。
+    '''<summary>
+    '''  一个强类型的资源类,用于查找本地化的字符串等。
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  返回此类使用的缓存的 ResourceManager 实例。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DocumentCompareTest.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  重写当前线程的 CurrentUICulture 属性,对
+        '''  使用此强类型资源类的所有资源查找执行重写。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+    
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0"),  _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+        
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
+        
+#Region "My.Settings 自动保存功能"
+#If _MyType = "WindowsForms" Then
+    Private Shared addedHandler As Boolean
+
+    Private Shared addedHandlerLockObject As New Object
+
+    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
+        If My.Application.SaveMySettingsOnExit Then
+            My.Settings.Save()
+        End If
+    End Sub
+#End If
+#End Region
+        
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+                
+#If _MyType = "WindowsForms" Then
+               If Not addedHandler Then
+                    SyncLock addedHandlerLockObject
+                        If Not addedHandler Then
+                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                            addedHandler = True
+                        End If
+                    End SyncLock
+                End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+    
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
+    Friend Module MySettingsProperty
+        
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
+        Friend ReadOnly Property Settings() As Global.DocumentCompareTest.My.MySettings
+            Get
+                Return Global.DocumentCompareTest.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/DocumentCompareTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

BIN
Demo/Examples/Samples/DocumentCompareTest/VB/TextChanged.pdf


+ 6 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/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>

BIN
Demo/Examples/Samples/DocumentInfoTest/VB/ComPDFKit_Logo.ico


+ 70 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/DocumentInfoTest.vb

@@ -0,0 +1,70 @@
+Imports ComPDFKit.PDFDocument
+Imports System
+Imports System.IO
+
+Module DocumentInfoTest
+    Sub Main(args As String())
+        Console.WriteLine("Running DocumentInfo test sample..." & vbCrLf)
+        SDKLicenseHelper.LicenseVerify()
+
+        ' Sample 1: Print information
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+        PrintDocumentInfo(document)
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done.")
+        Console.WriteLine("--------------------")
+
+        Console.ReadLine()
+    End Sub
+
+    Public Function GetFileSize(filePath As String) As String
+        Dim fileInfo As FileInfo = Nothing
+        Try
+            fileInfo = New FileInfo(filePath)
+        Catch
+            Return "0B"
+        End Try
+
+        If fileInfo IsNot Nothing AndAlso fileInfo.Exists Then
+            Dim fileSize As Double = fileInfo.Length
+            If fileSize > 1024 Then
+                fileSize = Math.Round(fileSize / 1024, 2)
+                If fileSize > 1024 Then
+                    fileSize = Math.Round(fileSize / 1024, 2)
+                    If fileSize > 1024 Then
+                        fileSize = Math.Round(fileSize / 1024, 2)
+                        Return fileSize & " GB"
+                    Else
+                        Return fileSize & " MB"
+                    End If
+                Else
+                    Return fileSize & " KB"
+                End If
+            Else
+                Return fileSize & " B"
+            End If
+        End If
+
+        Return "0B"
+    End Function
+
+    Private Sub PrintDocumentInfo(document As CPDFDocument)
+        Console.WriteLine("File Name: {0}", document.FileName)
+        Console.WriteLine("File Size: {0}", GetFileSize(document.FilePath))
+        Console.WriteLine("Title: {0}", document.GetInfo().Title)
+        Console.WriteLine("Author: {0}", document.GetInfo().Author)
+        Console.WriteLine("Subject: {0}", document.GetInfo().Subject)
+        Console.WriteLine("Keywords: {0}", document.GetInfo().Keywords)
+        Console.WriteLine("Version: {0}", document.GetInfo().Version)
+        Console.WriteLine("Page Count: {0}", document.PageCount)
+        Console.WriteLine("Creator: {0}", document.GetInfo().Creator)
+        Console.WriteLine("Creation Data: {0}", document.GetInfo().CreationDate)
+        Console.WriteLine("Allows Printing: {0}", document.GetPermissionsInfo().AllowsPrinting)
+        Console.WriteLine("Allows Copying: {0}", document.GetPermissionsInfo().AllowsCopying)
+        Console.WriteLine("Allows Document Changes: {0}", document.GetPermissionsInfo().AllowsDocumentChanges)
+        Console.WriteLine("Allows Document Assembly: {0}", document.GetPermissionsInfo().AllowsDocumentAssembly)
+        Console.WriteLine("Allows Commenting: {0}", document.GetPermissionsInfo().AllowsCommenting)
+        Console.WriteLine("Allows FormField Entry: {0}", document.GetPermissionsInfo().AllowsFormFieldEntry)
+    End Sub
+End Module

+ 146 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/DocumentInfoTest.vbproj

@@ -0,0 +1,146 @@
+<?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>{9E6E96F8-C900-4374-A7A3-93481F733379}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>DocumentInfoTest.DocumentInfoTest</StartupObject>
+    <RootNamespace>DocumentInfoTest</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>ComPDFKit_Logo.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="DocumentInfoTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 13 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' 有关程序集的一般信息由以下
+' 控制。更改这些特性值可修改
+' 与程序集关联的信息。
+
+'查看程序集特性的值
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
+<Assembly: Guid("4578823b-efee-489c-be3c-301a5e5c9caf")>
+
+' 程序集的版本信息由下列四个值组成: 
+'
+'      主版本
+'      次版本
+'      生成号
+'      修订号
+'
+'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+'通过使用 "*",如下所示:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 63 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    '此类是由 StronglyTypedResourceBuilder
+    '类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    '若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    '(以 /str 作为命令选项),或重新生成 VS 项目。
+    '''<summary>
+    '''  一个强类型的资源类,用于查找本地化的字符串等。
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  返回此类使用的缓存的 ResourceManager 实例。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DocumentInfoTest.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  重写当前线程的 CurrentUICulture 属性,对
+        '''  使用此强类型资源类的所有资源查找执行重写。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 73 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Settings.Designer.vb

@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+    
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0"),  _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+        
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
+        
+#Region "My.Settings 自动保存功能"
+#If _MyType = "WindowsForms" Then
+    Private Shared addedHandler As Boolean
+
+    Private Shared addedHandlerLockObject As New Object
+
+    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
+        If My.Application.SaveMySettingsOnExit Then
+            My.Settings.Save()
+        End If
+    End Sub
+#End If
+#End Region
+        
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+                
+#If _MyType = "WindowsForms" Then
+               If Not addedHandler Then
+                    SyncLock addedHandlerLockObject
+                        If Not addedHandler Then
+                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                            addedHandler = True
+                        End If
+                    End SyncLock
+                End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+    
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
+    Friend Module MySettingsProperty
+        
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
+        Friend ReadOnly Property Settings() As Global.DocumentInfoTest.My.MySettings
+            Get
+                Return Global.DocumentInfoTest.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace

+ 7 - 0
Demo/Examples/Samples/DocumentInfoTest/VB/My Project/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 6 - 0
Demo/Examples/Samples/EncryptTest/VB/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>

BIN
Demo/Examples/Samples/EncryptTest/VB/ComPDFKit_Logo.ico


+ 314 - 0
Demo/Examples/Samples/EncryptTest/VB/EncryptTest.vb

@@ -0,0 +1,314 @@
+Imports ComPDFKit.PDFDocument
+Imports System
+Imports System.IO
+
+Module EncryptTest
+    Private outputPath As String = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()))) & "\Output\VB"
+    Private userPassword As String = String.Empty
+    Private ownerPassword As String = String.Empty
+
+    Sub Main(args As String())
+        Console.WriteLine("Running Encrypt test sample..." & vbCrLf)
+        SDKLicenseHelper.LicenseVerify()
+
+        If Not Directory.Exists(outputPath) Then
+            Directory.CreateDirectory(outputPath)
+        End If
+
+        ' Encrypt by user password
+        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If EncryptByUserPassword(document) Then
+            Console.WriteLine("Encrypt by user password done.")
+        Else
+            Console.WriteLine("Encrypt by user password failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Encrypt by owner password
+        document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If EncryptByOwnerPassword(document) Then
+            Console.WriteLine("Encrypt by owner password done.")
+        Else
+            Console.WriteLine("Encrypt by owner password failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Encrypt by both user and owner passwords
+        document = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
+
+        If EncryptByAllPasswords(document) Then
+            Console.WriteLine("Encrypt by Both user and owner passwords done.")
+        Else
+            Console.WriteLine("Encrypt by Both user and owner passwords failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Unlock
+        document = CPDFDocument.InitWithFilePath("AllPasswords.pdf")
+
+        If Unlock(document) Then
+            Console.WriteLine("Unlock done.")
+        Else
+            Console.WriteLine("Unlock failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        ' Decrypt
+        document = CPDFDocument.InitWithFilePath("AllPasswords.pdf")
+
+        If Decrypt(document) Then
+            Console.WriteLine("Decrypt done.")
+        Else
+            Console.WriteLine("Decrypt failed.")
+        End If
+
+        document.Release()
+        Console.WriteLine("--------------------")
+
+        Console.WriteLine("Done!")
+        Console.WriteLine("--------------------")
+        Console.ReadLine()
+    End Sub
+
+    Private Function EncryptUseRC4Algo(document As CPDFDocument, permissionsInfo As CPDFPermissionsInfo) As Boolean
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelRC4
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptUseRC4Test.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted")
+            Console.WriteLine("Browse the changed file in: " & encryptPath)
+            Console.WriteLine("User password is: {0}", userPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Function EncryptUseAES128Algo(document As CPDFDocument, permissionsInfo As CPDFPermissionsInfo) As Boolean
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelAES128
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptUseAES128Test.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted")
+            Console.WriteLine("Browse the changed file in: " & encryptPath)
+            Console.WriteLine("User password is: {0}", userPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Function EncryptUseAES256Algo(document As CPDFDocument, permissionsInfo As CPDFPermissionsInfo) As Boolean
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelAES256
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptUseAES256Test.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted")
+            Console.WriteLine("Browse the changed file in " & encryptPath)
+            Console.WriteLine("User password is: {0}", userPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Function EncryptUseNoEncryptAlgo(document As CPDFDocument, permissionsInfo As CPDFPermissionsInfo) As Boolean
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelNoEncryptAlgo
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptUseNoEncryptAlgoTest.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted.")
+            Console.WriteLine("Browse the changed file in " & encryptPath)
+            Console.WriteLine("User password is: {0}", userPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Function EncryptByUserPassword(document As CPDFDocument) As Boolean
+        Dim result As Boolean = True
+        userPassword = "User"
+        ownerPassword = String.Empty
+        Dim permissionsInfo As New CPDFPermissionsInfo()
+
+        If EncryptUseRC4Algo(document, permissionsInfo) Then
+            Console.WriteLine("RC4 encrypt done." & vbCrLf)
+        Else
+            Console.WriteLine("RC4 encrypt failed." & vbCrLf)
+            result = False
+        End If
+
+        If EncryptUseAES128Algo(document, permissionsInfo) Then
+            Console.WriteLine("AES128 encrypt done." & vbCrLf)
+        Else
+            Console.WriteLine("AES128 encrypt failed." & vbCrLf)
+            result = False
+        End If
+
+        If EncryptUseAES256Algo(document, permissionsInfo) Then
+            Console.WriteLine("AES256 encrypt done." & vbCrLf)
+        Else
+            Console.WriteLine("AES256 encrypt failed." & vbCrLf)
+            result = False
+        End If
+
+        If EncryptUseNoEncryptAlgo(document, permissionsInfo) Then
+            Console.WriteLine("NoEncryptAlgo encrypt done." & vbCrLf)
+        Else
+            Console.WriteLine("NoEncryptAlgo encrypt failed." & vbCrLf)
+            result = False
+        End If
+
+        Return result
+    End Function
+
+    Private Function EncryptByOwnerPassword(document As CPDFDocument) As Boolean
+        userPassword = Nothing
+        ownerPassword = "Owner"
+        Dim permissionsInfo As New CPDFPermissionsInfo()
+        permissionsInfo.AllowsPrinting = False
+        permissionsInfo.AllowsCopying = False
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelRC4
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptByOwnerPasswordTest.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted.")
+            Console.WriteLine("Browse the changed file in " & encryptPath)
+            Console.WriteLine("Owner password is: {0}", ownerPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Function EncryptByAllPasswords(document As CPDFDocument) As Boolean
+        userPassword = "User"
+        ownerPassword = "Owner"
+        Dim permissionsInfo As New CPDFPermissionsInfo()
+        permissionsInfo.AllowsPrinting = False
+        permissionsInfo.AllowsCopying = False
+        Dim encryptionLevel As CPDFDocumentEncryptionLevel = CPDFDocumentEncryptionLevel.CPDFDocumentEncryptionLevelRC4
+        document.Encrypt(userPassword, ownerPassword, permissionsInfo, encryptionLevel)
+        Dim encryptPath As String = outputPath & "\EncryptByAllPasswordsTest.pdf"
+
+        If Not document.WriteToFilePath(encryptPath) Then
+            Return False
+        End If
+
+        Dim encryptedDoc As CPDFDocument = CPDFDocument.InitWithFilePath(encryptPath)
+
+        If encryptedDoc.IsEncrypted Then
+            Console.WriteLine("File is encrypted.")
+            Console.WriteLine("Browse the changed file in " & encryptPath)
+            Console.WriteLine("User password is: {0}", userPassword)
+            Console.WriteLine("Owner password is: {0}", ownerPassword)
+        Else
+            Console.WriteLine("File encrypt failed")
+            Return False
+        End If
+
+        Return True
+    End Function
+
+    Private Sub PrintPermissionsInfo(permissionsInfo As CPDFPermissionsInfo)
+        Console.Write("AllowsPrinting: ")
+        Console.Write(If(permissionsInfo.AllowsPrinting = True, "Yes" & vbCrLf, "No" & vbCrLf))
+        Console.Write("AllowsCopying: ")
+        Console.Write(If(permissionsInfo.AllowsCopying = True, "Yes" & vbCrLf, "No" & vbCrLf))
+    End Sub
+
+    Private Function Unlock(document As CPDFDocument) As Boolean
+        userPassword = "User"
+        ownerPassword = "Owner"
+
+        If document.IsLocked Then
+            Console.WriteLine("Document is locked")
+        End If
+
+        PrintPermissionsInfo(document.GetPermissionsInfo())
+
+        Console.WriteLine("Unlock with owner password")
+        document.CheckOwnerPassword("123")
+
+        PrintPermissionsInfo(document.GetPermissionsInfo())
+
+        Return True
+    End Function
+
+    Private Function Decrypt(document As CPDFDocument) As Boolean
+        userPassword = "User"
+        ownerPassword = "Owner"
+        Dim decryptPath As String = outputPath & "\DecryptTest.pdf"
+        document.UnlockWithPassword(userPassword)
+
+        If Not document.Decrypt(decryptPath) Then
+            Return False
+        End If
+
+        Dim decryptDocument As CPDFDocument = CPDFDocument.InitWithFilePath(decryptPath)
+
+        If decryptDocument.IsEncrypted Then
+            Return False
+        Else
+            Console.WriteLine("Document decrypt done.")
+        End If
+
+        Return True
+    End Function
+End Module

+ 150 - 0
Demo/Examples/Samples/EncryptTest/VB/EncryptTest.vbproj

@@ -0,0 +1,150 @@
+<?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>{36760764-DC79-4857-8500-9BD7CF77101E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <StartupObject>EncryptTest.EncryptTest</StartupObject>
+    <RootNamespace>EncryptTest</RootNamespace>
+    <AssemblyName>Samples_ComPDFKit</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Console</MyType>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Samples_ComPDFKit.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
+    <Prefer32bit>false</Prefer32bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionExplicit>On</OptionExplicit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionCompare>Binary</OptionCompare>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionStrict>Off</OptionStrict>
+  </PropertyGroup>
+  <PropertyGroup>
+    <OptionInfer>On</OptionInfer>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>ComPDFKit_Logo.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+    <Import Include="System.Threading.Tasks" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\LicenseKey.vb">
+      <Link>LicenseKey.vb</Link>
+    </Compile>
+    <Compile Include="EncryptTest.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\TestFile\AllPasswords.pdf">
+      <Link>AllPasswords.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\..\TestFile\CommonFivePage.pdf">
+      <Link>CommonFivePage.pdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x64\ComPDFKit.dll">
+      <Link>x64\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\..\packages\ComPDFKit.NetFramework.1.11.0\build\x86\ComPDFKit.dll">
+      <Link>x86\ComPDFKit.dll</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ComPDFKit_Logo.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\compdfkit\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+</Project>

+ 13 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/Application.Designer.vb

@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+

+ 10 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/Application.myapp

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>2</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>

+ 35 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/AssemblyInfo.vb

@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' 有关程序集的一般信息由以下
+' 控制。更改这些特性值可修改
+' 与程序集关联的信息。
+
+'查看程序集特性的值
+
+<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyDescription("")>
+<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyProduct("VB")>
+<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyTrademark("")>
+
+<Assembly: ComVisible(False)>
+
+'如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
+<Assembly: Guid("73fbbabc-5294-42cd-b6c1-47e4a3a7fe64")>
+
+' 程序集的版本信息由下列四个值组成: 
+'
+'      主版本
+'      次版本
+'      生成号
+'      修订号
+'
+'可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+'通过使用 "*",如下所示:
+' <Assembly: AssemblyVersion("1.0.*")>
+
+<Assembly: AssemblyVersion("1.0.0.0")>
+<Assembly: AssemblyFileVersion("1.0.0.0")>

+ 63 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/Resources.Designer.vb

@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     此代码由工具生成。
+'     运行时版本:4.0.30319.42000
+'
+'     对此文件的更改可能会导致不正确的行为,并且如果
+'     重新生成代码,这些更改将会丢失。
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    '此类是由 StronglyTypedResourceBuilder
+    '类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    '若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    '(以 /str 作为命令选项),或重新生成 VS 项目。
+    '''<summary>
+    '''  一个强类型的资源类,用于查找本地化的字符串等。
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  返回此类使用的缓存的 ResourceManager 实例。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("EncryptTest.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  重写当前线程的 CurrentUICulture 属性,对
+        '''  使用此强类型资源类的所有资源查找执行重写。
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace

+ 117 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 0 - 0
Demo/Examples/Samples/EncryptTest/VB/My Project/Settings.Designer.vb


Някои файлове не бяха показани, защото твърде много файлове са промени