소스 검색

搜索替换 - 合并1.12

liuaoran 1 년 전
부모
커밋
20e0bf43ee
100개의 변경된 파일2069개의 추가작업 그리고 843개의 파일을 삭제
  1. 4 6
      Demo/Examples/Annotations/App.xaml.cs
  2. 3 3
      Demo/Examples/Annotations/Properties/AssemblyInfo.cs
  3. 1 1
      Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFCreateSignatureDialog.xaml
  4. 1 1
      Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFCreateStampDialog.xaml
  5. 1 1
      Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFDeleteDialog.xaml
  6. 1 1
      Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFBOTABarControl.xaml
  7. 22 0
      Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFBOTABarControl.xaml.cs
  8. 1 0
      Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFTitleBarControl.xaml
  9. 6 0
      Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFTitleBarControl.xaml.cs
  10. 15 1
      Demo/Examples/Compdfkit_Tools/Common/BaseControl/NumericUpDownControl.xaml
  11. 103 25
      Demo/Examples/Compdfkit_Tools/Common/BaseControl/NumericUpDownControl.xaml.cs
  12. 17 0
      Demo/Examples/Compdfkit_Tools/Common/Convert/AndMultiBoolValueConverter.cs
  13. 1 1
      Demo/Examples/Compdfkit_Tools/Common/Convert/WindowStateToThicknessConverter.cs
  14. 15 15
      Demo/Examples/Compdfkit_Tools/Common/Helper/CommonHelper.cs
  15. 1 1
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLineStyle/CPDFLineStyleUI.xaml
  16. 2 2
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFLocationControl.xaml
  17. 4 4
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFLocationControl.xaml.cs
  18. 1 1
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFRotationControl.xaml
  19. 4 4
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFRotationControl.xaml.cs
  20. 2 2
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFTileControl.xaml
  21. 4 4
      Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFTileControl.xaml.cs
  22. 6 6
      Demo/Examples/Compdfkit_Tools/Compdfkit_Tools.csproj
  23. 1 1
      Demo/Examples/Compdfkit_Tools/DigitalSignature/AddCertificationControl/AddCustomCertificationControl.xaml
  24. 2 3
      Demo/Examples/Compdfkit_Tools/DigitalSignature/FillDigitalSignatureControl/FillDigitalSignatureControl.xaml
  25. 242 124
      Demo/Examples/Compdfkit_Tools/Edit/ContentEditCOntrol/ContentEditControl.xaml.cs
  26. 5 0
      Demo/Examples/Compdfkit_Tools/Edit/PDFContentEditControl.xaml.cs
  27. 9 3
      Demo/Examples/Compdfkit_Tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml
  28. 56 0
      Demo/Examples/Compdfkit_Tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs
  29. 131 4
      Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchControl/CPDFSearchControl.xaml
  30. 139 12
      Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchControl/CPDFSearchControl.xaml.cs
  31. 57 5
      Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchUI/CPDFSearchInputUI.xaml
  32. 37 0
      Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchUI/CPDFSearchInputUI.xaml.cs
  33. 1 1
      Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageExtract/CPDFPageExtractUI.xaml
  34. 2 0
      Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageExtract/CPDFPageExtractWindow.xaml.cs
  35. 14 4
      Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageInsert/CPDFPageInsertUI.xaml
  36. 2 2
      Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageInsert/CPDFPageInsertUI.xaml.cs
  37. 3 3
      Demo/Examples/Compdfkit_Tools/Properties/AssemblyInfo.cs
  38. 84 2
      Demo/Examples/Compdfkit_Tools/Strings/Bota.Designer.cs
  39. 249 123
      Demo/Examples/Compdfkit_Tools/Strings/Bota.resx
  40. 250 117
      Demo/Examples/Compdfkit_Tools/Strings/Bota.zh.resx
  41. 9 0
      Demo/Examples/Compdfkit_Tools/Strings/Common.Designer.cs
  42. 3 0
      Demo/Examples/Compdfkit_Tools/Strings/Common.resx
  43. 3 0
      Demo/Examples/Compdfkit_Tools/Strings/Common.zh.resx
  44. 3 2
      Demo/Examples/Compdfkit_Tools/Strings/DocEditor.Designer.cs
  45. 204 105
      Demo/Examples/Compdfkit_Tools/Strings/DocEditor.resx
  46. 18 0
      Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.Designer.cs
  47. 6 0
      Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.resx
  48. 6 0
      Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.zh.resx
  49. 1 1
      Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkDialog.xaml
  50. 5 4
      Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkDialog.xaml.cs
  51. 1 1
      Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkListDialog.xaml.cs
  52. 4 6
      Demo/Examples/ContentEditor/App.xaml.cs
  53. 2 12
      Demo/Examples/ContentEditor/ContentEditor.csproj
  54. 3 3
      Demo/Examples/ContentEditor/Properties/AssemblyInfo.cs
  55. 2 2
      Demo/Examples/DigitalSignature/App.xaml.cs
  56. 4 8
      Demo/Examples/DigitalSignature/DigitalSignature.csproj
  57. 3 3
      Demo/Examples/DigitalSignature/Properties/AssemblyInfo.cs
  58. 4 6
      Demo/Examples/DocsEditor/App.xaml.cs
  59. 4 4
      Demo/Examples/DocsEditor/DocsEditor.csproj
  60. 3 3
      Demo/Examples/DocsEditor/Properties/AssemblyInfo.cs
  61. 61 61
      Demo/Examples/Examlpes.sln
  62. 10 11
      Demo/Examples/Forms/App.xaml.cs
  63. 2 14
      Demo/Examples/Forms/Forms.csproj
  64. 3 3
      Demo/Examples/Forms/Properties/AssemblyInfo.cs
  65. 1 5
      Demo/Examples/Measure/Measure.csproj
  66. 3 0
      Demo/Examples/PDFViewer/App.config
  67. 10 8
      Demo/Examples/PDFViewer/App.xaml.cs
  68. 31 9
      Demo/Examples/PDFViewer/MainPage.xaml.cs
  69. 4 3
      Demo/Examples/PDFViewer/MainWindow.xaml
  70. 18 5
      Demo/Examples/PDFViewer/MainWindow.xaml.cs
  71. 14 12
      Demo/Examples/PDFViewer/PDFViewer.csproj
  72. 3 3
      Demo/Examples/PDFViewer/Properties/AssemblyInfo.cs
  73. 12 0
      Demo/Examples/PDFViewer/Properties/Settings.Designer.cs
  74. 3 0
      Demo/Examples/PDFViewer/Properties/Settings.settings
  75. 7 2
      Demo/Examples/PDFViewer/SettingsDialog.xaml
  76. 19 0
      Demo/Examples/PDFViewer/SettingsDialog.xaml.cs
  77. 10 1
      Demo/Examples/PDFViewer/Strings/SettingDialog.Designer.cs
  78. 3 0
      Demo/Examples/PDFViewer/Strings/SettingDialog.resx
  79. 3 0
      Demo/Examples/PDFViewer/Strings/SettingDialog.zh.resx
  80. 2 2
      Demo/Examples/Samples/AnnotationImportExportTest/CS/AnnotationImportExportTest.csproj
  81. 3 3
      Demo/Examples/Samples/AnnotationImportExportTest/CS/Properties/AssemblyInfo.cs
  82. 3 2
      Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vbproj
  83. 4 4
      Demo/Examples/Samples/AnnotationImportExportTest/VB/My Project/AssemblyInfo.vb
  84. 2 2
      Demo/Examples/Samples/AnnotationTest/CS/AnnotationTest.csproj
  85. 3 3
      Demo/Examples/Samples/AnnotationTest/CS/Properties/AssemblyInfo.cs
  86. 2 2
      Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vbproj
  87. 6 6
      Demo/Examples/Samples/AnnotationTest/VB/My Project/AssemblyInfo.vb
  88. 3 2
      Demo/Examples/Samples/BackgroundTest/CS/BackgroundTest.csproj
  89. 3 3
      Demo/Examples/Samples/BackgroundTest/CS/Properties/AssemblyInfo.cs
  90. 2 2
      Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vbproj
  91. 6 6
      Demo/Examples/Samples/BackgroundTest/VB/My Project/AssemblyInfo.vb
  92. 2 2
      Demo/Examples/Samples/BatesTest/CS/BatesTest.csproj
  93. 3 3
      Demo/Examples/Samples/BatesTest/CS/Properties/AssemblyInfo.cs
  94. 2 2
      Demo/Examples/Samples/BatesTest/VB/BatesTest.vbproj
  95. 6 6
      Demo/Examples/Samples/BatesTest/VB/My Project/AssemblyInfo.vb
  96. 2 2
      Demo/Examples/Samples/BookmarkTest/CS/BookmarkTest.csproj
  97. 3 3
      Demo/Examples/Samples/BookmarkTest/CS/Properties/AssemblyInfo.cs
  98. 2 2
      Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vbproj
  99. 6 6
      Demo/Examples/Samples/BookmarkTest/VB/My Project/AssemblyInfo.vb
  100. 0 0
      Demo/Examples/Samples/DigitalSignatureTest/CS/Properties/AssemblyInfo.cs

+ 4 - 6
Demo/Examples/Annotations/App.xaml.cs

@@ -3,9 +3,7 @@ using ComPDFKit.NativeMethod;
 using Compdfkit_Tools.Helper;
 using System.Reflection;
 using System.Threading;
-using System.Windows;
-using System.Xml;
-using static ComPDFKit.NativeMethod.CPDFSDKVerifier;
+using System.Windows; 
 
 
 namespace AnnotationViewControl
@@ -24,12 +22,12 @@ namespace AnnotationViewControl
             Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
         }
 
-        private static bool LicenseVerify()
+        public static bool LicenseVerify()
         {
-            if (!LoadNativeLibrary())
+            if (!CPDFSDKVerifier.LoadNativeLibrary())
                 return false;
 
-            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify("license_key_windows.txt", true);
+            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(SDKLicenseHelper.ParseLicenseXML(), false);
             return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
         }
     }

+ 3 - 3
Demo/Examples/Annotations/Properties/AssemblyInfo.cs

@@ -12,7 +12,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Annotations_ComPDFKit")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -51,5 +51,5 @@ using System.Windows;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFCreateSignatureDialog.xaml

@@ -9,7 +9,7 @@
         AllowsTransparency="True" 
         WindowStyle="None"
         Loaded="Window_Loaded"
-        Title="CreateSignatureDialog" Height="422" Width="626">
+        Title="CreateSignatureDialog" Height="422" Width="626"  BorderThickness="1" BorderBrush="#5A000000">
     <Window.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFCreateStampDialog.xaml

@@ -10,7 +10,7 @@
         ShowInTaskbar="False"
         ResizeMode="NoResize"
         Loaded="Window_Loaded"
-        Title="CreateStampDialog" Height="357" Width="626">
+        Title="CreateStampDialog" Height="357" Width="626" BorderThickness="1" BorderBrush="#5A000000">
     <Window.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFDeleteDialog.xaml

@@ -8,7 +8,7 @@
         AllowsTransparency="True" 
         WindowStyle="None"
         Loaded="Window_Loaded"
-        Title="DeleteDialog" Height="146" Width="318">
+        Title="DeleteDialog" Height="146" Width="318"  BorderThickness="1" BorderBrush="#5A000000">
     <Window.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFBOTABarControl.xaml

@@ -4,7 +4,7 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              mc:Ignorable="d" 
-             d:DesignHeight="800" d:DesignWidth="300">
+             d:DesignHeight="800" d:DesignWidth="300" Loaded="CPDFBOTABarControl_OnLoaded">
     <UserControl.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>

+ 22 - 0
Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFBOTABarControl.xaml.cs

@@ -35,6 +35,19 @@ namespace Compdfkit_Tools.PDFControl
         private ToggleButton signatureButton;
         ToggleButton checkBtn;
 
+        public bool ReplaceFunctionEnabled
+        {
+            get;
+            set;
+            // set
+            // {
+            //     if (searchControl?.ReplaceTog != null)
+            //     {
+            //         searchControl.ReplaceTog.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
+            //     }
+            // }
+        }
+
         private Dictionary<BOTATools,ToggleButton> botaToolBtnDic;
         public event EventHandler DeleteSignatureEvent;
         public event EventHandler<CPDFSignature> ViewCertificateEvent; 
@@ -386,6 +399,7 @@ namespace Compdfkit_Tools.PDFControl
                                         searchControl.InitWithPDFViewer(pdfViewer);
                                     }
                                 }
+                                searchControl.ReplaceTog.Visibility = ReplaceFunctionEnabled ? Visibility.Visible : Visibility.Collapsed;
                                 SetBotaTool(searchControl);
                                 checkBtn = searchButton;
                             }
@@ -472,6 +486,14 @@ namespace Compdfkit_Tools.PDFControl
                 control.LoadSignatureList();
             }
         }
+
+        private void CPDFBOTABarControl_OnLoaded(object sender, RoutedEventArgs e)
+        {
+            if(searchControl!=null && searchControl.ReplaceTog!=null)
+            {
+                searchControl.ReplaceTog.Visibility = ReplaceFunctionEnabled ? Visibility.Visible : Visibility.Collapsed;
+            }
+        }
         public void LoadThumbnail()
         {
             UIElement currentBotaTool = GetBotaTool();

+ 1 - 0
Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFTitleBarControl.xaml

@@ -27,6 +27,7 @@
                         <MenuItem Header="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=FileMenu_Open}" Name="OpenFileItem" Style="{StaticResource Sub_MenuItem}" Click="OpenFileItem_Click"></MenuItem>
                         <MenuItem Header="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=FileMenu_Save}" Style="{StaticResource Sub_MenuItem}"  Click="SaveFileItem_Click" IsEnabled="{Binding CanSave, RelativeSource={RelativeSource AncestorType=UserControl}}"></MenuItem>
                         <MenuItem Header="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=FileMenu_SaveAs}" Style="{StaticResource Sub_MenuItem}"  Click="SaveAsItem_Click"></MenuItem>
+                        <MenuItem Header="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=FileMenu_Flatten}" Style="{StaticResource Sub_MenuItem}"  Click="FlattenItem_Click"></MenuItem>
                     </MenuItem>
                     
                     <MenuItem Header="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=Menu_Help}" Style="{StaticResource Dropdown_MenuItem}">

+ 6 - 0
Demo/Examples/Compdfkit_Tools/Common/BarControl/CPDFTitleBarControl.xaml.cs

@@ -18,6 +18,7 @@ namespace Compdfkit_Tools.PDFControl
         public event EventHandler OpenFileEvent;
         public event EventHandler SaveFileEvent;
         public event EventHandler SaveAsFileEvent;
+        public event EventHandler FlattenEvent; 
 
         public CPDFTitleBarControl()
         {
@@ -73,5 +74,10 @@ namespace Compdfkit_Tools.PDFControl
             };
             deviceSerialControl.ShowDialog();
         }
+
+        private void FlattenItem_Click(object sender, RoutedEventArgs e)
+        {
+            FlattenEvent?.Invoke(sender, RoutedEventArgs.Empty);
+        }
     }
 }

+ 15 - 1
Demo/Examples/Compdfkit_Tools/Common/BaseControl/NumericUpDownControl.xaml

@@ -4,6 +4,7 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:Compdfkit_Tools.Common"
+             x:Name="UserControl"
              mc:Ignorable="d" 
             d:DesignHeight="30" d:DesignWidth="100">
     <UserControl.Resources>
@@ -95,7 +96,20 @@
         </Style>
     </UserControl.Resources>
     <Grid>
-        <TextBox x:Name="TextBox" Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource NumericUpDownStyle}" InputMethod.IsInputMethodEnabled="False" PreviewTextInput="TextBox_PreviewTextInput" PreviewKeyDown="TextBox_PreviewKeyDown" TextChanged="TextBox_TextChanged"></TextBox>
+        <TextBox x:Name="TextBox" 
+                 Style="{StaticResource NumericUpDownStyle}" 
+                 InputMethod.IsInputMethodEnabled="False" 
+                 PreviewTextInput="TextBox_PreviewTextInput" 
+                 PreviewKeyDown="TextBox_PreviewKeyDown" 
+                 TextChanged="TextBox_TextChanged">
+            <TextBox.Text>
+                <Binding Path="Text" RelativeSource="{RelativeSource AncestorType=UserControl}"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
+                    <Binding.ValidationRules>
+                        <local:CustomValidationRule x:Name="Validator"/>
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox.Text>
+        </TextBox>
     </Grid>
 </UserControl>
 

+ 103 - 25
Demo/Examples/Compdfkit_Tools/Common/BaseControl/NumericUpDownControl.xaml.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Globalization;
 using System.Text.RegularExpressions;
 using System.Windows;
 using System.Windows.Controls;
@@ -13,39 +14,61 @@ namespace Compdfkit_Tools.Common
 
         // The dependency property which will be accessible on the UserControl
         public static readonly DependencyProperty UnitProperty =
-            DependencyProperty.Register("Unit", typeof(string), typeof(NumericUpDownControl), new UIPropertyMetadata());
+            DependencyProperty.Register(nameof(Unit), typeof(string), typeof(NumericUpDownControl), new UIPropertyMetadata());
 
         public string Unit
         {
-            get { return (string)GetValue(UnitProperty); }
-            set { SetValue(UnitProperty, value); }
+            get => (string)GetValue(UnitProperty);
+            set => SetValue(UnitProperty, value);
         }
 
         // The dependency property which will be accessible on the UserControl
-        public static readonly DependencyProperty MaxiumProperty =
-           DependencyProperty.Register("Maxium", typeof(int), typeof(NumericUpDownControl), new UIPropertyMetadata());
-        public int Maxium
+        public static readonly DependencyProperty MaximumProperty =
+            DependencyProperty.Register(nameof(Maximum), typeof(int), typeof(NumericUpDownControl), new UIPropertyMetadata(HandleMaxValueChanged));
+        public int Maximum
         {
-            get { return (int)GetValue(MaxiumProperty); }
-            set { SetValue(MaxiumProperty, value); }
+            get => (int)GetValue(MaximumProperty);
+            set => SetValue(MaximumProperty, value);
         }
 
         // The dependency property which will be accessible on the UserControl
         public static readonly DependencyProperty TextProperty =
-            DependencyProperty.Register("Text", typeof(string), typeof(NumericUpDownControl), new UIPropertyMetadata());
+            DependencyProperty.Register(nameof(Text), typeof(string), typeof(NumericUpDownControl), new UIPropertyMetadata());
         public string Text
         {
-            get { return (string)GetValue(TextProperty); }
-            set { SetValue(TextProperty, value); }
+            get => (string)GetValue(TextProperty);
+            set => SetValue(TextProperty, value);
         }
 
         public static readonly DependencyProperty MinimumProperty =
-    DependencyProperty.Register("Minimum", typeof(int), typeof(NumericUpDownControl), new UIPropertyMetadata());
+            DependencyProperty.Register(nameof(Minimum), typeof(int), typeof(NumericUpDownControl), new UIPropertyMetadata(HandleMinValueChanged));
         public int Minimum
         {
-            get { return (int)GetValue(MinimumProperty); }
-            set { SetValue(MinimumProperty, value); }
+            get => (int)GetValue(MinimumProperty);
+            set => SetValue(MinimumProperty, value);
         }
+        
+        // The dependency property which will be accessible on the UserControl
+        public static readonly DependencyProperty IsValueValidProperty =
+            DependencyProperty.Register(nameof(IsValueValid), typeof(bool), typeof(NumericUpDownControl), new UIPropertyMetadata());
+        public bool IsValueValid
+        {
+            get => (bool)GetValue(IsValueValidProperty);
+            set => SetValue(IsValueValidProperty, value);
+        }
+        
+        private static void HandleMinValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            NumericUpDownControl source = (NumericUpDownControl) d;
+            source.Validator.MinValue = (int) e.NewValue;
+        }
+        
+        private static void HandleMaxValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            NumericUpDownControl source = (NumericUpDownControl) d;
+            source.Validator.MaxValue = (int) e.NewValue;
+        }
+        
         public NumericUpDownControl()
         {
             InitializeComponent();
@@ -85,39 +108,94 @@ namespace Compdfkit_Tools.Common
 
         private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
         {
-            if (!string.IsNullOrEmpty(TextBox.Text))
+            if(int.TryParse(TextBox.Text, out int num))
             {
-                if (int.Parse(TextBox.Text) > Maxium)
+                if (num <= Maximum && num >= Minimum)
                 {
-                    TextBox.Text = Maxium.ToString();
+                    IsValueValid = true;
+                    return;
                 }
+            }
+            IsValueValid = false;
+        }
 
-                if (int.Parse(TextBox.Text) < Minimum)
+        private void UpButton_Click(object sender, RoutedEventArgs e)
+        {
+            if (int.TryParse(TextBox.Text, out int num))
+            {
+                int newNum = num + 1;
+                if (newNum > Maximum)
+                {
+                    TextBox.Text = Maximum.ToString();
+                }
+                else if(newNum < Minimum)
                 {
                     TextBox.Text = Minimum.ToString();
                 }
+                else
+                {
+                    TextBox.Text = newNum.ToString();
+                }
             }
             else
             {
-                TextBox.Text = GetMinAbsoluteValue(Minimum, Maxium).ToString();
+                TextBox.Text = Minimum.ToString();
             }
         }
 
-        private void UpButton_Click(object sender, RoutedEventArgs e)
+        private void DownButton_Click(object sender, RoutedEventArgs e)
         {
             if (int.TryParse(TextBox.Text, out int num))
             {
-                TextBox.Text = (++num).ToString();
+                int newNum = num - 1;
+                if (newNum > Maximum)
+                {
+                    TextBox.Text = Maximum.ToString();
+                }
+                else if (newNum < Minimum)
+                {
+                    TextBox.Text = Minimum.ToString();
+                }
+                else
+                {
+                    TextBox.Text = newNum.ToString();
+                }
+            }
+            else
+            {
+                TextBox.Text = Minimum.ToString();
             }
         }
-
-        private void DownButton_Click(object sender, RoutedEventArgs e)
+    }
+    
+    public class CustomValidationRule : ValidationRule
+    {
+        public int MaxValue { get; set; }
+        public int MinValue { get; set; }
+        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
         {
-            if (int.TryParse(TextBox.Text, out int num))
+            if (value == null)
             {
-                TextBox.Text = (--num).ToString();
+                return new ValidationResult(false, "Value cannot be empty.");
+            }
+
+            if (int.TryParse(value.ToString(), out int num))
+            {
+                if (num <= MaxValue && num >= MinValue)
+                {
+                    return new ValidationResult(true, null);
+                }
+                else
+                {
+                    return new ValidationResult(false, $"Value must be between {MinValue} and {MaxValue}.");
+                }
+            }
+            else
+            {
+                return new ValidationResult(false, "Value must be an integer.");
             }
         }
     }
+
 }
 

+ 17 - 0
Demo/Examples/Compdfkit_Tools/Common/Convert/AndMultiBoolValueConverter.cs

@@ -22,4 +22,21 @@ namespace Compdfkit_Tools.Common
             return Enumerable.Repeat(DependencyProperty.UnsetValue, targetTypes.Length).ToArray();
         }
     }
+    
+    public class OrMultiBoolValueConverter : IMultiValueConverter
+    {
+        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (values != null && values.All(v => v is bool boolValue))
+            {
+                return values.Cast<bool>().Any(v => v);
+            }
+            return DependencyProperty.UnsetValue; 
+        }
+
+        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+        {
+            return Enumerable.Repeat(DependencyProperty.UnsetValue, targetTypes.Length).ToArray();
+        }
+    }
 }

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Common/Convert/WindowStateToThicknessConverter.cs

@@ -18,7 +18,7 @@ namespace Compdfkit_Tools.Common
             else
             {
                 // left, right and bottom borders are still drawn by the system
-                return new Thickness(1);
+                return new Thickness(2);
             }
         }
 

+ 15 - 15
Demo/Examples/Compdfkit_Tools/Common/Helper/CommonHelper.cs

@@ -34,25 +34,25 @@ namespace Compdfkit_Tools.Helper
 {
     public class SDKLicenseHelper
     {
-        public string key = string.Empty;
-        public string secret = string.Empty;
-        public SDKLicenseHelper()
+        public static string ParseLicenseXML()
         {
-            string sdkLicensePath = "license_key_windows.xml";
-            XmlDocument xmlDocument = new XmlDocument();
-            xmlDocument.Load(sdkLicensePath);
-
-            XmlNode keyNode = xmlDocument.SelectSingleNode("/license/key");
-            XmlNode secretNode = xmlDocument.SelectSingleNode("/license/secret");
-
-            if (keyNode != null && secretNode != null)
+            try
             {
-                key = keyNode.InnerText;
-                secret = secretNode.InnerText;
+                XmlDocument xmlDocument = new XmlDocument();
+                xmlDocument.Load("license_key_windows.xml");
+                XmlNode xmlNode = xmlDocument.SelectSingleNode("/license/key");
+                if (xmlNode == null)
+                {
+                    return string.Empty;
+                }
+                else
+                {
+                    return xmlNode.InnerText;
+                }
             }
-            else
+            catch
             {
-                Console.WriteLine("Key or secret element not found in the XML.");
+                return string.Empty;
             }
         }
     }

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLineStyle/CPDFLineStyleUI.xaml

@@ -60,7 +60,7 @@
                     <Line Name="DashLineControl" Margin="10,0,0,0" Grid.Row="1" Grid.Column="1" Stroke="#000000" StrokeThickness="2" X1="0" Y1="0" X2="112" Y2="0" VerticalAlignment="Center" StrokeDashArray="0,1,1"></Line>
                 </RadioButton>
             </StackPanel>
-            <local:NumericUpDownControl x:Name="NumericUpDownControl" VerticalAlignment="Bottom" Text="{Binding DashSpacing, Mode=TwoWay}" Grid.Column="1" Width="72" Height="28" Unit="pt" Minimum="1" Maxium="10" IsEnabled="{Binding ElementName=DashRadioButton, Path=IsChecked}"></local:NumericUpDownControl>
+            <local:NumericUpDownControl x:Name="NumericUpDownControl" VerticalAlignment="Bottom" Text="{Binding DashSpacing, Mode=TwoWay}" Grid.Column="1" Width="72" Height="28" Unit="pt" Minimum="1" Maximum="10" IsEnabled="{Binding ElementName=DashRadioButton, Path=IsChecked}"></local:NumericUpDownControl>
         </Grid>
     </Grid>
 

+ 2 - 2
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFLocationControl.xaml

@@ -20,11 +20,11 @@
             </Grid.RowDefinitions>
             <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="4">
                 <TextBlock Text="X" VerticalAlignment="Center" Margin="0,0,8,0"></TextBlock>
-                <local:NumericUpDownControl x:Name="XNumericControl" Height="32" Width="90" Unit="mm" Text="{Binding HorizOffsetValue, Mode=TwoWay}"  Minimum="0" Maxium="99"></local:NumericUpDownControl>
+                <local:NumericUpDownControl x:Name="XNumericControl" Height="32" Width="90" Unit="mm" Text="{Binding HorizOffsetValue, Mode=TwoWay}"  Minimum="0" Maximum="199"></local:NumericUpDownControl>
             </StackPanel>
             <StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="4">
                 <TextBlock Text="Y" VerticalAlignment="Center" Margin="0,0,8,0"></TextBlock>
-                <local:NumericUpDownControl x:Name="YNumericControl" Height="32" Width="90" Unit="mm"  Text="{Binding VertOffsetValue, Mode=TwoWay}"  Minimum="0" Maxium="99"></local:NumericUpDownControl>
+                <local:NumericUpDownControl x:Name="YNumericControl" Height="32" Width="90" Unit="mm"  Text="{Binding VertOffsetValue, Mode=TwoWay}"  Minimum="0" Maximum="199"></local:NumericUpDownControl>
             </StackPanel>
         </Grid>
     </Grid>

+ 4 - 4
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFLocationControl.xaml.cs

@@ -56,9 +56,9 @@ namespace Compdfkit_Tools.Common
                 {
                     return;
                 }
-                if (int.Parse(value) > XNumericControl.Maxium)
+                if (int.Parse(value) > XNumericControl.Maximum)
                 {
-                    value = XNumericControl.Maxium.ToString();
+                    value = XNumericControl.Maximum.ToString();
                 }
                 if (int.Parse(value) < XNumericControl.Minimum)
                 {
@@ -81,9 +81,9 @@ namespace Compdfkit_Tools.Common
                 {
                     return;
                 }
-                if (int.Parse(value) > YNumericControl.Maxium)
+                if (int.Parse(value) > YNumericControl.Maximum)
                 {
-                    value = YNumericControl.Maxium.ToString();
+                    value = YNumericControl.Maximum.ToString();
                 }
                 if (int.Parse(value) < YNumericControl.Minimum)
                 {

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFRotationControl.xaml

@@ -35,7 +35,7 @@
             <ColumnDefinition Width="auto"></ColumnDefinition>
             <ColumnDefinition  Width="auto"></ColumnDefinition>
         </Grid.ColumnDefinitions>
-        <local:NumericUpDownControl x:Name="NumericUpDownControl" Width="82" Minimum="-360" Maxium="360" Text="{Binding RotationText, Mode=TwoWay}"></local:NumericUpDownControl>
+        <local:NumericUpDownControl x:Name="NumericUpDownControl" Width="82" Minimum="-360" Maximum="360" Text="{Binding RotationText, Mode=TwoWay}"></local:NumericUpDownControl>
         <StackPanel Grid.Column="1" Orientation="Horizontal" Margin="8,0,0,0">
             <Button x:Name="CounterclockwiseBtn"  Style="{StaticResource TransparentButtonStyle}" Click="RotationBtn_Click">
                 <Path HorizontalAlignment="Center" VerticalAlignment="Center" Data="M14.5,0H1.5V16H14.5V0ZM13.5,1V15H2.5V1H13.5ZM6.58579,3.75736L3.75736,6.58579L9.41421,12.2426L12.2426,9.41421L6.58579,3.75736Z" Fill="#001A4E" />

+ 4 - 4
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFRotationControl.xaml.cs

@@ -38,9 +38,9 @@ namespace Compdfkit_Tools.Common
 
                 if (int.TryParse(value, out result))
                 {
-                    if (result > NumericUpDownControl.Maxium)
+                    if (result > NumericUpDownControl.Maximum)
                     {
-                        value = NumericUpDownControl.Maxium.ToString();
+                        value = NumericUpDownControl.Maximum.ToString();
                     }
                     if (result < NumericUpDownControl.Minimum)
                     {
@@ -69,7 +69,7 @@ namespace Compdfkit_Tools.Common
             {
                 if (btn.Name == "CounterclockwiseBtn")
                 {
-                    RotationText = (int.Parse(RotationText) + 45).ToString();
+                    RotationText = (int.Parse(RotationText) - 45).ToString();
                 }
                 else if (btn.Name == "ResetBtn")
                 {
@@ -77,7 +77,7 @@ namespace Compdfkit_Tools.Common
                 }
                 else if (btn.Name == "ClockwiseBtn")
                 {
-                    RotationText = (int.Parse(RotationText) - 45).ToString();
+                    RotationText = (int.Parse(RotationText) + 45).ToString();
                 }
             }
         }

+ 2 - 2
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFTileControl.xaml

@@ -32,13 +32,13 @@
                 <Canvas Width="16" Height="16" Margin="0,0,4,0">
                     <Path Fill="Black" Data="M1,4H2V12H1V4ZM4.70703,7.5H11.2952L10.0278,6.23223L10.7349,5.52513L13.2097,8L10.7349,10.4749L10.0278,9.76777L11.2952,8.5H4.70703L5.97487,9.76777L5.26777,10.4749L2.79289,8L5.26777,5.52513L5.97487,6.23223L4.70703,7.5ZM15,4H14V12H15V4Z"/>
                 </Canvas>
-                <local:NumericUpDownControl x:Name="HorizontalNumericControl" Height="32" Width="90"  Margin="0,0,4,0" Minimum="0" Maxium="99" Text="{Binding HorizontalSpacingValue, Mode=TwoWay}" Unit="mm"></local:NumericUpDownControl>
+                <local:NumericUpDownControl x:Name="HorizontalNumericControl" Height="32" Width="90"  Margin="0,0,4,0" Minimum="0" Maximum="99" Text="{Binding HorizontalSpacingValue, Mode=TwoWay}" Unit="mm"></local:NumericUpDownControl>
             </StackPanel>
             <StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
                 <Canvas Width="16" Height="16"  Margin="0,0,4,0">
                     <Path Fill="Black" Data="M12,1V2L4,2V1L12,1ZM8.5,4.70703V11.2952L9.76777,10.0278L10.4749,10.7349L8,13.2097L5.52513,10.7349L6.23223,10.0278L7.5,11.2952L7.5,4.70703L6.23223,5.97487L5.52513,5.26777L8,2.79289L10.4749,5.26777L9.76777,5.97487L8.5,4.70703ZM12,15V14H4V15H12Z"/>
                 </Canvas>
-                <local:NumericUpDownControl  x:Name="VerticalNumericControl" Height="32" Width="90"  Margin="0,0,4,0"  Minimum="0" Maxium="99" Text="{Binding VerticalSpacingValue, Mode=TwoWay}" Unit="mm"></local:NumericUpDownControl>
+                <local:NumericUpDownControl  x:Name="VerticalNumericControl" Height="32" Width="90"  Margin="0,0,4,0"  Minimum="0" Maximum="99" Text="{Binding VerticalSpacingValue, Mode=TwoWay}" Unit="mm"></local:NumericUpDownControl>
             </StackPanel>
 
 

+ 4 - 4
Demo/Examples/Compdfkit_Tools/Common/PropertyControl/PDFLocation/CPDFTileControl.xaml.cs

@@ -45,9 +45,9 @@ namespace Compdfkit_Tools.Common
                 {
                     return;
                 }
-                if (int.Parse(value) > VerticalNumericControl.Maxium)
+                if (int.Parse(value) > VerticalNumericControl.Maximum)
                 {
-                    value = VerticalNumericControl.Maxium.ToString();
+                    value = VerticalNumericControl.Maximum.ToString();
                 }
                 if (int.Parse(value) < VerticalNumericControl.Minimum)
                 {
@@ -70,9 +70,9 @@ namespace Compdfkit_Tools.Common
                 {
                     return;
                 }
-                if (int.Parse(value) > HorizontalNumericControl.Maxium)
+                if (int.Parse(value) > HorizontalNumericControl.Maximum)
                 {
-                    value = VerticalNumericControl.Maxium.ToString();
+                    value = VerticalNumericControl.Maximum.ToString();
                 }
                 if (int.Parse(value) < HorizontalNumericControl.Minimum)
                 {

+ 6 - 6
Demo/Examples/Compdfkit_Tools/Compdfkit_Tools.csproj

@@ -1293,18 +1293,18 @@
     </Page>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
+    <ProjectReference Include="..\..\..\..\ComPDFKit-ForRebuild\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\..\ComPDFKit-Rebuild\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
       <Project>{a061ee7a-6704-4bd9-86ee-48ed5df75e2f}</Project>
       <Name>ComPDFKit.Tool</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
+    <ProjectReference Include="..\..\..\..\ComPDFKit-Rebuild\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
       <Project>{783263cf-0da3-4095-9df8-2c4a6b3ff908}</Project>
       <Name>ComPDFKit.Viewer</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
-      <Project>{56E518AD-C126-4B48-9A09-0A64C87020E4}</Project>
-      <Name>ComPDFKit.Desk</Name>
-    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 1 - 1
Demo/Examples/Compdfkit_Tools/DigitalSignature/AddCertificationControl/AddCustomCertificationControl.xaml

@@ -40,7 +40,7 @@
                     <TextBlock Text="*" Foreground="Red" VerticalAlignment="Center"></TextBlock>
                 </StackPanel>
                 <Grid Grid.Column="1">
-                    <TextBox Height="28" x:Name="GrantorNameTxt" VerticalContentAlignment="Center" VerticalAlignment="Center" Text="{Binding GrantorName}"/>
+                    <TextBox Height="28" x:Name="GrantorNameTxt" VerticalContentAlignment="Center" VerticalAlignment="Center" Text="{Binding GrantorName}" MaxLength="50"/>
                     <TextBlock Text="{Binding Converter={StaticResource SigResourceConverter},ConverterParameter=Holder_Name}" VerticalAlignment="Center"  Margin="10,0,0,0" Visibility="{Binding ElementName=GrantorNameTxt, Path=Text, Converter={StaticResource TextLengthToVisibilityConverter}}" IsHitTestVisible="False"  Foreground="#BBB"></TextBlock>
                 </Grid>
                 <TextBlock Grid.Row="1" Text="{Binding Converter={StaticResource SigResourceConverter},ConverterParameter=Tip_Unit}" VerticalAlignment="Center"></TextBlock>

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

@@ -172,7 +172,7 @@
             </Grid>
         </Grid>
         
-        <Border Name="KeyboardPopup" Background="#A0000000" Visibility="Collapsed">
+        <Border Name="KeyboardPopup" Background="#A0000000" Visibility="Visible">
             <Grid Background="White" Width="528" Height="412">
                     <Grid.RowDefinitions>
                         <RowDefinition Height="auto" />
@@ -192,8 +192,7 @@
                         </Path>
                     </Button.Content>
                 </Button>
-                    <TextBox     
-                    x:Name="KeyboardInPutTextBox" Grid.Row="1" BorderThickness="0" Background="#F2F3F5" Margin="10,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="45"/>
+                    <TextBox x:Name="KeyboardInPutTextBox" MaxLength="50" Grid.Row="1" BorderThickness="0" Background="#F2F3F5" Margin="10,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="45"/>
                     <StackPanel Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal" Margin="0,10,20,10">
                         <common:ColorPickerControl x:Name="TextColorPickerControl" Loaded="TextColorPickerControl_Loaded" ColorChanged="TextColorPickerControl_ColorChanged" TransparentBtnProperty="Collapsed"></common:ColorPickerControl>
                     </StackPanel>

+ 242 - 124
Demo/Examples/Compdfkit_Tools/Edit/ContentEditCOntrol/ContentEditControl.xaml.cs

@@ -334,6 +334,7 @@ namespace Compdfkit_Tools.PDFControl
         public void SetBOTAContainer(CPDFBOTABarControl botaControl)
         {
             this.BotaContainer.Child = botaControl;
+            botaControl.ReplaceFunctionEnabled = true;
         }
 
         public void SetDisplaySettingsControl(CPDFDisplaySettingsControl displaySettingsControl)
@@ -362,10 +363,10 @@ namespace Compdfkit_Tools.PDFControl
         {
             PdfViewControl.PDFViewTool.GetCPDFViewer().UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
             PdfViewControl.PDFViewTool.GetCPDFViewer().UndoManager.PropertyChanged += UndoManager_PropertyChanged;
-            PdfViewControl.MouseLeftButtonDownHandler -= PDFToolManager_MouseLeftButtonDownHandler;
-            PdfViewControl.MouseLeftButtonDownHandler += PDFToolManager_MouseLeftButtonDownHandler;
-            PdfViewControl.MouseLeftButtonUpHandler -= PDFToolManager_MouseLeftButtonUpHandler;
-            PdfViewControl.MouseLeftButtonUpHandler += PDFToolManager_MouseLeftButtonUpHandler;
+            //PdfViewControl.MouseLeftButtonDownHandler -= PDFToolManager_MouseLeftButtonDownHandler;
+            //PdfViewControl.MouseLeftButtonDownHandler += PDFToolManager_MouseLeftButtonDownHandler;
+            //PdfViewControl.MouseLeftButtonUpHandler -= PDFToolManager_MouseLeftButtonUpHandler;
+            //PdfViewControl.MouseLeftButtonUpHandler += PDFToolManager_MouseLeftButtonUpHandler;
             PdfViewControl.MouseRightButtonDownHandler -= PdfViewControl_MouseRightButtonDownHandler;
             PdfViewControl.MouseRightButtonDownHandler += PdfViewControl_MouseRightButtonDownHandler;
             PdfViewControl = view;
@@ -373,7 +374,7 @@ namespace Compdfkit_Tools.PDFControl
             FloatPageTool.InitWithPDFViewer(view);
             pdfContentEditControl.InitWithPDFViewer(view);
             DataContext = this;
-            if(PdfViewControl != null)
+            if (PdfViewControl != null)
             {
                 PdfViewControl.PDFViewTool.IsManipulationEnabled = true;
                 //pdfViewer.PDFEditMultiActiveHandler -= PDFEditMultiActiveHandler;
@@ -422,7 +423,7 @@ namespace Compdfkit_Tools.PDFControl
         //    if(e.Count>1)
         //    {
         //       List<CPDFEditType> editList= e.AsEnumerable().Select(x=>x.EditType).Distinct().ToList();
-               
+
         //        if(editList.Count>1)
         //        {
         //            PDFEditEmptyPanel();
@@ -466,7 +467,7 @@ namespace Compdfkit_Tools.PDFControl
             }
             int pageIndex = -1;
             CPDFEditTextArea textArea = PdfViewControl.PDFToolManager.GetSelectedEditAreaObject(ref pageIndex) as CPDFEditTextArea;
-            if(textArea == null)
+            if (textArea == null)
             {
                 return;
             }
@@ -517,7 +518,7 @@ namespace Compdfkit_Tools.PDFControl
                     UpdateTextArea(textArea);
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Right)
                 {
                     textArea.GetNextCharPlace();
@@ -526,7 +527,7 @@ namespace Compdfkit_Tools.PDFControl
                     UpdateTextArea(textArea);
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Up)
                 {
                     textArea.GetUpCharPlace();
@@ -535,7 +536,7 @@ namespace Compdfkit_Tools.PDFControl
                     UpdateTextArea(textArea);
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Down)
                 {
                     textArea.GetDownCharPlace();
@@ -545,7 +546,7 @@ namespace Compdfkit_Tools.PDFControl
                     e.Handled = true;
                 }
             }
-                
+
             if (Keyboard.Modifiers == ModifierKeys.Alt)
             {
                 if (e.SystemKey == Key.Up)
@@ -554,7 +555,7 @@ namespace Compdfkit_Tools.PDFControl
                     UpdateTextArea(textArea);
                     e.Handled = true;
                 }
-                
+
                 if (e.SystemKey == Key.Down)
                 {
                     textArea.GetLineEndCharPlace();
@@ -562,7 +563,7 @@ namespace Compdfkit_Tools.PDFControl
                     e.Handled = true;
                 }
             }
-                
+
             if (Keyboard.Modifiers == ModifierKeys.None)
             {
                 var oldFrame = textArea.GetFrame();
@@ -571,19 +572,19 @@ namespace Compdfkit_Tools.PDFControl
                     oldFrame.left -= 5;
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Right)
                 {
                     oldFrame.left += 5;
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Up)
                 {
                     oldFrame.top -= 5;
                     e.Handled = true;
                 }
-                
+
                 if (e.Key == Key.Down)
                 {
                     oldFrame.top += 5;
@@ -591,7 +592,7 @@ namespace Compdfkit_Tools.PDFControl
                 }
                 textArea.SetFrame(oldFrame);
             }
-                
+
             if (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift))
             {
                 if (isUpdateStartPoint)
@@ -640,15 +641,15 @@ namespace Compdfkit_Tools.PDFControl
         private void UpdateTextArea(CPDFEditTextArea textArea)
         {
             Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
-            PdfViewControl.PDFViewTool.UpdateRender(oldRect,textArea);
+            PdfViewControl.PDFViewTool.UpdateRender(oldRect, textArea);
         }
-        
+
         private void UpdateImageArea(CPDFEditImageArea imageArea)
         {
             Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-            PdfViewControl.PDFViewTool.UpdateRender(oldRect,imageArea);
+            PdfViewControl.PDFViewTool.UpdateRender(oldRect, imageArea);
         }
-        
+
         private void PdfViewControl_MouseRightButtonDownHandler(object sender, MouseEventObject e)
         {
             ContextMenu ContextMenu = PdfViewControl.GetRightMenu();
@@ -672,7 +673,7 @@ namespace Compdfkit_Tools.PDFControl
         {
             int index = -1;
             CPDFEditImageArea imageArea = PdfViewControl.PDFToolManager.GetSelectedEditAreaObject(ref index) as CPDFEditImageArea;
-            
+
             MenuItem rotateLeftMenu = new MenuItem();
             rotateLeftMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RotateLeft");
             rotateLeftMenu.Click += (o, p) =>
@@ -685,100 +686,230 @@ namespace Compdfkit_Tools.PDFControl
                 }
             };
             menu.Items.Add(rotateLeftMenu);
-
-            MenuItem rotateRightMenu = new MenuItem();
-            rotateRightMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RotateRight");
-            rotateRightMenu.Click += (o, p) =>
+            if (BotaContainer.Child is CPDFBOTABarControl botaControl)
             {
-                if (imageArea != null)
-                {
-                    imageArea.Rotate(90);
-                    pdfContentEditControl.RefreshThumb();
-                    UpdateImageArea(imageArea);
-                }
-            };
-            menu.Items.Add(rotateRightMenu);
+                botaControl.ReplaceFunctionEnabled = false;
+            }
+            PDFGrid.Child = null;
+            BotaContainer.Child = null;
+            PropertyContainer.Child = null;
+            displaySettingsControl = null;
+        }
+
+        #region Property changed
+        protected void OnPropertyChanged([CallerMemberName] string name = null)
+        {
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+        }
 
-            MenuItem replaceMenu = new MenuItem();
-            replaceMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Replace");
-            replaceMenu.Click += (o, p) =>
-            {
-                if (imageArea != null)
-                {
-                    OpenFileDialog openFileDialog = new OpenFileDialog();
-                    openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
-                    if (openFileDialog.ShowDialog() == true)
-                    {
-                        //byte[] fileData = File.ReadAllBytes(openFileDialog.FileName);
-                        //Bitmap bitmap = new Bitmap(openFileDialog.FileName);
-                        //imageArea.ReplaceImageArea(imageArea.GetFrame(), fileData, bitmap.Width, bitmap.Height);
-                        imageArea.ReplaceImageArea(imageArea.GetFrame(), openFileDialog.FileName,string.Empty);
-                        pdfContentEditControl.RefreshThumb();
-                        UpdateImageArea(imageArea);
-                    }
-                }
-            };
-            menu.Items.Add(replaceMenu);
 
-            MenuItem exportMenu = new MenuItem();
-            exportMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Export");
-            exportMenu.Click += (o, p) =>
+        public void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            OnPropertyChanged(e.PropertyName);
+            if (e.PropertyName == "CanSave")
             {
-                if (PdfViewControl != null && PdfViewControl.PDFView != null)
-                {
-                    try
-                    {
-                        FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
-                        if (folderBrowserDialog.ShowDialog() == DialogResult.OK && imageArea != null)
-                        {
-                            string path = Path.GetTempPath();
-                            string uuid = Guid.NewGuid().ToString("N");
-                            string imagePath = Path.Combine(path, uuid + ".tmp");
-                            imageArea.ExtractImage(imagePath);
-
-                            Bitmap bitmapImage = new Bitmap(imagePath);
-                            string fileName = Path.Combine(folderBrowserDialog.SelectedPath, uuid + ".jpg");
-                            bitmapImage.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
-                            Process.Start("explorer", "/select,\"" + fileName + "\"");
-                        }
-                    }
-                    catch (Exception ex)
-                    {
+                OnCanSaveChanged?.Invoke(this, CanSave);
+            }
+        }
+        #endregion
 
-                    }
-                }
-            };
-            menu.Items.Add(exportMenu);
+        #region Context menu
 
-            MenuItem opacityMenu = new MenuItem();
-            opacityMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Opacity");
-            menu.Items.Add(opacityMenu);
+        //private void PDFView_PDFEditCommandHandler(object sender, PDFEditCommand e)
+        //{
+        //    if (e == null)
+        //    {
+        //        return;
+        //    }
 
-            AppendOpacityMenu(opacityMenu, imageArea, CPDFEditType.EditImage);
+        //    if (e.EditType == CPDFEditType.EditText)
+        //    {
+        //        e.Handle = true;
+        //        PDFEditTextContextMenu(sender, e);
+        //    }
 
-            MenuItem horizonMirror = new MenuItem();
-            horizonMirror.Header = LanguageHelper.CommonManager.GetString("Menu_HFlip");
-            horizonMirror.Click += (o, p) =>
-            {
-                imageArea?.HorizontalMirror();
-                pdfContentEditControl.RefreshThumb();
-                UpdateImageArea(imageArea);
-            };
-            menu.Items.Add(horizonMirror);
+        //    if (e.EditType == CPDFEditType.EditImage)
+        //    {
+        //        e.Handle = true;
+        //        PDFEditImageContextMenu(sender, e);
+        //    }
 
-            MenuItem verticalMirror = new MenuItem();
-            verticalMirror.Header = LanguageHelper.CommonManager.GetString("Menu_VFlip");
-            verticalMirror.Click += (o, p) =>
-            {
-                if (imageArea != null)
-                {
-                    imageArea?.VerticalMirror();
-                    pdfContentEditControl.RefreshThumb();
-                    UpdateImageArea(imageArea);
-                }
-            };
-            menu.Items.Add(verticalMirror);
+        //    if (e.EditType == (CPDFEditType.EditText | CPDFEditType.EditImage))
+        //    {
+        //        e.Handle |= true;
+        //        PDFEditMultiContextMenu(sender, e);
+        //    }
+        //}
+
+        //private void PDFEditTextContextMenu(object sender, PDFEditCommand editCommand)
+        //{
+        //    editCommand.PopupMenu = new ContextMenu();
+        //    if (lastPDFEditEvent != null || lastPDFEditMultiEvents != null)
+        //    {
+        //        if (PdfViewControl.PDFView.Document.GetPermissionsInfo().AllowsCopying)
+        //            editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Copy"), Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
+        //        editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Cut"), Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
+        //        editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Delete"), Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
+        //        editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
+        //    }
+        //    else
+        //    {
+        //        editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
+        //        if (editCommand.TextAreaCopied)
+        //        {
+        //            editCommand.PopupMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_MatchPaste"), Command = CustomCommands.PasteMatchStyle, CommandTarget = (UIElement)sender });
+        //        }
+        //    }
+        //}
+
+        //private void PDFEditImageContextMenu(object sender, PDFEditCommand editCommand)
+        //{
+        //    editCommand.PopupMenu = new ContextMenu();
+        //    if (lastPDFEditEvent != null)
+        //    {
+        //        MenuItem rotateLeftMenu = new MenuItem();
+        //        rotateLeftMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RotateLeft");
+        //        rotateLeftMenu.Click += (o, p) =>
+        //        {
+        //            if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
+        //            {
+        //                lastPDFEditEvent.Rotate = -90;
+        //                lastPDFEditEvent.UpdatePDFEditByEventArgs();
+        //                pdfContentEditControl.SetRotationText(lastPDFEditEvent.CurrentRotated);
+        //                pdfContentEditControl.RefreshThumb();
+        //            }
+        //        };
+        //        editCommand.PopupMenu.Items.Add(rotateLeftMenu);
 
+        //        MenuItem rotateRightMenu = new MenuItem();
+        //        rotateRightMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RotateRight");
+        //        rotateRightMenu.Click += (o, p) =>
+        //        {
+        //            if (imageArea != null)
+        //            {
+        //                imageArea.Rotate(90);
+        //                pdfContentEditControl.RefreshThumb();
+        //                UpdateImageArea(imageArea);
+        //            }
+        //        };
+        //        menu.Items.Add(rotateRightMenu);
+        //        MenuItem rotateRightMenu = new MenuItem();
+        //        rotateRightMenu.Header = LanguageHelper.CommonManager.GetString("Menu_RotateRight");
+        //        rotateRightMenu.Click += (o, p) =>
+        //        {
+        //            if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
+        //            {
+        //                lastPDFEditEvent.Rotate = 90;
+        //                lastPDFEditEvent.UpdatePDFEditByEventArgs();
+        //                pdfContentEditControl.SetRotationText(lastPDFEditEvent.CurrentRotated);
+        //                pdfContentEditControl.RefreshThumb();
+        //            }
+        //        };
+        //        editCommand.PopupMenu.Items.Add(rotateRightMenu);
+
+        //        MenuItem replaceMenu = new MenuItem();
+        //        replaceMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Replace");
+        //        replaceMenu.Click += (o, p) =>
+        //        {
+        //            if (imageArea != null)
+        //            {
+        //                OpenFileDialog openFileDialog = new OpenFileDialog();
+        //                openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
+        //                if (openFileDialog.ShowDialog() == true)
+        //                {
+        //                    //byte[] fileData = File.ReadAllBytes(openFileDialog.FileName);
+        //                    //Bitmap bitmap = new Bitmap(openFileDialog.FileName);
+        //                    //imageArea.ReplaceImageArea(imageArea.GetFrame(), fileData, bitmap.Width, bitmap.Height);
+        //                    imageArea.ReplaceImageArea(imageArea.GetFrame(), openFileDialog.FileName, string.Empty);
+        //                    pdfContentEditControl.RefreshThumb();
+        //                    UpdateImageArea(imageArea);
+        //                }
+        //            }
+        //        };
+        //        menu.Items.Add(replaceMenu);
+
+        //        MenuItem exportMenu = new MenuItem();
+        //        exportMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Export");
+        //        exportMenu.Click += (o, p) =>
+        //        {
+        //            if (PdfViewControl != null && PdfViewControl.PDFView != null)
+        //            {
+        //                try
+        //                {
+        //                    FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
+        //                    if (folderBrowserDialog.ShowDialog() == DialogResult.OK && imageArea != null)
+        //                    {
+        //                        string path = Path.GetTempPath();
+        //                        string uuid = Guid.NewGuid().ToString("N");
+        //                        string imagePath = Path.Combine(path, uuid + ".tmp");
+        //                        imageArea.ExtractImage(imagePath);
+
+        //                        Bitmap bitmapImage = new Bitmap(imagePath);
+        //                        string fileName = Path.Combine(folderBrowserDialog.SelectedPath, uuid + ".jpg");
+        //                        bitmapImage.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
+        //                        Process.Start("explorer", "/select,\"" + fileName + "\"");
+        //                    }
+        //                }
+        //                catch (Exception ex)
+        //                {
+
+        //                }
+        //            }
+        //        };
+        //        menu.Items.Add(exportMenu);
+
+        //        MenuItem opacityMenu = new MenuItem();
+        //        opacityMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Opacity");
+        //        menu.Items.Add(opacityMenu);
+
+        //        AppendOpacityMenu(opacityMenu, imageArea, CPDFEditType.EditImage);
+
+        //        MenuItem horizonMirror = new MenuItem();
+        //        horizonMirror.Header = LanguageHelper.CommonManager.GetString("Menu_HFlip");
+        //        horizonMirror.Click += (o, p) =>
+        //        {
+        //            imageArea?.HorizontalMirror();
+        //            pdfContentEditControl.RefreshThumb();
+        //            UpdateImageArea(imageArea);
+        //        };
+        //        menu.Items.Add(horizonMirror);
+
+        //        MenuItem verticalMirror = new MenuItem();
+        //        verticalMirror.Header = LanguageHelper.CommonManager.GetString("Menu_VFlip");
+        //        verticalMirror.Click += (o, p) =>
+        //        {
+        //            if (imageArea != null)
+        //            {
+        //                imageArea?.VerticalMirror();
+        //                pdfContentEditControl.RefreshThumb();
+        //                UpdateImageArea(imageArea);
+        //            }
+        //        };
+        //        menu.Items.Add(verticalMirror);
+
+        //        MenuItem cropMenu = new MenuItem();
+        //        cropMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Crop");
+        //        cropMenu.Click += (o, p) =>
+        //        {
+        //            if (imageArea != null)
+        //            {
+
+        //            }
+        //        };
+        //        menu.Items.Add(cropMenu);
+
+        //        menu.Items.Add(new MenuItem() { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
+        //        menu.Items.Add(new MenuItem() { Header = "Cut", Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
+        //        menu.Items.Add(new MenuItem() { Header = "Delete", Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
+        //        menu.Items.Add(new MenuItem() { Header = "Paste", Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
+        //        // if (editCommand.TextAreaCopied)
+        //        // {
+        //        //     menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_MatchPaste"), Command = CustomCommands.PasteWithoutStyle, CommandTarget = (UIElement)sender });
+        //        // }
+        //    }
+        //}
+
+<<<<<<< Updated upstream
             MenuItem cropMenu = new MenuItem();
             cropMenu.Header = LanguageHelper.CommonManager.GetString("Menu_Crop");
             cropMenu.Click += (o, p) =>
@@ -800,6 +931,8 @@ namespace Compdfkit_Tools.PDFControl
             // }
         }
         
+=======
+>>>>>>> Stashed changes
         private void AppendOpacityMenu(MenuItem parentMenu, CPDFEditArea editArea, CPDFEditType editType)
         {
             List<int> opacityList = new List<int>()
@@ -820,7 +953,7 @@ namespace Compdfkit_Tools.PDFControl
                         pdfContentEditControl.RefreshThumb();
                         UpdateImageArea(editImageArea);
                     }
-                    else if(editArea != null && editType == CPDFEditType.EditText)
+                    else if (editArea != null && editType == CPDFEditType.EditText)
                     {
                         CPDFEditTextArea editTextArea = editArea as CPDFEditTextArea;
                         editTextArea?.SetCharsFontTransparency((byte)Math.Ceiling(opacity * 255 / 100D));
@@ -831,7 +964,7 @@ namespace Compdfkit_Tools.PDFControl
                 parentMenu.Items.Add(opacityMenu);
             }
         }
-        
+
         private void PDFToolManager_MouseLeftButtonUpHandler(object sender, MouseEventObject e)
         {
             if (e.IsCreate)
@@ -971,22 +1104,6 @@ namespace Compdfkit_Tools.PDFControl
             displaySettingsControl = null;
         }
 
-        #region Property changed
-        protected void OnPropertyChanged([CallerMemberName] string name = null)
-        {
-            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
-        }
-
-
-        public void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
-        {
-            OnPropertyChanged(e.PropertyName);
-            if (e.PropertyName == "CanSave")
-            {
-                OnCanSaveChanged?.Invoke(this, CanSave);
-            }
-        }
-        #endregion
 
         private void CommandBinding_Executed_Undo(object sender, ExecutedRoutedEventArgs e)
         {
@@ -1005,3 +1122,4 @@ namespace Compdfkit_Tools.PDFControl
         }
     }
 }
+#endregion

+ 5 - 0
Demo/Examples/Compdfkit_Tools/Edit/PDFContentEditControl.xaml.cs

@@ -24,6 +24,11 @@ namespace Compdfkit_Tools.Edit
             PDFTextEditControl.InitWithPDFViewer(newPDFView.PDFViewTool);
         }
 
+        public void SetRotationText(float rotation)
+        {
+            PDFImageEditControl.SetRotationText(rotation);
+        }
+         
         public void SetPDFTextEditData(TextEditParam editEvent, bool isTemp = false)
         {
             if (!isTemp)

+ 9 - 3
Demo/Examples/Compdfkit_Tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml

@@ -6,7 +6,7 @@
              xmlns:local="clr-namespace:Compdfkit_Tools.Edit"
              xmlns:common="clr-namespace:Compdfkit_Tools.Common"
              mc:Ignorable="d" 
-             d:DesignHeight="450" d:DesignWidth="800" MinWidth="260" Padding="10"
+             d:DesignHeight="480" d:DesignWidth="800" MinWidth="260" Padding="10"
              Background="#FAFCFF">
     <UserControl.Resources>
         <ResourceDictionary>
@@ -37,8 +37,14 @@
             <Image Name="ImageThumbUI" MaxHeight="80" MaxWidth="230" Stretch="Uniform"></Image>
         </Border>
          
-        <local:CPDFImageRotateUI x:Name="RotateUI" Grid.Row="2" FontSize="16" Margin="0,33,0,0"></local:CPDFImageRotateUI>
-         
+        <StackPanel Grid.Row="2"  Margin="0,33,0,0" >
+            <local:CPDFImageRotateUI x:Name="RotateUI" FontSize="16"></local:CPDFImageRotateUI>
+            <Grid Margin="0,10,0,0">
+                <TextBlock Text="{Binding Converter={StaticResource PropertyPanelResourceConverter},ConverterParameter=Property_Rotation}" FontFamily="Microsoft YaHei" FontSize="14" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
+                <TextBox Padding="5,0,5,0" x:Name="RotationTxb" HorizontalAlignment="Right" VerticalContentAlignment="Center" Width="110" Height="32" LostFocus="RotationTxb_LostFocus" PreviewKeyDown="RotationTxb_PreviewKeyDown"></TextBox>
+            </Grid>
+        </StackPanel>
+        
         <local:CPDFImageFlipUI x:Name="FlipUI" Grid.Row="3" FontSize="16" Margin="0,10,0,0"></local:CPDFImageFlipUI>
          
         <Grid Grid.Row="4" Margin="0,20,0,0">

+ 56 - 0
Demo/Examples/Compdfkit_Tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs

@@ -11,10 +11,12 @@ using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Drawing;
+using System.Globalization;
 using System.IO;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
+using System.Windows.Input;
 using System.Windows.Media.Imaging;
 
 namespace Compdfkit_Tools.Edit
@@ -46,6 +48,11 @@ namespace Compdfkit_Tools.Edit
             RotateUI.RotationChanged += RotateUI_RotationChanged;
             FlipUI.FlipChanged += FlipUI_FlipChanged;
         }
+        
+        public void SetRotationText(float rotation)
+        {
+            RotationTxb.Text = rotation.ToString(CultureInfo.CurrentCulture);
+        }
 
         public void SetPDFImageEditData(ImageEditParam newEvent)
         {
@@ -61,6 +68,12 @@ namespace Compdfkit_Tools.Edit
             {
                 SetImageTransparency(newEvent.Transparency);
             }
+            
+            if(RotationTxb!=null && newEvent!=null && newEvent.EditType == CPDFEditType.EditImage)
+            {
+                //RotationTxb.Text = newEvent.CurrentRotated.ToString(CultureInfo.CurrentCulture);
+            }
+            
             EditEvent = newEvent;
             SetImageThumb();
         }
@@ -404,6 +417,49 @@ namespace Compdfkit_Tools.Edit
             ImasgeOpacitySlider.Value = transparency / 255D;
             OpacityTextBox.Text = string.Format("{0}%", (int)(Math.Round(ImasgeOpacitySlider.Value * 100)));
         }
+        
+        //private void SetAbsRotation(double absRotation, PDFEditEvent editEvent)
+        //{
+        //    absRotation -= editEvent.CurrentRotated;
+        //    if (absRotation != 0)
+        //    {
+        //        editEvent.Rotate = (int)absRotation;
+        //        editEvent.UpdatePDFEditByEventArgs();
+        //        SetImageThumb();
+        //    }
+        //}
+        
+        //private void SetAbsRotation(double absRotation, List<PDFEditEvent> editEvents)
+        //{
+        //    foreach (var editEvent in editEvents)
+        //    {
+        //        SetAbsRotation(absRotation, editEvent);
+        //    }
+        //}
+        
+        private void RotationTxb_LostFocus(object sender, RoutedEventArgs e)
+        {
+            if(!double.TryParse(RotationTxb.Text, out double rotation))
+            {
+                return;
+            }
+            //if(EditEvent!=null)
+            //{
+            //    SetAbsRotation(rotation, EditEvent);
+            //}
+            //else if(EditMultiEvents != null && EditMultiEvents.Count>0)
+            //{
+            //    SetAbsRotation(rotation, EditMultiEvents);
+            //}
+        }
+
+        private void RotationTxb_PreviewKeyDown(object sender, KeyEventArgs e)
+        {
+            if (e.Key == Key.Enter)
+            {
+                RotationTxb_LostFocus(null, null);
+            }
+        }
 
         private void GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage)
         {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 131 - 4
Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchControl/CPDFSearchControl.xaml


+ 139 - 12
Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchControl/CPDFSearchControl.xaml.cs

@@ -5,6 +5,7 @@ using ComPDFKitViewer;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
@@ -21,22 +22,62 @@ namespace Compdfkit_Tools.PDFControl
         private CPDFViewer pdfView;
         private int currentHighLightIndex { get; set; } = -1;
 
+        private C_Search_Options searchOption = C_Search_Options.Search_Case_Insensitive;
+
         private PDFTextSearch textSearch;
 
         private string keyWord;
-        
+
         private bool isClearResult = false;
-        
 
         private SolidColorBrush highLightBrush = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xF7, 0x00));
-
+         
         private int ResultCount = 0;
 
         private PDFViewControl ViewControl;
+        private bool _isCaseSensitive = true;
+        public bool IsCaseSensitive
+        {
+            set
+            {
+                _isCaseSensitive = value;
+                if (_isCaseSensitive)
+                {
+                    searchOption &= ~C_Search_Options.Search_Case_Sensitive;
+                }
+                else
+                {
+                    searchOption |= C_Search_Options.Search_Case_Sensitive;
+                }
+                ViewControl.PDFViewTool?.StartFindText(keyWord, searchOption);
+            }
+            get
+            {
+                return _isCaseSensitive;
+            }
+        }
+
+        public bool IsMatchWholeWord
+        {
+            set
+            {
+                if (value)
+                {
+                    searchOption |= C_Search_Options.Search_Match_Whole_Word;
+                }
+                else
+                {
+                    searchOption &= ~C_Search_Options.Search_Match_Whole_Word;
+                }
+                ViewControl?.PDFViewTool.StartFindText(keyWord, searchOption);
+            }
+        }
+
         public CPDFSearchControl()
         {
             InitializeComponent();
             Loaded += PDFSearch_Loaded;
+            DataContext = this;
         }
 
         public void InitWithPDFViewer(PDFViewControl newViewControl)
@@ -65,10 +106,13 @@ namespace Compdfkit_Tools.PDFControl
         private void PDFSearch_Loaded(object sender, RoutedEventArgs e)
         {
             textSearch = new PDFTextSearch();
+
             SearchInput.SearchEvent -= SearchInput_SearchEvent;
             SearchInput.ClearEvent -= SearchInput_ClearEvent;
             textSearch.SearchCompletedHandler -= TextSearch_SearchCompletedHandler;
             SearchResult.SelectionChanged -= SearchResult_SelectionChanged;
+            textSearch.SearchPercentHandler -= TextSearch_SearchPercentHandler;
+            textSearch.SearchCancelHandler -= TextSearch_SearchCancelHandler;
 
             SearchInput.SearchEvent += SearchInput_SearchEvent;
             SearchInput.ClearEvent += SearchInput_ClearEvent;
@@ -76,13 +120,36 @@ namespace Compdfkit_Tools.PDFControl
             SearchResult.SelectionChanged += SearchResult_SelectionChanged;
             textSearch.SearchPercentHandler += TextSearch_SearchPercentHandler;
             textSearch.SearchCancelHandler += TextSearch_SearchCancelHandler;
+
+            SearchInput.MoveResultEvent -= SearchInput_MoveResultEvent;
+            SearchInput.MoveResultEvent += SearchInput_MoveResultEvent;
+
+            SearchTog.IsChecked = true;
+        }
+
+        private void SearchInput_MoveResultEvent(object sender, CPDFSearchInputUI.MoveDirection e)
+        {
+            if (keyWord != SearchInput.SearchKeyWord)
+            {
+                keyWord = SearchInput.SearchKeyWord;
+                ViewControl?.PDFViewTool.StartFindText(keyWord, searchOption);
+                SearchResult.ClearSearchResult();
+            }
+            if (e == CPDFSearchInputUI.MoveDirection.Previous)
+            {
+                ViewControl?.PDFViewTool.FindPrevious();
+            }
+            else
+            {
+                ViewControl?.PDFViewTool.FindNext();
+            }
         }
 
         private void TextSearch_SearchPercentHandler(object sender, TextSearchResult e)
         {
             Dispatcher.Invoke(() =>
             {
-                if(!e.Items.ContainsKey(e.CurrentPage))
+                if (!e.Items.ContainsKey(e.CurrentPage))
                 {
                     return;
                 }
@@ -93,7 +160,7 @@ namespace Compdfkit_Tools.PDFControl
                     {
                         continue;
                     }
-                    
+
                     var result = new BindSearchResult()
                     {
                         PageIndex = item.PageIndex,
@@ -106,7 +173,7 @@ namespace Compdfkit_Tools.PDFControl
                     SearchResult.AddSearchResult(result);
                     ResultNum.Text = SearchResult.ResultListControl.Items.Count.ToString();
                 }
-                
+
             });
         }
 
@@ -123,7 +190,7 @@ namespace Compdfkit_Tools.PDFControl
             }
             ProgressBorder.Visibility = Visibility.Hidden;
         }
-        
+
         private void TextSearch_SearchCancelHandler(object sender, TextSearchResult e)
         {
             if (isClearResult)
@@ -139,7 +206,7 @@ namespace Compdfkit_Tools.PDFControl
             {
                 currentHighLightIndex--;
                 BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
-                HighLightSelectResult(result);
+                SearchResult.ClearSearchResult();
             }
         }
 
@@ -149,7 +216,7 @@ namespace Compdfkit_Tools.PDFControl
             if (currentHighLightIndex >= 0)
             {
                 BindSearchResult result = SearchResult.GetItem(currentHighLightIndex);
-                HighLightSelectResult(result);
+                SearchResult.ClearSearchResult();
             }
         }
 
@@ -163,7 +230,7 @@ namespace Compdfkit_Tools.PDFControl
             BindSearchResult result = SearchResult.GetSelectItem();
             HighLightSelectResult(result);
             ResultNum.Text = "";
-            ResultText.Text = LanguageHelper.BotaManager.GetString("Text_Result")+ (e+1) + "/" + SearchResult.ResultListControl.Items.Count;
+            ResultText.Text = LanguageHelper.BotaManager.GetString("Text_Result") + (e + 1) + "/" + SearchResult.ResultListControl.Items.Count;
         }
 
         private void TextSearch_SearchCompletedHandler(object sender, TextSearchResult e)
@@ -217,8 +284,21 @@ namespace Compdfkit_Tools.PDFControl
                 return;
             }
 
-            if (textSearch != null && textSearch.CanDoSearch)
+            if (textSearch == null || !textSearch.CanDoSearch)
             {
+                return;
+            }
+
+            if (SearchTog.IsChecked == true)
+            {
+                if (ViewControl.PDFViewTool.IsDocumentModified)
+                {
+                    pdfView.GetDocument().WriteToLoadedPath();
+                }
+                keyWord = e;
+                textSearch.TextSearchDocument = pdfView.GetDocument();
+                SearchResult.ClearSearchResult();
+
                 ResultNum.Text = "0";
                 ResultText.Text = LanguageHelper.BotaManager.GetString("Tip_Result");
                 ProgressBar.ProgressMaxValue = pdfView.GetDocument().PageCount;
@@ -228,6 +308,10 @@ namespace Compdfkit_Tools.PDFControl
                 textSearch.TextSearchDocument = pdfView.GetDocument();
                 textSearch.SearchText(e, C_Search_Options.Search_Case_Insensitive);
             }
+            else if (ReplaceTog.IsChecked == true)
+            {
+                SearchInput_MoveResultEvent(null, CPDFSearchInputUI.MoveDirection.Next);
+            }
         }
 
         private void HighLightSelectResult(BindSearchResult result)
@@ -252,12 +336,55 @@ namespace Compdfkit_Tools.PDFControl
             SearchResult?.ClearSearchResult();
             ResultNum.Text = string.Empty;
             ResultText.Text = string.Empty;
-            SearchInput.SearchKeyWord=string.Empty;
+            SearchInput.SearchKeyWord = string.Empty;
         }
 
         private void SearchCancel_Click(object sender, RoutedEventArgs e)
         {
             textSearch.CancleSearch();
         }
+
+        private void SearchTog_Checked(object sender, RoutedEventArgs e)
+        {
+            if (ViewControl.PDFViewTool.IsDocumentModified)
+            {
+                pdfView.GetDocument().WriteToLoadedPath();
+                pdfView.UndoManager.CanSave = false;
+            } 
+            ReplaceTog.IsChecked = false;
+            SearchInput.InputGrid.RowDefinitions[1].Height = new GridLength(0);
+            SearchInput.Height = 40;
+            ReplaceBorder.Visibility = Visibility.Collapsed;
+            SearchResult.Visibility = Visibility.Visible;
+            ResultBorder.Visibility = Visibility.Visible; 
+        }
+
+        private void ReplaceTog_Checked(object sender, RoutedEventArgs e)
+        {
+            if (pdfView.UndoManager.CanSave)
+            {
+                pdfView.GetDocument().WriteToLoadedPath();
+                pdfView.UndoManager.CanSave = false;
+            }
+            SearchTog.IsChecked = false;
+            SearchInput.InputGrid.RowDefinitions[1].Height = new GridLength(1, GridUnitType.Star);
+            SearchInput.Height = 80;
+            ReplaceBorder.Visibility = Visibility.Visible;
+            SearchResult.Visibility = Visibility.Collapsed;
+            ResultBorder.Visibility = Visibility.Collapsed;
+            keyWord = string.Empty;
+        }
+
+        private void ReplaceCurrent_Click(object sender, RoutedEventArgs e)
+        {
+            ViewControl?.PDFViewTool.ReplaceText(SearchInput.ReplaceWord);
+        }
+
+        private void ReplaceAll_Click(object sender, RoutedEventArgs e)
+        {
+            keyWord = SearchInput.SearchKeyWord;
+            ViewControl?.PDFViewTool.StartFindText(keyWord, searchOption);
+            ViewControl?.PDFViewTool.ReplaceAllText(SearchInput.ReplaceWord); 
+        }
     }
 }

+ 57 - 5
Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchUI/CPDFSearchInputUI.xaml

@@ -5,6 +5,7 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:Compdfkit_Tools.PDFControlUI"
              xmlns:common="clr-namespace:Compdfkit_Tools.Common"
+             d:DesignWidth="300" d:DesignHeight="100"
              mc:Ignorable="d">
     <UserControl.Resources>
         <ResourceDictionary>
@@ -17,11 +18,16 @@
             </ResourceDictionary.MergedDictionaries>
         </ResourceDictionary>
     </UserControl.Resources>
-    <Grid Margin="5">
+    <Grid x:Name="InputGrid">
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"></ColumnDefinition>
             <ColumnDefinition Width="auto"></ColumnDefinition>
         </Grid.ColumnDefinitions>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="*"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+            
         <Grid Margin="0,0,8,0">
             <TextBox Name="SearchTextBox" VerticalContentAlignment="Center" Height="30" KeyDown="SearchTextBox_KeyDown" Padding="5,0,30,0"></TextBox>
             <TextBlock VerticalAlignment="Center" IsHitTestVisible="False" Margin="10,0,0,0" Foreground="#999999" 
@@ -38,9 +44,55 @@
                 </Path>
             </Border>
         </Grid>
-        <Button Name="SearchBtn" Style="{StaticResource ButtonStyle}" Grid.Column="1" Width="56" Height="30" FontSize="14" Click="SearchBtn_Click"
-                IsEnabled="{Binding ElementName=SearchTextBox,Path=Text,Converter={StaticResource TextLengthToBoolConverter}}"
-                Content="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Done}">
-        </Button>
+        
+        <Grid Grid.Column="1">
+            <Button Name="SearchBtn" Style="{StaticResource ButtonStyle}"  Width="56" Height="30" FontSize="14" Click="SearchBtn_Click"
+                    IsEnabled="{Binding ElementName=SearchTextBox,Path=Text,Converter={StaticResource TextLengthToBoolConverter}}"
+                    Content="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Done}">
+            </Button>
+        </Grid>
+
+        <Grid Grid.Row="1" Margin="0,0,8,0">
+            <TextBox Name="ReplaceTextBox" VerticalContentAlignment="Center" Height="30" KeyDown="SearchTextBox_KeyDown" Padding="5,0,30,0"></TextBox>
+            <TextBlock VerticalAlignment="Center" IsHitTestVisible="False" Margin="10,0,0,0" Foreground="#999999" 
+                       Visibility="{Binding ElementName=ReplaceTextBox,Path=Text,Converter={StaticResource TextLengthToVisibilityConverter}}"
+                       Text="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Holder_Replace}"></TextBlock>
+            
+            <Border Visibility="{Binding ElementName=ReplaceTextBox,Path=Text,Converter={StaticResource InvertTextLengthToVisibilityConverter}}"
+                    HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0"
+                    Background="#01000000" MouseLeftButtonDown="ReplaceTextClear_MouseLeftButtonDown">
+                <Path Fill="Black" IsHitTestVisible="False">
+                    <Path.Data>
+                        M12.5762 3.95117L8.5332 8L12.5762 12.0488L12.0488 12.5762L8 8.5332L3.95117 12.5762L3.42383 12.0488L7.4668 8L3.42383 3.95117L3.95117 3.42383L8 7.4668L12.0488 3.42383L12.5762 3.95117Z
+                    </Path.Data>
+                </Path>
+            </Border>
+        </Grid>
+        
+        <Grid Grid.Row="1" Grid.Column="1">
+            <DockPanel>
+                <Button Background="Transparent" BorderThickness="0" Width="20" Height="20" FontSize="14" HorizontalAlignment="Left" Click="Previous_Click" 
+                        ToolTip="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Prev}">
+                    <Viewbox>
+                        <Path StrokeThickness="1.5" Stroke="#999999">
+                            <Path.Data>
+                                M8 1.07129L2 7.07111L8 13.0709
+                            </Path.Data>
+                        </Path>
+                    </Viewbox>
+                </Button>
+                
+                <Button Background="Transparent" BorderThickness="0" Width="20" Height="20" FontSize="14" HorizontalAlignment="Right" Click="Next_Click"
+                        ToolTip="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Next}">
+                    <Viewbox>
+                        <Path StrokeThickness="1.5" Stroke="#999999">
+                            <Path.Data>
+                                M2 1.07129L8 7.07111L2 13.0709
+                            </Path.Data>
+                        </Path>
+                    </Viewbox>
+                </Button>
+            </DockPanel>
+        </Grid>
     </Grid>
 </UserControl>

+ 37 - 0
Demo/Examples/Compdfkit_Tools/PDFView/PDFSearch/PDFSearchUI/CPDFSearchInputUI.xaml.cs

@@ -7,9 +7,17 @@ namespace Compdfkit_Tools.PDFControlUI
 {
     public partial class CPDFSearchInputUI : UserControl
     {
+        public enum MoveDirection
+        {
+            Previous = 0,
+            Next = 1
+        };
+    
         public event EventHandler<string> SearchEvent;
 
         public event EventHandler ClearEvent;
+        
+        public event EventHandler<MoveDirection> MoveResultEvent;
 
         public string SearchKeyWord
         {
@@ -22,6 +30,18 @@ namespace Compdfkit_Tools.PDFControlUI
                 SearchTextBox.Text = value;
             }
         }
+        
+        public string ReplaceWord
+        {
+            get
+            {
+                return ReplaceTextBox.Text;
+            }
+            set
+            {
+                ReplaceTextBox.Text = value;
+            }
+        }
 
         public double InputTextBoxWidth
         {
@@ -32,6 +52,7 @@ namespace Compdfkit_Tools.PDFControlUI
             set
             {
                 SearchTextBox.Width = value;
+                ReplaceTextBox.Width = value;
             }
         }
 
@@ -44,6 +65,7 @@ namespace Compdfkit_Tools.PDFControlUI
             set
             {
                 SearchTextBox.Height = value;
+                ReplaceTextBox.Height = value;
             }
         }
 
@@ -74,6 +96,21 @@ namespace Compdfkit_Tools.PDFControlUI
             }
         }
 
+        private void ReplaceTextClear_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+        {
+            ReplaceTextBox.Text = string.Empty;
+        }
+
+        private void Previous_Click(object sender, RoutedEventArgs e)
+        {
+            MoveResultEvent?.Invoke(this,MoveDirection.Previous);
+        }
+
+        private void Next_Click(object sender, RoutedEventArgs e)
+        {
+            MoveResultEvent?.Invoke(this,MoveDirection.Next);
+        }
+
         private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
         {
             if (string.IsNullOrEmpty(SearchKeyWord))

+ 1 - 1
Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageExtract/CPDFPageExtractUI.xaml

@@ -45,7 +45,7 @@
                     </StackPanel>
                 </StackPanel>
             </Border>
-            <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Subtitle_Pages}" FontFamily="Microsoft YaHei" Margin="40,-1,0,0" Background="White" Width="70" Height="16" VerticalAlignment="Top" HorizontalAlignment="Left" FontWeight="Bold"></TextBlock>
+            <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Subtitle_Pages}" FontFamily="Microsoft YaHei" Margin="40,-1,0,0" Padding="5,0,5,0" Background="White" Height="16" VerticalAlignment="Top" HorizontalAlignment="Left" FontWeight="Bold"></TextBlock>
         </Grid>
         <Grid Grid.Row="2">
             <StackPanel Margin="42,10,0,0">

+ 2 - 0
Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageExtract/CPDFPageExtractWindow.xaml.cs

@@ -1,7 +1,9 @@
 using Compdfkit_Tools.Helper;
 using Compdfkit_Tools.PDFControlUI;
+using Compdfkit_Tools.Properties;
 using System;
 using System.Collections.Generic;
+using System.Reflection;
 using System.Windows;
 using MessageBox = System.Windows.MessageBox;
 

+ 14 - 4
Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageInsert/CPDFPageInsertUI.xaml

@@ -16,6 +16,7 @@
             <cpdfcommon:BoolToVisibleConverter x:Key="BoolToVisibleConverter"></cpdfcommon:BoolToVisibleConverter>
             <cpdfcommon:ReverseVisibilityConverter x:Key="ReverseVisibilityConverter"></cpdfcommon:ReverseVisibilityConverter>
             <cpdfcommon:DocEditorResourceConverter x:Key="DocEditorResourceConverter"></cpdfcommon:DocEditorResourceConverter>
+            <cpdfcommon:OrMultiBoolValueConverter x:Key="AndMultiBoolValueConverter"></cpdfcommon:OrMultiBoolValueConverter>
         </ResourceDictionary>
     </UserControl.Resources>
     <Grid>
@@ -87,13 +88,13 @@
                             <RadioButton GroupName="PageLocation" Name="CustomPageRadioButton" Tag="CustomPage" VerticalAlignment="Center" Click="PageInsertLocation_Click">
                                 <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Option_Page}"/>
                             </RadioButton>
-                            <cpdfcommon:NumericUpDownControl x:Name="PageTextBox" Maxium="{Binding MaxIndex, Mode=OneWay}" Minimum="1" Text="{Binding CustomPageIndex, Mode=TwoWay}" Height="32" Width="175" Margin="12,0,0,0" IsEnabled="{Binding ElementName=CustomPageRadioButton, Path= IsChecked}"/>
+                            <cpdfcommon:NumericUpDownControl x:Name="PageTextBox" Maximum="{Binding MaxIndex, Mode=OneWay}" Minimum="1" Text="{Binding CustomPageIndex, Mode=TwoWay}" Height="32" Width="175" Margin="12,0,0,0" IsEnabled="{Binding ElementName=CustomPageRadioButton, Path= IsChecked}"/>
                             <TextBlock Text="/"  VerticalAlignment="Center"  Margin="8,0,0,0" ></TextBlock>
                             <TextBlock x:Name="MaxPageTextBox" Text="10000"  VerticalAlignment="Center" ></TextBlock>
                         </StackPanel>
                         <ComboBox x:Name="PageLocationComboBox" Width="215" Height="32" HorizontalAlignment="Left" Margin="20,8,0,0"  Style="{StaticResource ComboBoxStyle1}" VerticalContentAlignment="Center" IsEnabled="{Binding ElementName=CustomPageRadioButton, Path= IsChecked}" SelectionChanged="PageLocationComboBox_SelectionChanged">
-                            <ComboBoxItem Content="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Option_Before}" IsSelected="True"></ComboBoxItem>
-                            <ComboBoxItem Content="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Option_After}"></ComboBoxItem>
+                            <ComboBoxItem Content="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Option_After }" IsSelected="True"></ComboBoxItem>
+                            <ComboBoxItem Content="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Option_Before}"></ComboBoxItem>
                         </ComboBox>
                     </StackPanel>
                 </Grid>
@@ -105,7 +106,16 @@
                 <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Button_Cancel}"></TextBlock>
             </Button>
             <Button x:Name="InsertButton" Height="32" Width="112"  Margin="8,0,0,0" Click="InsertButton_Click">
-                <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Button_Insert}"></TextBlock>
+                <Button.Content>
+                    <TextBlock Text="{Binding Converter={StaticResource DocEditorResourceConverter},ConverterParameter=Button_Insert}"></TextBlock>
+                </Button.Content>
+                <Button.IsEnabled>
+                    <MultiBinding Converter="{StaticResource AndMultiBoolValueConverter}">
+                        <Binding ElementName="HomePageRadioButton" Path="IsChecked"></Binding>
+                        <Binding ElementName="GastricPageRadioButton" Path="IsChecked"></Binding>
+                        <Binding ElementName="PageTextBox" Path="IsValueValid"></Binding>
+                    </MultiBinding>
+                </Button.IsEnabled>
             </Button>
         </StackPanel>
     </Grid>

+ 2 - 2
Demo/Examples/Compdfkit_Tools/PageEdit/PDFPageInsert/CPDFPageInsertUI.xaml.cs

@@ -20,7 +20,7 @@ namespace Compdfkit_Tools.PDFControlUI
             set
             {
                 _maxIndex = value;
-                PageTextBox.Maxium = _maxIndex;
+                PageTextBox.Maximum = _maxIndex;
                 MaxPageTextBox.Text = _maxIndex.ToString();
             }
         }
@@ -155,7 +155,7 @@ namespace Compdfkit_Tools.PDFControlUI
         {
             if (index == -2 && !string.IsNullOrEmpty(PageTextBox.Text))
             {
-                index = int.Parse(PageTextBox.Text);
+                int.TryParse(PageTextBox.Text,out index);
             }
             if (index != -2)
             {

+ 3 - 3
Demo/Examples/Compdfkit_Tools/Properties/AssemblyInfo.cs

@@ -12,7 +12,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("ComPDFKit_Tools")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -51,5 +51,5 @@ using System.Windows;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 84 - 2
Demo/Examples/Compdfkit_Tools/Strings/Bota.Designer.cs

@@ -1,13 +1,14 @@
 //------------------------------------------------------------------------------
 // <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>
 //------------------------------------------------------------------------------
 
-namespace Compdfkit_Tools.Strings.Common {
+namespace Compdfkit_Tools.Strings {
     using System;
     
     
@@ -18,7 +19,7 @@ namespace Compdfkit_Tools.Strings.Common {
     // 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.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class Bota {
@@ -86,6 +87,15 @@ namespace Compdfkit_Tools.Strings.Common {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Next.
+        /// </summary>
+        internal static string Button_Next {
+            get {
+                return ResourceManager.GetString("Button_Next", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to OK.
         /// </summary>
@@ -95,6 +105,60 @@ namespace Compdfkit_Tools.Strings.Common {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Previous.
+        /// </summary>
+        internal static string Button_Prev {
+            get {
+                return ResourceManager.GetString("Button_Prev", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Replace.
+        /// </summary>
+        internal static string Button_Replace {
+            get {
+                return ResourceManager.GetString("Button_Replace", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Replace All.
+        /// </summary>
+        internal static string Button_ReplaceAll {
+            get {
+                return ResourceManager.GetString("Button_ReplaceAll", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Search.
+        /// </summary>
+        internal static string Button_Search {
+            get {
+                return ResourceManager.GetString("Button_Search", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ignore Case.
+        /// </summary>
+        internal static string Chb_Case {
+            get {
+                return ResourceManager.GetString("Chb_Case", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Match Whole Word.
+        /// </summary>
+        internal static string Chb_Match {
+            get {
+                return ResourceManager.GetString("Chb_Match", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Bookmark Title.
         /// </summary>
@@ -104,6 +168,24 @@ namespace Compdfkit_Tools.Strings.Common {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Find.
+        /// </summary>
+        internal static string Holder_Find {
+            get {
+                return ResourceManager.GetString("Holder_Find", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Replace with.
+        /// </summary>
+        internal static string Holder_Replace {
+            get {
+                return ResourceManager.GetString("Holder_Replace", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Search.
         /// </summary>

+ 249 - 123
Demo/Examples/Compdfkit_Tools/Strings/Bota.resx

@@ -1,126 +1,252 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <root>
-    <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:element>
-    </xsd:schema>
-    <resheader name="resmimetype">
-        <value>text/microsoft-resx</value>
-    </resheader>
-    <resheader name="version">
-        <value>1.3</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>
-    <data name="Title_Thumb" xml:space="preserve">
-        <value>Thumbnails</value>
-    </data>
-    <data name="Title_Outlines" xml:space="preserve">
-        <value>Outlines</value>
-    </data>
-    <data name="Text_NoOutline" xml:space="preserve">
-        <value>No Outlines</value>
-    </data>
-    <data name="Title_Bookmarks" xml:space="preserve">
-        <value>Bookmarks</value>
-    </data>
-    <data name="Text_NoBookmarks" xml:space="preserve">
-        <value>No Bookmarks</value>
-    </data>
-    <data name="Tooltip_AddBookmarks" xml:space="preserve">
-        <value>Add Bookmarks</value>
-    </data>
-    <data name="Holder_BookmarkTitle" xml:space="preserve">
-        <value>Bookmark Title</value>
-    </data>
-    <data name="Button_Create" xml:space="preserve">
-        <value>Create</value>
-    </data>
-    <data name="Tooltip_Edit" xml:space="preserve">
-        <value>Edit</value>
-    </data>
-    <data name="Tooltip_Delete" xml:space="preserve">
-        <value>Delete</value>
-    </data>
-    <data name="Tooltip_Search" xml:space="preserve">
-        <value>Search</value>
-    </data>
-    <data name="Holder_Search" xml:space="preserve">
-        <value>Search</value>
-    </data>
-    <data name="Button_Done" xml:space="preserve">
-        <value>Done</value>
-    </data>
-    <data name="Text_NoResult" xml:space="preserve">
-        <value>No Results</value>
-    </data>
-    <data name="Text_Result" xml:space="preserve">
-        <value>Results: </value>
-    </data>
-    <data name="Title_Sig" xml:space="preserve">
-        <value>Signature List</value>
-    </data>
-    <data name="Menu_SigDetail" xml:space="preserve">
-        <value>Signature Details</value>
-    </data>
-    <data name="Menu_CertDetail" xml:space="preserve">
-        <value>Certification Details</value>
-    </data>
-    <data name="Warn_Warning" xml:space="preserve">
-        <value>Warning</value>
-    </data>
-    <data name="Text_SureDelete" xml:space="preserve">
-        <value>Are you sure to delete it?</value>
-    </data>
-    <data name="Button_OK" xml:space="preserve">
-        <value>OK</value>
-    </data>
-    <data name="Tooltip_Annot" xml:space="preserve">
-        <value>View Annotations</value>
-    </data>
-    <data name="Title_Annot" xml:space="preserve">
-        <value>Annotations</value>
-    </data>
-    <data name="Tooltip_Import" xml:space="preserve">
-        <value>Import Annotations</value>
-    </data>
-    <data name="Tooltip_Export" xml:space="preserve">
-        <value>Export Annotations</value>
-    </data>
-    <data name="Text_NoAnnotations" xml:space="preserve">
-        <value>No Annotations</value>
-    </data>
-    <data name="Text_Page" xml:space="preserve">
-        <value>Page</value>
-    </data>
-    <data name="Tooltip_Thumb" xml:space="preserve">
-        <value>View Thumbnails</value>
-    </data>
-    <data name="Menu_Delete" xml:space="preserve">
-        <value>Delete</value>
-    </data>
-    <data name="Menu_DeleteAll" xml:space="preserve">
-        <value>Delete All</value>
-    </data>
-    <data name="Tooltip_Outlines" xml:space="preserve">
-        <value>View Outlines</value>
-    </data>
-    <data name="Tooltip_Bookmarks" xml:space="preserve">
-        <value>View Bookmarks</value>
-    </data>
-    <data name="Tooltip_Sig" xml:space="preserve">
-        <value>View Signatures</value>
-    </data>
-    <data name="Button_Cancel" xml:space="preserve">
-        <value>Cancel</value>
-    </data>
-    <data name="Tip_Result" xml:space="preserve">
-        <value>result found</value>
-    </data>
+  <!-- 
+    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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <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" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </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" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Title_Thumb" xml:space="preserve">
+    <value>Thumbnails</value>
+  </data>
+  <data name="Title_Outlines" xml:space="preserve">
+    <value>Outlines</value>
+  </data>
+  <data name="Text_NoOutline" xml:space="preserve">
+    <value>No Outlines</value>
+  </data>
+  <data name="Title_Bookmarks" xml:space="preserve">
+    <value>Bookmarks</value>
+  </data>
+  <data name="Text_NoBookmarks" xml:space="preserve">
+    <value>No Bookmarks</value>
+  </data>
+  <data name="Tooltip_AddBookmarks" xml:space="preserve">
+    <value>Add Bookmarks</value>
+  </data>
+  <data name="Holder_BookmarkTitle" xml:space="preserve">
+    <value>Bookmark Title</value>
+  </data>
+  <data name="Button_Create" xml:space="preserve">
+    <value>Create</value>
+  </data>
+  <data name="Tooltip_Edit" xml:space="preserve">
+    <value>Edit</value>
+  </data>
+  <data name="Tooltip_Delete" xml:space="preserve">
+    <value>Delete</value>
+  </data>
+  <data name="Tooltip_Search" xml:space="preserve">
+    <value>Search</value>
+  </data>
+  <data name="Holder_Search" xml:space="preserve">
+    <value>Search</value>
+  </data>
+  <data name="Button_Done" xml:space="preserve">
+    <value>Done</value>
+  </data>
+  <data name="Text_NoResult" xml:space="preserve">
+    <value>No Results</value>
+  </data>
+  <data name="Text_Result" xml:space="preserve">
+    <value>Results: </value>
+  </data>
+  <data name="Title_Sig" xml:space="preserve">
+    <value>Signature List</value>
+  </data>
+  <data name="Menu_SigDetail" xml:space="preserve">
+    <value>Signature Details</value>
+  </data>
+  <data name="Menu_CertDetail" xml:space="preserve">
+    <value>Certification Details</value>
+  </data>
+  <data name="Warn_Warning" xml:space="preserve">
+    <value>Warning</value>
+  </data>
+  <data name="Text_SureDelete" xml:space="preserve">
+    <value>Are you sure to delete it?</value>
+  </data>
+  <data name="Button_OK" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="Tooltip_Annot" xml:space="preserve">
+    <value>View Annotations</value>
+  </data>
+  <data name="Title_Annot" xml:space="preserve">
+    <value>Annotations</value>
+  </data>
+  <data name="Tooltip_Import" xml:space="preserve">
+    <value>Import Annotations</value>
+  </data>
+  <data name="Tooltip_Export" xml:space="preserve">
+    <value>Export Annotations</value>
+  </data>
+  <data name="Text_NoAnnotations" xml:space="preserve">
+    <value>No Annotations</value>
+  </data>
+  <data name="Text_Page" xml:space="preserve">
+    <value>Page</value>
+  </data>
+  <data name="Tooltip_Thumb" xml:space="preserve">
+    <value>View Thumbnails</value>
+  </data>
+  <data name="Menu_Delete" xml:space="preserve">
+    <value>Delete</value>
+  </data>
+  <data name="Menu_DeleteAll" xml:space="preserve">
+    <value>Delete All</value>
+  </data>
+  <data name="Tooltip_Outlines" xml:space="preserve">
+    <value>View Outlines</value>
+  </data>
+  <data name="Tooltip_Bookmarks" xml:space="preserve">
+    <value>View Bookmarks</value>
+  </data>
+  <data name="Tooltip_Sig" xml:space="preserve">
+    <value>View Signatures</value>
+  </data>
+  <data name="Button_Cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="Tip_Result" xml:space="preserve">
+    <value>result found</value>
+  </data>
+  <data name="Button_Replace" xml:space="preserve">
+    <value>Replace</value>
+  </data>
+  <data name="Holder_Find" xml:space="preserve">
+    <value>Find</value>
+  </data>
+  <data name="Holder_Replace" xml:space="preserve">
+    <value>Replace with</value>
+  </data>
+  <data name="Button_Prev" xml:space="preserve">
+    <value>Previous</value>
+  </data>
+  <data name="Button_Next" xml:space="preserve">
+    <value>Next</value>
+  </data>
+  <data name="Button_ReplaceAll" xml:space="preserve">
+    <value>Replace All</value>
+  </data>
+  <data name="Chb_Case" xml:space="preserve">
+    <value>Ignore Case</value>
+  </data>
+  <data name="Chb_Match" xml:space="preserve">
+    <value>Match Whole Word</value>
+  </data>
+  <data name="Button_Search" xml:space="preserve">
+    <value>Search</value>
+  </data>
 </root>

+ 250 - 117
Demo/Examples/Compdfkit_Tools/Strings/Bota.zh.resx

@@ -1,119 +1,252 @@
+<?xml version="1.0" encoding="utf-8"?>
 <root>
-    <resheader name="resmimetype">
-        <value>text/microsoft-resx</value>
-    </resheader>
-    <resheader name="version">
-        <value>1.3</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>
-    <data name="Title_Thumb" xml:space="preserve">
-        <value>缩略图</value>
-    </data>
-    <data name="Title_Outlines" xml:space="preserve">
-        <value>大纲</value>
-    </data>
-    <data name="Text_NoOutline" xml:space="preserve">
-        <value>无大纲</value>
-    </data>
-    <data name="Title_Bookmarks" xml:space="preserve">
-        <value>书签</value>
-    </data>
-    <data name="Text_NoBookmarks" xml:space="preserve">
-        <value>无书签</value>
-    </data>
-    <data name="Tooltip_AddBookmarks" xml:space="preserve">
-        <value>添加书签</value>
-    </data>
-    <data name="Holder_BookmarkTitle" xml:space="preserve">
-        <value>输入书签标题</value>
-    </data>
-    <data name="Button_Create" xml:space="preserve">
-        <value>确定</value>
-    </data>
-    <data name="Tooltip_Edit" xml:space="preserve">
-        <value>编辑</value>
-    </data>
-    <data name="Tooltip_Delete" xml:space="preserve">
-        <value>删除</value>
-    </data>
-    <data name="Tooltip_Search" xml:space="preserve">
-        <value>搜索</value>
-    </data>
-    <data name="Holder_Search" xml:space="preserve">
-        <value>输入搜索内容</value>
-    </data>
-    <data name="Button_Done" xml:space="preserve">
-        <value>完成</value>
-    </data>
-    <data name="Text_NoResult" xml:space="preserve">
-        <value>无匹配的结果</value>
-    </data>
-    <data name="Text_Result" xml:space="preserve">
-        <value>搜索结果:</value>
-    </data>
-    <data name="Title_Sig" xml:space="preserve">
-        <value>签名列表</value>
-    </data>
-    <data name="Menu_SigDetail" xml:space="preserve">
-        <value>查看签名详情</value>
-    </data>
-    <data name="Menu_CertDetail" xml:space="preserve">
-        <value>查看证书详情</value>
-    </data>
-    <data name="Warn_Warning" xml:space="preserve">
-        <value>注意</value>
-    </data>
-    <data name="Text_SureDelete" xml:space="preserve">
-        <value>确定删除该内容?</value>
-    </data>
-    <data name="Button_OK" xml:space="preserve">
-        <value>确定</value>
-    </data>
-    <data name="Tooltip_Annot" xml:space="preserve">
-        <value>注释</value>
-    </data>
-    <data name="Title_Annot" xml:space="preserve">
-        <value>注释</value>
-    </data>
-    <data name="Tooltip_Import" xml:space="preserve">
-        <value>导入注释</value>
-    </data>
-    <data name="Tooltip_Export" xml:space="preserve">
-        <value>导出注释</value>
-    </data>
-    <data name="Text_NoAnnotations" xml:space="preserve">
-        <value>无注释</value>
-    </data>
-    <data name="Text_Page" xml:space="preserve">
-        <value>页码</value>
-    </data>
-    <data name="Tooltip_Thumb" xml:space="preserve">
-        <value>缩略图</value>
-    </data>
-    <data name="Menu_Delete" xml:space="preserve">
-        <value>删除</value>
-    </data>
-    <data name="Menu_DeleteAll" xml:space="preserve">
-        <value>删除全部</value>
-    </data>
-    <data name="Tooltip_Outlines" xml:space="preserve">
-        <value>大纲</value>
-    </data>
-    <data name="Tooltip_Bookmarks" xml:space="preserve">
-        <value>书签</value>
-    </data>
-    <data name="Tooltip_Sig" xml:space="preserve">
-        <value>签名</value>
-    </data>
-    <data name="Button_Cancel" xml:space="preserve">
-        <value>取消</value>
-    </data>
-    <data name="Tip_Result" xml:space="preserve">
-        <value>查询结果</value>
-    </data>
+  <!-- 
+    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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <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" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </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" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Title_Thumb" xml:space="preserve">
+    <value>缩略图</value>
+  </data>
+  <data name="Title_Outlines" xml:space="preserve">
+    <value>大纲</value>
+  </data>
+  <data name="Text_NoOutline" xml:space="preserve">
+    <value>无大纲</value>
+  </data>
+  <data name="Title_Bookmarks" xml:space="preserve">
+    <value>书签</value>
+  </data>
+  <data name="Text_NoBookmarks" xml:space="preserve">
+    <value>无书签</value>
+  </data>
+  <data name="Tooltip_AddBookmarks" xml:space="preserve">
+    <value>添加书签</value>
+  </data>
+  <data name="Holder_BookmarkTitle" xml:space="preserve">
+    <value>输入书签标题</value>
+  </data>
+  <data name="Button_Create" xml:space="preserve">
+    <value>确定</value>
+  </data>
+  <data name="Tooltip_Edit" xml:space="preserve">
+    <value>编辑</value>
+  </data>
+  <data name="Tooltip_Delete" xml:space="preserve">
+    <value>删除</value>
+  </data>
+  <data name="Tooltip_Search" xml:space="preserve">
+    <value>搜索</value>
+  </data>
+  <data name="Holder_Search" xml:space="preserve">
+    <value>输入搜索内容</value>
+  </data>
+  <data name="Button_Done" xml:space="preserve">
+    <value>完成</value>
+  </data>
+  <data name="Text_NoResult" xml:space="preserve">
+    <value>无匹配的结果</value>
+  </data>
+  <data name="Text_Result" xml:space="preserve">
+    <value>搜索结果:</value>
+  </data>
+  <data name="Title_Sig" xml:space="preserve">
+    <value>签名列表</value>
+  </data>
+  <data name="Menu_SigDetail" xml:space="preserve">
+    <value>查看签名详情</value>
+  </data>
+  <data name="Menu_CertDetail" xml:space="preserve">
+    <value>查看证书详情</value>
+  </data>
+  <data name="Warn_Warning" xml:space="preserve">
+    <value>注意</value>
+  </data>
+  <data name="Text_SureDelete" xml:space="preserve">
+    <value>确定删除该内容?</value>
+  </data>
+  <data name="Button_OK" xml:space="preserve">
+    <value>确定</value>
+  </data>
+  <data name="Tooltip_Annot" xml:space="preserve">
+    <value>注释</value>
+  </data>
+  <data name="Title_Annot" xml:space="preserve">
+    <value>注释</value>
+  </data>
+  <data name="Tooltip_Import" xml:space="preserve">
+    <value>导入注释</value>
+  </data>
+  <data name="Tooltip_Export" xml:space="preserve">
+    <value>导出注释</value>
+  </data>
+  <data name="Text_NoAnnotations" xml:space="preserve">
+    <value>无注释</value>
+  </data>
+  <data name="Text_Page" xml:space="preserve">
+    <value>页码</value>
+  </data>
+  <data name="Tooltip_Thumb" xml:space="preserve">
+    <value>缩略图</value>
+  </data>
+  <data name="Menu_Delete" xml:space="preserve">
+    <value>删除</value>
+  </data>
+  <data name="Menu_DeleteAll" xml:space="preserve">
+    <value>删除全部</value>
+  </data>
+  <data name="Tooltip_Outlines" xml:space="preserve">
+    <value>大纲</value>
+  </data>
+  <data name="Tooltip_Bookmarks" xml:space="preserve">
+    <value>书签</value>
+  </data>
+  <data name="Tooltip_Sig" xml:space="preserve">
+    <value>签名</value>
+  </data>
+  <data name="Button_Cancel" xml:space="preserve">
+    <value>取消</value>
+  </data>
+  <data name="Tip_Result" xml:space="preserve">
+    <value>查询结果</value>
+  </data>
+  <data name="Button_Replace" xml:space="preserve">
+    <value>替换</value>
+  </data>
+  <data name="Holder_Find" xml:space="preserve">
+    <value>查找</value>
+  </data>
+  <data name="Holder_Replace" xml:space="preserve">
+    <value>替换为</value>
+  </data>
+  <data name="Button_Prev" xml:space="preserve">
+    <value>上一个</value>
+  </data>
+  <data name="Button_Next" xml:space="preserve">
+    <value>下一个</value>
+  </data>
+  <data name="Button_ReplaceAll" xml:space="preserve">
+    <value>全部替换</value>
+  </data>
+  <data name="Chb_Case" xml:space="preserve">
+    <value>忽略大小写</value>
+  </data>
+  <data name="Chb_Match" xml:space="preserve">
+    <value>全词匹配</value>
+  </data>
+  <data name="Button_Search" xml:space="preserve">
+    <value>搜索</value>
+  </data>
 </root>

+ 9 - 0
Demo/Examples/Compdfkit_Tools/Strings/Common.Designer.cs

@@ -122,6 +122,15 @@ namespace Compdfkit_Tools.Strings.Common {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Save as Flattened PDF.
+        /// </summary>
+        internal static string FileMenu_Flatten {
+            get {
+                return ResourceManager.GetString("FileMenu_Flatten", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Open Document.
         /// </summary>

+ 3 - 0
Demo/Examples/Compdfkit_Tools/Strings/Common.resx

@@ -510,4 +510,7 @@
   <data name="Menu_Crop" xml:space="preserve">
     <value>Crop</value>
   </data>
+  <data name="FileMenu_Flatten" xml:space="preserve">
+    <value>Save as Flattened PDF</value>
+  </data>
 </root>

+ 3 - 0
Demo/Examples/Compdfkit_Tools/Strings/Common.zh.resx

@@ -510,4 +510,7 @@
   <data name="Menu_Crop" xml:space="preserve">
     <value>裁剪</value>
   </data>
+  <data name="FileMenu_Flatten" xml:space="preserve">
+    <value>另存为扁平化副本</value>
+  </data>
 </root>

+ 3 - 2
Demo/Examples/Compdfkit_Tools/Strings/DocEditor.Designer.cs

@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 // <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.
@@ -18,7 +19,7 @@ namespace Compdfkit_Tools.Strings {
     // 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.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class DocEditor {
@@ -132,7 +133,7 @@ namespace Compdfkit_Tools.Strings {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Custom Black Page.
+        ///   Looks up a localized string similar to Custom Blank Page.
         /// </summary>
         internal static string Option_Custom {
             get {

+ 204 - 105
Demo/Examples/Compdfkit_Tools/Strings/DocEditor.resx

@@ -1,108 +1,207 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <root>
-    <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:element>
-    </xsd:schema>
-    <resheader name="resmimetype">
-        <value>text/microsoft-resx</value>
-    </resheader>
-    <resheader name="version">
-        <value>1.3</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>
-    <data name="Title_Insert" xml:space="preserve">
-        <value>Insert</value>
-    </data>
-    <data name="Subtitle_Pages" xml:space="preserve">
-        <value>Page Range</value>
-    </data>
-    <data name="Option_Blank" xml:space="preserve">
-        <value>Blank Page</value>
-    </data>
-    <data name="Option_Custom" xml:space="preserve">
-        <value>Custom Black Page</value>
-    </data>
-    <data name="Option_From" xml:space="preserve">
-        <value>From PDF</value>
-    </data>
-    <data name="Button_Select" xml:space="preserve">
-        <value>Select a File</value>
-    </data>
-    <data name="Text_Range" xml:space="preserve">
-        <value>Page Range</value>
-    </data>
-    <data name="Range_All" xml:space="preserve">
-        <value>All Pages</value>
-    </data>
-    <data name="Range_Odd" xml:space="preserve">
-        <value>Odd Pages Only</value>
-    </data>
-    <data name="Range_Even" xml:space="preserve">
-        <value>Even Pages Only</value>
-    </data>
-    <data name="Range_Custom" xml:space="preserve">
-        <value>Custom Range</value>
-    </data>
-    <data name="Subtitle_Pos" xml:space="preserve">
-        <value>Insert To</value>
-    </data>
-    <data name="Option_First" xml:space="preserve">
-        <value>First Page</value>
-    </data>
-    <data name="Option_Last" xml:space="preserve">
-        <value>Last Page</value>
-    </data>
-    <data name="Option_Page" xml:space="preserve">
-        <value>Page</value>
-    </data>
-    <data name="Option_After" xml:space="preserve">
-        <value>After</value>
-    </data>
-    <data name="Option_Before" xml:space="preserve">
-        <value>Before</value>
-    </data>
-    <data name="Button_Cancel" xml:space="preserve">
-        <value>Cancel</value>
-    </data>
-    <data name="Button_Insert" xml:space="preserve">
-        <value>Insert</value>
-    </data>
-    <data name="Warn_NoFile" xml:space="preserve">
-        <value>No File Selected</value>
-    </data>
-    <data name="Warn_PageRange" xml:space="preserve">
-        <value>Invalid page range or the page number is out of range.</value>
-    </data>
-    <data name="Title_Extract" xml:space="preserve">
-        <value>Extract</value>
-    </data>
-    <data name="Holder_Custom" xml:space="preserve">
-        <value>e.g. 1,3-5,10</value>
-    </data>
-    <data name="Option_Separate" xml:space="preserve">
-        <value>Each page in a separate file</value>
-    </data>
-    <data name="Option_Delete" xml:space="preserve">
-        <value>Delete page after extraction</value>
-    </data>
-    <data name="Button_Extract" xml:space="preserve">
-        <value>Extract</value>
-    </data>
-    <data name="Tip_NoPage" xml:space="preserve">
-        <value>No pages selected. Please select one or more pages first to organize.</value>
-    </data>
-    <data name="Tip_AllPage" xml:space="preserve">
-        <value>Can not delete all pages. Please keep at least one page.</value>
-    </data>
-    <data name="Warn_Delete" xml:space="preserve">
-        <value>Are you sure to delete?</value>
-    </data>
+  <!-- 
+    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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <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" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </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" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Title_Insert" xml:space="preserve">
+    <value>Insert</value>
+  </data>
+  <data name="Subtitle_Pages" xml:space="preserve">
+    <value>Page Range</value>
+  </data>
+  <data name="Option_Blank" xml:space="preserve">
+    <value>Blank Page</value>
+  </data>
+  <data name="Option_Custom" xml:space="preserve">
+    <value>Custom Blank Page</value>
+  </data>
+  <data name="Option_From" xml:space="preserve">
+    <value>From PDF</value>
+  </data>
+  <data name="Button_Select" xml:space="preserve">
+    <value>Select a File</value>
+  </data>
+  <data name="Text_Range" xml:space="preserve">
+    <value>Page Range</value>
+  </data>
+  <data name="Range_All" xml:space="preserve">
+    <value>All Pages</value>
+  </data>
+  <data name="Range_Odd" xml:space="preserve">
+    <value>Odd Pages Only</value>
+  </data>
+  <data name="Range_Even" xml:space="preserve">
+    <value>Even Pages Only</value>
+  </data>
+  <data name="Range_Custom" xml:space="preserve">
+    <value>Custom Range</value>
+  </data>
+  <data name="Subtitle_Pos" xml:space="preserve">
+    <value>Insert To</value>
+  </data>
+  <data name="Option_First" xml:space="preserve">
+    <value>First Page</value>
+  </data>
+  <data name="Option_Last" xml:space="preserve">
+    <value>Last Page</value>
+  </data>
+  <data name="Option_Page" xml:space="preserve">
+    <value>Page</value>
+  </data>
+  <data name="Option_After" xml:space="preserve">
+    <value>After</value>
+  </data>
+  <data name="Option_Before" xml:space="preserve">
+    <value>Before</value>
+  </data>
+  <data name="Button_Cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="Button_Insert" xml:space="preserve">
+    <value>Insert</value>
+  </data>
+  <data name="Warn_NoFile" xml:space="preserve">
+    <value>No File Selected</value>
+  </data>
+  <data name="Warn_PageRange" xml:space="preserve">
+    <value>Invalid page range or the page number is out of range.</value>
+  </data>
+  <data name="Title_Extract" xml:space="preserve">
+    <value>Extract</value>
+  </data>
+  <data name="Holder_Custom" xml:space="preserve">
+    <value>e.g. 1,3-5,10</value>
+  </data>
+  <data name="Option_Separate" xml:space="preserve">
+    <value>Each page in a separate file</value>
+  </data>
+  <data name="Option_Delete" xml:space="preserve">
+    <value>Delete page after extraction</value>
+  </data>
+  <data name="Button_Extract" xml:space="preserve">
+    <value>Extract</value>
+  </data>
+  <data name="Tip_NoPage" xml:space="preserve">
+    <value>No pages selected. Please select one or more pages first to organize.</value>
+  </data>
+  <data name="Tip_AllPage" xml:space="preserve">
+    <value>Can not delete all pages. Please keep at least one page.</value>
+  </data>
+  <data name="Warn_Delete" xml:space="preserve">
+    <value>Are you sure to delete?</value>
+  </data>
 </root>

+ 18 - 0
Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.Designer.cs

@@ -392,6 +392,15 @@ namespace Compdfkit_Tools.Strings {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to - 180° to 180°.
+        /// </summary>
+        internal static string Holder_Rotation {
+            get {
+                return ResourceManager.GetString("Holder_Rotation", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Text Field 1.
         /// </summary>
@@ -698,6 +707,15 @@ namespace Compdfkit_Tools.Strings {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Rotation Angle.
+        /// </summary>
+        internal static string Property_Rotation {
+            get {
+                return ResourceManager.GetString("Property_Rotation", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Start.
         /// </summary>

+ 6 - 0
Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.resx

@@ -510,4 +510,10 @@
   <data name="Tip_Default" xml:space="preserve">
     <value>Select an item in the item list to make it the default option.</value>
   </data>
+  <data name="Property_Rotation" xml:space="preserve">
+    <value>Rotation Angle</value>
+  </data>
+  <data name="Holder_Rotation" xml:space="preserve">
+    <value>- 180° to 180°</value>
+  </data>
 </root>

+ 6 - 0
Demo/Examples/Compdfkit_Tools/Strings/PropertyPanel.zh.resx

@@ -510,4 +510,10 @@
   <data name="Tip_Default" xml:space="preserve">
     <value>选中一项使其成为默认选项</value>
   </data>
+  <data name="Property_Rotation" xml:space="preserve">
+    <value>任意角度</value>
+  </data>
+  <data name="Holder_Rotation" xml:space="preserve">
+    <value>-180 ~ 180 度</value>
+  </data>
 </root>

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkDialog.xaml

@@ -100,7 +100,7 @@
                                     </Grid>
                                 </Button>
                                 <TextBlock Text="{Binding Converter={StaticResource SecurityResourceConverter}, ConverterParameter=Text_Watermark}" VerticalAlignment="Center" Margin="0,0,8,0"></TextBlock>
-                                <common:NumericUpDownControl x:Name="ScaleNumericControl" Width="80" Text="{Binding ImageScale, Mode=TwoWay}" Maxium="500" Minimum="10" Unit="%"  IsEnabled="{Binding Path=IsChecked, ElementName=ImageRdo}"></common:NumericUpDownControl>
+                                <common:NumericUpDownControl x:Name="ScaleNumericControl" Width="80" Text="{Binding ImageScale, Mode=TwoWay}" Maximum="500" Minimum="10" Unit="%"  IsEnabled="{Binding Path=IsChecked, ElementName=ImageRdo}"></common:NumericUpDownControl>
                             </StackPanel>
                         </Grid>
                     </Grid>

+ 5 - 4
Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkDialog.xaml.cs

@@ -113,9 +113,9 @@ namespace Compdfkit_Tools.PDFControl
                 {
                     return;
                 }
-                if (int.Parse(value) > ScaleNumericControl.Maxium)
+                if (int.Parse(value) > ScaleNumericControl.Maximum)
                 {
-                    value = ScaleNumericControl.Maxium.ToString();
+                    value = ScaleNumericControl.Maximum.ToString();
                 }
                 if (int.Parse(value) < ScaleNumericControl.Minimum)
                 {
@@ -441,7 +441,8 @@ namespace Compdfkit_Tools.PDFControl
             var locationControl = sender as CPDFLocationControl;
             if (locationControl != null)
             {
-                HorizOffset = float.Parse(locationControl.HorizOffsetValue);
+ 
+                HorizOffset = (float)(float.Parse(locationControl.HorizOffsetValue) / 25.4 * 72.0);
             }
         }
 
@@ -450,7 +451,7 @@ namespace Compdfkit_Tools.PDFControl
             var locationControl = sender as CPDFLocationControl;
             if (locationControl != null)
             {
-                VertOffset = float.Parse(locationControl.VertOffsetValue);
+                VertOffset = (float)(float.Parse(locationControl.VertOffsetValue) / 25.4 *72);
             }
         }
 

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Watermark/AddWatermark/WatermarkListDialog.xaml.cs

@@ -82,7 +82,7 @@ namespace Compdfkit_Tools.PDFControl
                             return;
                         }
                         string savePath = Path.Combine(path, Path.GetFileNameWithoutExtension(fileInfo.Document.FileName) + "_" 
-                            + LanguageHelper.SecurityManager.GetString("FileName_Watermark"));
+                            + LanguageHelper.SecurityManager.GetString("FileName_Watermark")) + ".pdf";
                         fileInfo.Document.WriteToFilePath(savePath);
                     }
                     System.Diagnostics.Process.Start("explorer.exe", "/select," + path + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(FileGridListWithPageRangeControl.FileInfoDataList[0].Document.FileName) + "_Watermark.pdf");

+ 4 - 6
Demo/Examples/ContentEditor/App.xaml.cs

@@ -9,9 +9,7 @@ using System.Linq;
 using System.Reflection;
 using System.Threading;
 using System.Threading.Tasks;
-using System.Windows;
-using System.Xml;
-using static ComPDFKit.NativeMethod.CPDFSDKVerifier;
+using System.Windows; 
 
 namespace ContentEditorViewControl
 {
@@ -27,12 +25,12 @@ namespace ContentEditorViewControl
             Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
         }
 
-        private static bool LicenseVerify()
+        public static bool LicenseVerify()
         {
-            if (!LoadNativeLibrary())
+            if (!CPDFSDKVerifier.LoadNativeLibrary())
                 return false;
 
-            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify("license_key_windows.txt", true);
+            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(SDKLicenseHelper.ParseLicenseXML(), false);
             return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
         }
     }

+ 2 - 12
Demo/Examples/ContentEditor/ContentEditor.csproj

@@ -112,14 +112,6 @@
     </None>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
-      <Project>{a061ee7a-6704-4bd9-86ee-48ed5df75e2f}</Project>
-      <Name>ComPDFKit.Tool</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
-      <Project>{783263cf-0da3-4095-9df8-2c4a6b3ff908}</Project>
-      <Name>ComPDFKit.Viewer</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Compdfkit_Tools\Compdfkit_Tools.csproj">
       <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
       <Name>Compdfkit_Tools</Name>
@@ -129,12 +121,10 @@
     <Resource Include="ComPDFKit_Logo.ico" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-  </ItemGroup>
-  <ItemGroup>
     <Content Include="..\TestFile\ComPDFKit_Sample_File_Windows.pdf">
       <Link>ComPDFKit_Sample_File_Windows.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 3 - 3
Demo/Examples/ContentEditor/Properties/AssemblyInfo.cs

@@ -9,7 +9,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Content Editor_ComPDFKit")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -22,5 +22,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("1.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 2 - 2
Demo/Examples/DigitalSignature/App.xaml.cs

@@ -25,12 +25,12 @@ namespace DigitalSignature
             Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
         }
 
-        private static bool LicenseVerify()
+        public static bool LicenseVerify()
         {
             if (!CPDFSDKVerifier.LoadNativeLibrary())
                 return false;
 
-            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify("license_key_windows.txt", true);
+            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(SDKLicenseHelper.ParseLicenseXML(), false);
             return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
         }
     }

+ 4 - 8
Demo/Examples/DigitalSignature/DigitalSignature.csproj

@@ -121,10 +121,6 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
-    <None Include="..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
     <None Include="packages.config" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
@@ -135,10 +131,6 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
-      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
-      <Name>ComPDFKit.Desk</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Compdfkit_Tools\Compdfkit_Tools.csproj">
       <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
       <Name>Compdfkit_Tools</Name>
@@ -157,6 +149,10 @@
     </BootstrapperPackage>
   </ItemGroup>
   <ItemGroup>
+    <None Include="..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <Content Include="..\TestFile\ComPDFKit_Signatures_Sample_File.pdf">
       <Link>ComPDFKit_Signatures_Sample_File.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 3 - 3
Demo/Examples/DigitalSignature/Properties/AssemblyInfo.cs

@@ -9,7 +9,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Digital Signature_ComPDFKit")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -20,5 +20,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("1.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 4 - 6
Demo/Examples/DocsEditor/App.xaml.cs

@@ -9,9 +9,7 @@ using System.Linq;
 using System.Reflection;
 using System.Threading;
 using System.Threading.Tasks;
-using System.Windows;
-using System.Xml;
-using static ComPDFKit.NativeMethod.CPDFSDKVerifier;
+using System.Windows; 
 
 
 namespace DocsEditControl
@@ -30,12 +28,12 @@ namespace DocsEditControl
             Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
         }
 
-        private static bool LicenseVerify()
+        public static bool LicenseVerify()
         {
-            if (!LoadNativeLibrary())
+            if (!CPDFSDKVerifier.LoadNativeLibrary())
                 return false;
 
-            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify("license_key_windows.txt", true);
+            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(SDKLicenseHelper.ParseLicenseXML(), false);
             return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
         }
     }

+ 4 - 4
Demo/Examples/DocsEditor/DocsEditor.csproj

@@ -116,13 +116,13 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
     <Resource Include="ComPDFKit_Logo.ico" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <Content Include="..\TestFile\ComPDFKit_Sample_File_Windows.pdf">
       <Link>ComPDFKit_Sample_File_Windows.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 3 - 3
Demo/Examples/DocsEditor/Properties/AssemblyInfo.cs

@@ -12,7 +12,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Document Editor_ComPDFKit")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -51,5 +51,5 @@ using System.Windows;
 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 61 - 61
Demo/Examples/Examlpes.sln

@@ -5,7 +5,7 @@ VisualStudioVersion = 17.5.33516.290
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "License", "License", "{43ED4BF9-5941-4F32-A9DC-016E94A0E74E}"
 	ProjectSection(SolutionItems) = preProject
-		license_key_windows.txt = license_key_windows.txt
+		license_key_windows.xml = license_key_windows.xml
 	EndProjectSection
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Viewer", "Viewer\Viewer.csproj", "{A25DD47F-1FDF-48A1-8D0E-8CFF2C066A74}"
@@ -114,18 +114,18 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "BookmarkTest", "Samples\Boo
 EndProject
 Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DigitalSignatureTest", "Samples\DigitalSignatureTest\VB\DigitalSignatureTest.vbproj", "{84A958E6-C1DA-42C4-88E5-EBF4E3E632FE}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Desk", "..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj", "{56E518AD-C126-4B48-9A09-0A64C87020E4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Tool", "..\..\..\compdfkit_windows\ComPDFKit.Tool\ComPDFKit.Tool.csproj", "{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Viewer", "..\..\..\compdfkit_windows\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj", "{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UrlLoadTest", "Samples\UrlLoadTest\UrlLoadTest.csproj", "{A8AF1E5F-E8A0-43E7-91CE-615580B29325}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamLoadTest", "Samples\StreamLoadTest\StreamLoadTest.csproj", "{5498DB67-4E92-4C6C-A8B9-4729165DEDB2}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Measure", "Measure\Measure.csproj", "{75A0C673-E1D8-4FCE-8804-95E4F0630200}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Desk", "..\..\..\ComPDFKit-ForRebuild\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj", "{56E518AD-C126-4B48-9A09-0A64C87020E4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Tool", "..\..\..\ComPDFKit-Rebuild\ComPDFKit.Tool\ComPDFKit.Tool.csproj", "{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComPDFKit.Viewer", "..\..\..\ComPDFKit-Rebuild\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj", "{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -1037,60 +1037,6 @@ Global
 		{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
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x64.ActiveCfg = Debug|x64
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x64.Build.0 = Debug|x64
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x86.ActiveCfg = Debug|x86
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x86.Build.0 = Debug|x86
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|Any CPU.ActiveCfg = Debug|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|Any CPU.Build.0 = Debug|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x64.ActiveCfg = Debug|x64
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x64.Build.0 = Debug|x64
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x86.ActiveCfg = Debug|x86
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x86.Build.0 = Debug|x86
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|Any CPU.Build.0 = Release|Any CPU
-		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|x64.ActiveCfg = Release|x64
-		{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
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x64.ActiveCfg = Debug|x64
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x64.Build.0 = Debug|x64
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x86.ActiveCfg = Debug|x86
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x86.Build.0 = Debug|x86
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|Any CPU.ActiveCfg = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|Any CPU.Build.0 = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x64.ActiveCfg = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x64.Build.0 = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x86.ActiveCfg = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x86.Build.0 = DemoTest|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x64.ActiveCfg = Release|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x64.Build.0 = Release|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x86.ActiveCfg = Release|Any CPU
-		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x86.Build.0 = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x64.ActiveCfg = Debug|x64
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x64.Build.0 = Debug|x64
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x86.ActiveCfg = Debug|x86
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x86.Build.0 = Debug|x86
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|Any CPU.ActiveCfg = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|Any CPU.Build.0 = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x64.ActiveCfg = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x64.Build.0 = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x86.ActiveCfg = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x86.Build.0 = DemoTest|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|Any CPU.Build.0 = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x64.ActiveCfg = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x64.Build.0 = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x86.ActiveCfg = Release|Any CPU
-		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x86.Build.0 = Release|Any CPU
 		{A8AF1E5F-E8A0-43E7-91CE-615580B29325}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A8AF1E5F-E8A0-43E7-91CE-615580B29325}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A8AF1E5F-E8A0-43E7-91CE-615580B29325}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1145,6 +1091,60 @@ Global
 		{75A0C673-E1D8-4FCE-8804-95E4F0630200}.Release|x64.Build.0 = Release|Any CPU
 		{75A0C673-E1D8-4FCE-8804-95E4F0630200}.Release|x86.ActiveCfg = Release|Any CPU
 		{75A0C673-E1D8-4FCE-8804-95E4F0630200}.Release|x86.Build.0 = Release|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x64.ActiveCfg = Debug|x64
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x64.Build.0 = Debug|x64
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x86.ActiveCfg = Debug|x86
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Debug|x86.Build.0 = Debug|x86
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|Any CPU.ActiveCfg = Debug|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|Any CPU.Build.0 = Debug|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x64.ActiveCfg = Debug|x64
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x64.Build.0 = Debug|x64
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x86.ActiveCfg = Debug|x86
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.DemoTest|x86.Build.0 = Debug|x86
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{56E518AD-C126-4B48-9A09-0A64C87020E4}.Release|x64.ActiveCfg = Release|x64
+		{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
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x64.ActiveCfg = Debug|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x64.Build.0 = Debug|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x86.ActiveCfg = Debug|x86
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Debug|x86.Build.0 = Debug|x86
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|Any CPU.ActiveCfg = DemoTest|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|Any CPU.Build.0 = DemoTest|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x64.ActiveCfg = DemoTest|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x64.Build.0 = DemoTest|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x86.ActiveCfg = DemoTest|x86
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.DemoTest|x86.Build.0 = DemoTest|x86
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x64.ActiveCfg = Release|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x64.Build.0 = Release|x64
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x86.ActiveCfg = Release|x86
+		{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}.Release|x86.Build.0 = Release|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x64.ActiveCfg = Debug|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x64.Build.0 = Debug|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x86.ActiveCfg = Debug|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Debug|x86.Build.0 = Debug|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|Any CPU.ActiveCfg = DemoTest|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|Any CPU.Build.0 = DemoTest|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x64.ActiveCfg = DemoTest|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x64.Build.0 = DemoTest|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x86.ActiveCfg = DemoTest|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.DemoTest|x86.Build.0 = DemoTest|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|Any CPU.Build.0 = Release|Any CPU
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x64.ActiveCfg = Release|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x64.Build.0 = Release|x64
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x86.ActiveCfg = Release|x86
+		{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 10 - 11
Demo/Examples/Forms/App.xaml.cs

@@ -4,8 +4,7 @@ using System.Threading;
 using System.Windows;
 using System.Xml;
 using ComPDFKit.NativeMethod;
-using Compdfkit_Tools.Helper;
-using static ComPDFKit.NativeMethod.CPDFSDKVerifier;
+using Compdfkit_Tools.Helper; 
 
 namespace FormViewControl
 { 
@@ -14,6 +13,15 @@ namespace FormViewControl
     /// </summary>
     public partial class App: Application
     {
+        public static bool LicenseVerify()
+        {
+            if (!CPDFSDKVerifier.LoadNativeLibrary())
+                return false;
+
+            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(SDKLicenseHelper.ParseLicenseXML(), false);
+            return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
+        }
+
         protected override void OnStartup(StartupEventArgs e)
         {
             base.OnStartup(e);
@@ -21,14 +29,5 @@ namespace FormViewControl
             Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
             Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
         }
-
-        private static bool LicenseVerify()
-        {
-            if (!LoadNativeLibrary())
-                return false;
-
-            LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify("license_key_windows.txt", true);
-            return (verifyResult == LicenseErrorCode.E_LICENSE_SUCCESS);
-        }
     }
 }

+ 2 - 14
Demo/Examples/Forms/Forms.csproj

@@ -92,22 +92,14 @@
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
-      <Project>{a061ee7a-6704-4bd9-86ee-48ed5df75e2f}</Project>
-      <Name>ComPDFKit.Tool</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
-      <Project>{783263cf-0da3-4095-9df8-2c4a6b3ff908}</Project>
-      <Name>ComPDFKit.Viewer</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Compdfkit_Tools\Compdfkit_Tools.csproj">
       <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
       <Name>Compdfkit_Tools</Name>
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="..\TestFile\ComPDFKit_Forms_Sample_File.pdf">
@@ -121,10 +113,6 @@
     <Resource Include="ComPDFKit_Logo.ico" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
-      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
-      <Name>ComPDFKit.Desk</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Compdfkit_Tools\Compdfkit_Tools.csproj">
       <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
       <Name>Compdfkit_Tools</Name>

+ 3 - 3
Demo/Examples/Forms/Properties/AssemblyInfo.cs

@@ -12,7 +12,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Forms_ComPDFKit")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -51,5 +51,5 @@ using System.Windows;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 1 - 5
Demo/Examples/Measure/Measure.csproj

@@ -122,11 +122,7 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
-      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
-      <Name>ComPDFKit.Desk</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitDesktop\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
+    <ProjectReference Include="..\..\..\..\compdfkit\ComPDFKit\ComPDFKitDesktop\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
       <Project>{18ec356d-8130-49d4-b4e6-ac290e1065b7}</Project>
       <Name>ComPDFKit.Viewer</Name>
     </ProjectReference>

+ 3 - 0
Demo/Examples/PDFViewer/App.config

@@ -41,6 +41,9 @@
             <setting name="IsLoadLastFileNeeded" serializeAs="String">
                 <value>False</value>
             </setting>
+            <setting name="Divisor" serializeAs="String">
+                <value>10</value>
+            </setting>
         </PDFViewer.Properties.Settings>
     </userSettings>
 </configuration>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 10 - 8
Demo/Examples/PDFViewer/App.xaml.cs


+ 31 - 9
Demo/Examples/PDFViewer/MainPage.xaml.cs

@@ -81,10 +81,7 @@ namespace PDFViewer
         /// </summary>
         public bool RightToolPanelButtonIsChecked
         {
-            get
-            {
-                return (panelState.RightPanel == PanelState.RightPanelState.PropertyPanel);
-            }
+            get => panelState.RightPanel == PanelState.RightPanelState.PropertyPanel;
             set
             {
                 panelState.RightPanel = (value) ? PanelState.RightPanelState.PropertyPanel : PanelState.RightPanelState.None;
@@ -126,7 +123,7 @@ namespace PDFViewer
         public MainPage()
         {
             InitializeComponent();
-            this.DataContext = this;
+            this.DataContext = this; 
         }
         #endregion
 
@@ -656,13 +653,39 @@ namespace PDFViewer
         private void CPDFTitleBarControl_Loaded(object sender, RoutedEventArgs e)
         {
             CPDFTitleBarControl.OpenFileEvent -= CPDFTitleBarControl_OpenFileEvent;
-            CPDFTitleBarControl.OpenFileEvent += CPDFTitleBarControl_OpenFileEvent; ;
+            CPDFTitleBarControl.OpenFileEvent += CPDFTitleBarControl_OpenFileEvent;
 
             CPDFTitleBarControl.SaveAsFileEvent -= CPDFTitleBarControl_SaveAsFileEvent;
-            CPDFTitleBarControl.SaveAsFileEvent += CPDFTitleBarControl_SaveAsFileEvent; ;
+            CPDFTitleBarControl.SaveAsFileEvent += CPDFTitleBarControl_SaveAsFileEvent;
 
             CPDFTitleBarControl.SaveFileEvent -= CPDFTitleBarControl_SaveFileEvent;
-            CPDFTitleBarControl.SaveFileEvent += CPDFTitleBarControl_SaveFileEvent; ;
+            CPDFTitleBarControl.SaveFileEvent += CPDFTitleBarControl_SaveFileEvent;
+            
+            CPDFTitleBarControl.FlattenEvent -= CPDFTitleBarControl_FlattenEvent;
+            CPDFTitleBarControl.FlattenEvent += CPDFTitleBarControl_FlattenEvent;
+        }
+
+        private void CPDFTitleBarControl_FlattenEvent(object sender, EventArgs e)
+        {
+            if (viewControl != null && viewControl.GetCPDFViewer() != null && viewControl.GetCPDFViewer().GetDocument() != null)
+            {
+                string savePath = CommonHelper.GetGeneratePathOrEmpty("PDF files (*.pdf)|*.pdf", viewControl.GetCPDFViewer().GetDocument().FileName + "_Flattened.pdf");
+                if (!string.IsNullOrEmpty(savePath))
+                {
+                    if (CanSave)
+                    {
+                        SaveFile();
+                         
+                        viewControl.PDFViewTool.IsDocumentModified = false;
+                    }
+                    CPDFDocument document = CPDFDocument.InitWithFilePath(viewControl.GetCPDFViewer().GetDocument().FilePath);
+                    if (document?.WriteFlattenToFilePath(savePath) == true)
+                    {  
+                        System.Diagnostics.Process.Start("Explorer.exe", "/select," + savePath);
+                    }
+                    document?.Release();
+                }
+            }
         }
 
         private void CPDFTitleBarControl_SaveFileEvent(object sender, EventArgs e)
@@ -1003,5 +1026,4 @@ namespace PDFViewer
         }
         #endregion
     }
-
 }

+ 4 - 3
Demo/Examples/PDFViewer/MainWindow.xaml

@@ -12,8 +12,9 @@
         xmlns:cpdfcommon="clr-namespace:Compdfkit_Tools.Common;assembly=Compdfkit_Tools"
         xmlns:cpdftools="clr-namespace:Compdfkit_Tools.PDFControl;assembly=Compdfkit_Tools"
         xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
+        xmlns:sys="clr-namespace:System;assembly=mscorlib"
         BorderThickness="{Binding RelativeSource={RelativeSource Mode=Self},Path=WindowState,Converter={StaticResource WindowStateToThicknessConverter}}"
-        Title="ComPDFKit V1.11.0" Height="720" Width="1200" MinWidth="780">
+        Title="{Binding AppInfo}" Height="720" Width="1200" MinWidth="780">
 
     <Window.Resources>
         <cpdfcommon:HomePageHeightConverter x:Key="HomePageHeightConverter"></cpdfcommon:HomePageHeightConverter>
@@ -283,7 +284,7 @@
                 <dragablz:TabablzControl.HeaderPrefixContent>
                     <Grid Margin="10,0,0,0">
                         <StackPanel Orientation="Horizontal">
-                            <cpdfcommon:HomePageButton Style="{StaticResource HomePageButtonStyle}" x:Name="HomePageButton" Width="170" IsToggled="False" Toggled="HomePageButton_Toggled" QueryLock="HomePageButton_QueryLock">
+                            <cpdfcommon:HomePageButton Style="{StaticResource HomePageButtonStyle}" x:Name="HomePageButton" Width="170" IsToggled="False" Toggled="HomePageButton_Toggled" QueryLock="HomePageButton_QueryLock"> 
                                 <Grid>
                                     <StackPanel Orientation="Horizontal">
                                         <Viewbox Width="20" Height="20" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
@@ -293,7 +294,7 @@
                                                 <Path Data="M18.2856 3.71387H15.4284L15.4284 7.71385H10.857C9.59465 7.71385 8.5713 8.7372 8.5713 9.99956C8.5713 11.2619 9.59465 12.2853 10.857 12.2853H15.4284L15.4284 16.2853L4.57129 16.2853V18.2853C4.57129 19.2321 5.3388 19.9996 6.28558 19.9996H18.2856C19.2324 19.9996 19.9999 19.2321 19.9999 18.2853V5.42815C19.9999 4.48138 19.2324 3.71387 18.2856 3.71387Z" Fill="#31BC98"/>
                                             </Grid>
                                         </Viewbox>
-                                        <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" FontFamily="Microsoft YaHei" FontSize="12" FontWeight="DemiBold" Text="ComPDFKit V1.11.0">
+                                        <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" FontFamily="Microsoft YaHei" FontSize="12" FontWeight="DemiBold" Text="{Binding AppInfo}">
                                             <TextBlock.Foreground>
                                                 <Binding Path="IsToggled" ElementName="HomePageButton" Converter="{StaticResource BoolToColorConverter}"></Binding>
                                             </TextBlock.Foreground>

+ 18 - 5
Demo/Examples/PDFViewer/MainWindow.xaml.cs

@@ -23,6 +23,7 @@ using ComPDFKitViewer;
 using ComPDFKit.PDFDocument;
 using Compdfkit_Tools.Data;
 using Compdfkit_Tools.Common;
+using System.Reflection;
 
 namespace PDFViewer
 {
@@ -34,13 +35,17 @@ namespace PDFViewer
         #region Property
         private PDFViewControl passwordViewer;
         private string[] oldAndNewFilePath;
-
+        public string AppInfo
+        {
+            get { return Assembly.GetExecutingAssembly().GetName().Name + " " + string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3)); }
+        }
         #endregion
 
         public MainWindow()
         {
             InitializeComponent();
             Loaded += MainWindow_Loaded;
+            DataContext = this;
         }
 
         private void MainWindow_Loaded(object sender, RoutedEventArgs e)
@@ -123,18 +128,26 @@ namespace PDFViewer
                     confirmCreate = true;
                 };
                 createBlankPageSettingDialog.ShowDialog();
-                if(!confirmCreate)
+                if (!confirmCreate)
                 {
                     return;
                 }
-                
+
                 TabItemExt tabItem = new TabItemExt();
                 MainPage viewPage = new MainPage();
                 CPDFDocument document = CPDFDocument.CreateDocument();
                 document.SetInfo(new CPDFInfo
-                { Author = Properties.Settings.Default.DocumentAuthor, Creator = "ComPDFKit", CreationDate = DateTime.Now.ToString(),Subject="Document", Producer="ComPDFKit" , Keywords="Document", Version="1.11.0"});
+                {
+                    Author = Properties.Settings.Default.DocumentAuthor,
+                    Creator = Assembly.GetExecutingAssembly().GetName().Name,
+                    CreationDate = DateTime.Now.ToString(),
+                    Subject = "Document",
+                    Producer = Assembly.GetExecutingAssembly().GetName().Name,
+                    Keywords = "Document",
+                    Version = string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3))
+                });
                 document.InsertPage(0, blankPageSetting.Size.Width * 7.2 / 2.54, blankPageSetting.Size.Height * 7.2 / 2.54, "");
-                if(blankPageSetting.Orientation == Orientation.Horizontal)
+                if (blankPageSetting.Orientation == Orientation.Horizontal)
                 {
                     document.RotatePage(0, 1);
                 }

+ 14 - 12
Demo/Examples/PDFViewer/PDFViewer.csproj

@@ -173,14 +173,16 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
+    <Content Include="x64\ComPDFKit.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="x86\ComPDFKit.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="..\TestFile\PDF32000_2008.pdf">
       <Link>TestFile\PDF32000_2008.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <None Include="..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
     <Content Include="..\TestFile\ComPDFKit_Annotations_Sample_File.pdf">
       <Link>TestFile\ComPDFKit_Annotations_Sample_File.pdf</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -218,18 +220,18 @@
     <Resource Include="ComPDFKit_Logo.ico" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
-      <Project>{A061EE7A-6704-4BD9-86EE-48ED5DF75E2F}</Project>
+    <ProjectReference Include="..\..\..\..\ComPDFKit-ForRebuild\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
+      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
+      <Name>ComPDFKit.Desk</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\..\ComPDFKit-Rebuild\ComPDFKit.Tool\ComPDFKit.Tool.csproj">
+      <Project>{a061ee7a-6704-4bd9-86ee-48ed5df75e2f}</Project>
       <Name>ComPDFKit.Tool</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
-      <Project>{783263CF-0DA3-4095-9DF8-2C4A6B3FF908}</Project>
+    <ProjectReference Include="..\..\..\..\ComPDFKit-Rebuild\ComPDFKit.Viewer\ComPDFKit.Viewer.csproj">
+      <Project>{783263cf-0da3-4095-9df8-2c4a6b3ff908}</Project>
       <Name>ComPDFKit.Viewer</Name>
     </ProjectReference>
-    <ProjectReference Include="..\..\..\..\compdfkit_windows\ComPDFKit\ComPDFKitCSharp\ComPDFKit.Desk.csproj">
-      <Project>{56e518ad-c126-4b48-9a09-0a64c87020e4}</Project>
-      <Name>ComPDFKit.Desk</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Compdfkit_Tools\Compdfkit_Tools.csproj">
       <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
       <Name>Compdfkit_Tools</Name>

+ 3 - 3
Demo/Examples/PDFViewer/Properties/AssemblyInfo.cs

@@ -9,7 +9,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("PDFViewer")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -24,5 +24,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("1.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0")]
+[assembly: AssemblyFileVersion("1.12.0")]

+ 12 - 0
Demo/Examples/PDFViewer/Properties/Settings.Designer.cs

@@ -104,5 +104,17 @@ namespace PDFViewer.Properties {
                 this["IsLoadLastFileNeeded"] = value;
             }
         }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("10")]
+        public int Divisor {
+            get {
+                return ((int)(this["Divisor"]));
+            }
+            set {
+                this["Divisor"] = value;
+            }
+        }
     }
 }

+ 3 - 0
Demo/Examples/PDFViewer/Properties/Settings.settings

@@ -23,6 +23,9 @@
     <Setting Name="IsLoadLastFileNeeded" Type="System.Boolean" Scope="User">
       <Value Profile="(Default)">False</Value>
     </Setting>
+    <Setting Name="Divisor" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">10</Value>
+    </Setting>
   </Settings>
 </SettingsFile>
 

+ 7 - 2
Demo/Examples/PDFViewer/SettingsDialog.xaml

@@ -4,6 +4,7 @@
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:PDFViewer"
+        xmlns:common="clr-namespace:Compdfkit_Tools.Common;assembly=ComPDFKit_Tools"
         mc:Ignorable="d"
         Title="Settings" Height="580" Width="440"
         ShowInTaskbar="False"
@@ -103,7 +104,7 @@
     <Grid Margin="24,0,24,0">
         <Grid.RowDefinitions>
             <RowDefinition Height="106"></RowDefinition>
-            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="150"></RowDefinition>
             <RowDefinition Height="35"></RowDefinition>
             <RowDefinition Height="45"/>
             <RowDefinition Height="180"></RowDefinition>
@@ -133,6 +134,10 @@
                     <TextBlock Text="{Binding  ConverterParameter=Setting_HighlightForms, Converter={StaticResource ResourceConverter}}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
                     <ToggleButton x:Name="HighlightFormTog" Click="HighlightFormTog_Click" Style="{StaticResource SliderSwitchToggleButtonStyle}" Height="32" HorizontalAlignment="Right"></ToggleButton>
                 </Grid>
+                <Grid Margin="0,0,0,8" Height="32">
+                    <TextBlock Text="{Binding  ConverterParameter=Setting_Divisor, Converter={StaticResource ResourceConverter}}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
+                    <common:NumericUpDownControl x:Name="DivisorTxb" Unit="%" Minimum="1" Maximum="100" Width="118" Height="32" HorizontalAlignment="Right"></common:NumericUpDownControl>
+                </Grid>
             </StackPanel>
         </Border>
         <TextBlock Text="{Binding  ConverterParameter=Title_GlobalSettings, Converter={StaticResource ResourceConverter}}" Background="White" Grid.Row="1" Height="20" FontSize="14" HorizontalAlignment="Left" VerticalAlignment="Top" FontWeight="DemiBold" FontFamily="Microsoft YaHei" Margin="10,-10,0,0"></TextBlock>
@@ -141,7 +146,7 @@
             <StackPanel  Margin="10">
                 <Grid Margin="0,0,0,8" Height="32">
                     <TextBlock Text="{Binding  ConverterParameter=Subtitle_Version, Converter={StaticResource ResourceConverter}}" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
-                    <TextBlock HorizontalAlignment="Right"  VerticalAlignment="Center" Text="V1.11.0"></TextBlock>
+                    <TextBlock HorizontalAlignment="Right"  VerticalAlignment="Center" Text="{Binding AppVersion}"></TextBlock>
                 </Grid>
             </StackPanel>
         </Border>

+ 19 - 0
Demo/Examples/PDFViewer/SettingsDialog.xaml.cs

@@ -1,6 +1,8 @@
 using System;
 using System.ComponentModel;
 using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
 using System.Windows;
 using System.Windows.Controls;
 using Compdfkit_Tools.Helper;
@@ -12,16 +14,23 @@ namespace PDFViewer
     /// </summary>
     public partial class SettingsDialog : Window
     {
+        public string AppVersion
+        {
+            get { return string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3)); }
+        }
+
         public event EventHandler<string> LanguageChanged;
         public SettingsDialog()
         {
             InitializeComponent();
             Closing += MainWindow_Closing;
             Title = App.MainResourceManager.GetString("Title_Settings");
+            DataContext = this;
         }
 
         private void MainWindow_Closing(object sender, CancelEventArgs e)
         {
+            Properties.Settings.Default.Divisor = GetDivisor();
             Properties.Settings.Default.Save();
             Compdfkit_Tools.Data.CPDFAnnotationData.Author = Properties.Settings.Default.DocumentAuthor;
         }
@@ -34,6 +43,15 @@ namespace PDFViewer
                 Process.Start(webLocation);
             }
         }
+        
+        private int GetDivisor()
+        {
+            if (!DivisorTxb.IsValueValid)
+            {
+                return 10;
+            }
+            return int.TryParse(DivisorTxb.Text, out int divisor) ? divisor : 10;
+        }
 
         private void SettingsDialog_Loaded(object sender, RoutedEventArgs e)
         {
@@ -41,6 +59,7 @@ namespace PDFViewer
             HighlightLinkTog.IsChecked = Properties.Settings.Default.IsHighlightLinkArea;
             AuthorTxb.Text = Properties.Settings.Default.DocumentAuthor;
             SelectCurrentLanguage();
+            DivisorTxb.Text = Properties.Settings.Default.Divisor.ToString();
         }
         
         private void SelectCurrentLanguage()

+ 10 - 1
Demo/Examples/PDFViewer/Strings/SettingDialog.Designer.cs

@@ -1,4 +1,4 @@
-//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
 //
@@ -95,6 +95,15 @@ namespace PDFViewer.Strings.SettingDialog {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Rolling Ratio.
+        /// </summary>
+        internal static string Setting_Divisor {
+            get {
+                return ResourceManager.GetString("Setting_Divisor", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Highlight Form Fields.
         /// </summary>

+ 3 - 0
Demo/Examples/PDFViewer/Strings/SettingDialog.resx

@@ -75,4 +75,7 @@
     <data name="Tip_RestartTitle" xml:space="preserve">
         <value>Restart Application</value>
     </data>
+    <data name="Setting_Divisor" xml:space="preserve">
+        <value>Rolling Ratio</value>
+    </data>
 </root>

+ 3 - 0
Demo/Examples/PDFViewer/Strings/SettingDialog.zh.resx

@@ -68,4 +68,7 @@
     <data name="Tip_RestartTitle" xml:space="preserve">
         <value>重新启动应用</value>
     </data>
+    <data name="Setting_Divisor" xml:space="preserve">
+        <value>滚动比例</value>
+    </data>
 </root>

+ 2 - 2
Demo/Examples/Samples/AnnotationImportExportTest/CS/AnnotationImportExportTest.csproj

@@ -119,8 +119,8 @@
     </BootstrapperPackage>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

+ 3 - 3
Demo/Examples/Samples/AnnotationImportExportTest/CS/Properties/AssemblyInfo.cs

@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("AnnotationImportExportTest")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 3 - 2
Demo/Examples/Samples/AnnotationImportExportTest/VB/AnnotationImportExportTest.vbproj

@@ -26,6 +26,7 @@
     <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>
@@ -124,8 +125,8 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

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

@@ -10,9 +10,9 @@ Imports System.Runtime.InteropServices
 
 <Assembly: AssemblyTitle("AnnotationImportExportTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
 <Assembly: AssemblyProduct("AnnotationImportExportTest")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("1.12.0.0")>
+<Assembly: AssemblyFileVersion("1.12.0.0")>

+ 2 - 2
Demo/Examples/Samples/AnnotationTest/CS/AnnotationTest.csproj

@@ -108,8 +108,8 @@
     </BootstrapperPackage>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

+ 3 - 3
Demo/Examples/Samples/AnnotationTest/CS/Properties/AssemblyInfo.cs

@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("AnnotationTest")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 2 - 2
Demo/Examples/Samples/AnnotationTest/VB/AnnotationTest.vbproj

@@ -133,8 +133,8 @@
     </None>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 ' Review the values of the assembly attributes
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("AnnotationTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("AnnotationTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("1.12.0.0")>
+<Assembly: AssemblyFileVersion("1.12.0.0")>

+ 3 - 2
Demo/Examples/Samples/BackgroundTest/CS/BackgroundTest.csproj

@@ -39,6 +39,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -106,8 +107,8 @@
     </BootstrapperPackage>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

+ 3 - 3
Demo/Examples/Samples/BackgroundTest/CS/Properties/AssemblyInfo.cs

@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("BackgroundTest")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 2 - 2
Demo/Examples/Samples/BackgroundTest/VB/BackgroundTest.vbproj

@@ -129,8 +129,8 @@
       <Link>logo.png</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 ' Review the values of the assembly attributes
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("BackgroundTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("BackgroundTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("1.12.0.0")>
+<Assembly: AssemblyFileVersion("1.12.0.0")>

+ 2 - 2
Demo/Examples/Samples/BatesTest/CS/BatesTest.csproj

@@ -66,8 +66,8 @@
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

+ 3 - 3
Demo/Examples/Samples/BatesTest/CS/Properties/AssemblyInfo.cs

@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("BatesTest")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 2 - 2
Demo/Examples/Samples/BatesTest/VB/BatesTest.vbproj

@@ -120,8 +120,8 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 ' Review the values of the assembly attributes
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("BatesTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("BatesTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("1.12.0.0")>
+<Assembly: AssemblyFileVersion("1.12.0.0")>

+ 2 - 2
Demo/Examples/Samples/BookmarkTest/CS/BookmarkTest.csproj

@@ -70,8 +70,8 @@
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <Content Include="ComPDFKit_Logo.ico" />

+ 3 - 3
Demo/Examples/Samples/BookmarkTest/CS/Properties/AssemblyInfo.cs

@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("BookmarkTest")]
-[assembly: AssemblyCopyright("Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.")]
+[assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // 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.11.0.0")]
-[assembly: AssemblyFileVersion("1.11.0.0")]
+[assembly: AssemblyVersion("1.12.0.0")]
+[assembly: AssemblyFileVersion("1.12.0.0")]

+ 2 - 2
Demo/Examples/Samples/BookmarkTest/VB/BookmarkTest.vbproj

@@ -120,8 +120,8 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\..\license_key_windows.txt">
-      <Link>license_key_windows.txt</Link>
+    <None Include="..\..\..\license_key_windows.xml">
+      <Link>license_key_windows.xml</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 ' Review the values of the assembly attributes
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("BookmarkTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("BookmarkTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 ' by using the '*' as shown below:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("1.12.0.0")>
+<Assembly: AssemblyFileVersion("1.12.0.0")>

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


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.