Browse Source

ComPDFKit.Demo(win) - Merge branch 'compdfkit_demo_win' into compdfkit_demo_win_dev

# Conflicts:
#	Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.xaml
liuaoran 6 months ago
parent
commit
850494ee37
60 changed files with 1063 additions and 535 deletions
  1. 2 2
      Demo/Examples/Annotations/Properties/AssemblyInfo.cs
  2. 3 3
      Demo/Examples/ComPDFKit.Tool/CPDFToolManager.cs
  3. 2 3
      Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.Command.cs
  4. 6 1
      Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.TextEdit.cs
  5. 2 4
      Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.xaml
  6. 5 2
      Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.xaml.cs
  7. 6 1
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationData/CPDFAnnotationData.cs
  8. 12 2
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListControl/CPDFAnnotationListControl.xaml
  9. 42 9
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListControl/CPDFAnnotationListControl.xaml.cs
  10. 34 7
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/AnnotationReplyListControl.xaml
  11. 13 11
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/AnnotationReplyListControl.xaml.cs
  12. 49 20
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/CPDFAnnotationListUI.xaml
  13. 100 14
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/CPDFAnnotationListUI.xaml.cs
  14. 6 1
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/ReplyStatusControl.xaml
  15. 18 8
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/ReplyStatusControl.xaml.cs
  16. 1 0
      Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFSignatureUI.xaml.cs
  17. 3 3
      Demo/Examples/Compdfkit.Controls/Common/Convert/AnnotArgsTypeToVisibilityConverter.cs
  18. 8 10
      Demo/Examples/Compdfkit.Controls/Common/Convert/LanguageResourceConverter.cs
  19. 93 30
      Demo/Examples/Compdfkit.Controls/Edit/ContentEditCOntrol/ContentEditControl.xaml.cs
  20. 4 2
      Demo/Examples/Compdfkit.Controls/Edit/PDFContentEditControl.xaml.cs
  21. 5 13
      Demo/Examples/Compdfkit.Controls/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml
  22. 267 140
      Demo/Examples/Compdfkit.Controls/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs
  23. 292 154
      Demo/Examples/Compdfkit.Controls/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml.cs
  24. 5 2
      Demo/Examples/Compdfkit.Controls/PDFView/PDFViewControl/PDFViewControl.xaml.cs
  25. 6 7
      Demo/Examples/Compdfkit.Controls/Printer/PrintHelper.cs
  26. 1 1
      Demo/Examples/Compdfkit.Controls/Printer/PrintPreviewControl.xaml.cs
  27. 2 2
      Demo/Examples/Compdfkit.Controls/Printer/PrinterDialog.xaml
  28. 4 4
      Demo/Examples/Compdfkit.Controls/Printer/PrinterDialog.xaml.cs
  29. 1 1
      Demo/Examples/Compdfkit.Controls/Printer/PrinterModel.cs
  30. 2 2
      Demo/Examples/Compdfkit.Controls/Properties/AssemblyInfo.cs
  31. 1 1
      Demo/Examples/Compdfkit.Controls/Strings/Bota.resx
  32. 0 1
      Demo/Examples/ContentEditor/MainWindow.xaml.cs
  33. 2 2
      Demo/Examples/ContentEditor/Properties/AssemblyInfo.cs
  34. 2 2
      Demo/Examples/DigitalSignature/Properties/AssemblyInfo.cs
  35. 3 7
      Demo/Examples/DocsEditor/Properties/AssemblyInfo.cs
  36. 2 2
      Demo/Examples/Forms/Properties/AssemblyInfo.cs
  37. 2 2
      Demo/Examples/Measure/Properties/AssemblyInfo.cs
  38. 2 2
      Demo/Examples/PDFViewer/Properties/AssemblyInfo.cs
  39. 6 8
      Demo/Examples/Samples/AnnotationImportExportTest/CS/Properties/AssemblyInfo.cs
  40. 2 2
      Demo/Examples/Samples/AnnotationTest/CS/Properties/AssemblyInfo.cs
  41. 2 2
      Demo/Examples/Samples/BackgroundTest/CS/Properties/AssemblyInfo.cs
  42. 2 2
      Demo/Examples/Samples/BatesTest/CS/Properties/AssemblyInfo.cs
  43. 2 2
      Demo/Examples/Samples/BookmarkTest/CS/Properties/AssemblyInfo.cs
  44. 2 2
      Demo/Examples/Samples/DigitalSignatureTest/CS/Properties/AssemblyInfo.cs
  45. 6 6
      Demo/Examples/Samples/DocumentCompareTest/VB/My Project/AssemblyInfo.vb
  46. 2 2
      Demo/Examples/Samples/DocumentInfoTest/CS/Properties/AssemblyInfo.cs
  47. 2 2
      Demo/Examples/Samples/EncryptTest/CS/Properties/AssemblyInfo.cs
  48. 2 2
      Demo/Examples/Samples/FlattenTest/CS/Properties/AssemblyInfo.cs
  49. 2 2
      Demo/Examples/Samples/HeaderFooterTest/CS/Properties/AssemblyInfo.cs
  50. 2 2
      Demo/Examples/Samples/ImageExtractTest/CS/Properties/AssemblyInfo.cs
  51. 2 2
      Demo/Examples/Samples/InteractiveFormsTest/CS/Properties/AssemblyInfo.cs
  52. 2 2
      Demo/Examples/Samples/OutlineTest/CS/Properties/AssemblyInfo.cs
  53. 2 2
      Demo/Examples/Samples/PDFATest/CS/Properties/AssemblyInfo.cs
  54. 2 2
      Demo/Examples/Samples/PDFPageTest/CS/Properties/AssemblyInfo.cs
  55. 2 2
      Demo/Examples/Samples/PDFRedactTest/CS/Properties/AssemblyInfo.cs
  56. 6 6
      Demo/Examples/Samples/PDFToImageTest/VB/My Project/AssemblyInfo.vb
  57. 2 2
      Demo/Examples/Samples/TextExtractTest/CS/Properties/AssemblyInfo.cs
  58. 2 2
      Demo/Examples/Samples/TextSearchTest/CS/Properties/AssemblyInfo.cs
  59. 1 1
      Demo/Examples/Samples/WatermarkTest/CS/Properties/AssemblyInfo.cs
  60. 2 2
      Demo/Examples/Viewer/Properties/AssemblyInfo.cs

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 3 - 3
Demo/Examples/ComPDFKit.Tool/CPDFToolManager.cs

@@ -348,7 +348,7 @@ namespace ComPDFKit.Tool
 
             if (oldToolType == ToolType.ContentEdit)
             {
-                viewerTool.GetCPDFViewer().GetDocument().ReleasePages();
+                viewerTool.GetCPDFViewer().GetDocument()?.ReleasePages();
                 //Undo delete logic
                 viewerTool.GetCPDFViewer().UndoManager.ClearHistory();
                 // viewerTool.GetCPDFViewer().UndoManager.RemoveRedoHistoryForType(typeof(PDFEditHistory));
@@ -536,8 +536,8 @@ namespace ComPDFKit.Tool
             CPDFDocument cPDFDocument = viewerTool.GetCPDFViewer().GetDocument();
             CPDFPage cPDFPage = cPDFDocument.PageAtIndex(e.PageIndex);
             CPDFEditPage cPDFEditPage = cPDFPage.GetEditPage();
-            cPDFEditPage.BeginEdit(CPDFEditType.EditText | CPDFEditType.EditImage);
-            List<CPDFEditArea> cPDFEditAreas = cPDFEditPage.GetEditAreaList(true);
+            //cPDFEditPage.BeginEdit(CPDFEditType.EditText | CPDFEditType.EditImage);
+            List<CPDFEditArea> cPDFEditAreas = cPDFEditPage.GetEditAreaList(false);
             float zoom = (float)viewerTool.PDFViewer.GetZoom();
             for (int i = 0; i < e.MultiObjectIndex.Count; i++)
             {

+ 2 - 3
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.Command.cs

@@ -480,10 +480,10 @@ namespace ComPDFKit.Tool
                     {
                         foreach (SelectedRect selectedRect in multiSelectedRect.Children)
                         {
-
                             EditAreaObject editAreaObject = GetEditAreaObjectListForRect(selectedRect);
                             if (editAreaObject != null)
                             {
+
                                 PDFEditCommandData commandData = new PDFEditCommandData();
                                 if (editAreaObject.cPDFEditArea.Type == CPDFEditType.EditText)
                                 {
@@ -533,8 +533,7 @@ namespace ComPDFKit.Tool
                                     }
                                 }
                             }
-                        }
-
+                        } 
                     }
                 }
             }

+ 6 - 1
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.TextEdit.cs

@@ -2109,8 +2109,13 @@ namespace ComPDFKit.Tool
             }
 
         }
-        #region FrameSelect
 
+        public EditAreaObject CurrentEditAreaObject()
+        {
+            return currentEditAreaObject;
+        }
+
+        #region FrameSelect
         int selectFrameSelectToolTag = -1;
         private void InsertFrameSelectToolView()
         {

+ 2 - 4
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.xaml

@@ -12,9 +12,7 @@
              >
     <ScrollViewer Focusable="False" CanContentScroll="True"
                   HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
-                  MouseUp="ScrollViewer_MouseUp" MouseDown="ScrollViewer_MouseDown" ScrollChanged="ScrollViewer_ScrollChanged">
-        <compdfkitviewer:CPDFViewer x:Name="PDFViewer">
-
-        </compdfkitviewer:CPDFViewer>
+                  MouseUp="ScrollViewer_MouseUp" MouseDown="ScrollViewer_MouseDown">
+        <compdfkitviewer:CPDFViewer x:Name="PDFViewer"></compdfkitviewer:CPDFViewer>
     </ScrollViewer>
 </UserControl>

+ 5 - 2
Demo/Examples/ComPDFKit.Tool/CPDFViewerTool.xaml.cs

@@ -338,6 +338,7 @@ namespace ComPDFKit.Tool
             {
                 return;
             }
+
             if (!HitTestBorder())
             {
                 RemovePopTextUI();
@@ -521,7 +522,7 @@ namespace ComPDFKit.Tool
                 }
                 else
                 {
-                    if (Keyboard.IsKeyDown(multiKey) &&isMultiSelected)
+                    if (Keyboard.IsKeyDown(multiKey) && isMultiSelected)
                     {
                         DelMultiSelectRect();
                     }
@@ -579,6 +580,7 @@ namespace ComPDFKit.Tool
             {
                 return;
             }
+
             MouseEventObject mouseEventObject = new MouseEventObject
             {
                 mouseButtonEventArgs = e,
@@ -586,6 +588,7 @@ namespace ComPDFKit.Tool
                 annotType = C_ANNOTATION_TYPE.C_ANNOTATION_NONE,
                 IsCreate = false
             };
+
             if (isDrawSelectRect || IsDrawEditAnnot)
             {
                 mouseEventObject.hitTestType = MouseHitTestType.SelectRect;
@@ -862,7 +865,7 @@ namespace ComPDFKit.Tool
                             default:
                                 break;
                         }
-                    }
+                    } 
                 }
             }
             else

+ 6 - 1
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationData/CPDFAnnotationData.cs

@@ -25,7 +25,12 @@ namespace ComPDFKit.Controls.Data
         Signature,
         Link,
         Audio,
-        Image
+        Image,
+        PolyLine,
+        Polygon,
+        LineMeasure,
+        PolyLineMeasure,
+        PolygonMeasure
     }
 
     public enum SignatureType

+ 12 - 2
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListControl/CPDFAnnotationListControl.xaml

@@ -52,10 +52,20 @@
                         </Canvas>
                     </MenuItem.Header>
                     <MenuItem Header="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Menu_ExpandAllAnnot}" Style="{StaticResource Sub_MenuItem}">
-
+                        <MenuItem.Command>
+                            <cpdftools:ExpandAnnotListCommand/>
+                        </MenuItem.Command>
+                        <MenuItem.CommandParameter>
+                            <Binding Path="." RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type cpdftools:CPDFAnnotationListControl}}"/>
+                        </MenuItem.CommandParameter>
                     </MenuItem>
                     <MenuItem Header="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Menu_FoldAllAnnot}" Style="{StaticResource Sub_MenuItem}">
-
+                        <MenuItem.Command>
+                            <cpdftools:FoldAnnotListCommand/>
+                        </MenuItem.Command>
+                        <MenuItem.CommandParameter>
+                            <Binding Path="." RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type cpdftools:CPDFAnnotationListControl}}"/>
+                        </MenuItem.CommandParameter>
                     </MenuItem>
                     <MenuItem Header="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Menu_ExpandAllReply}" Style="{StaticResource Sub_MenuItem}">
                         <MenuItem.Command>

+ 42 - 9
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListControl/CPDFAnnotationListControl.xaml.cs

@@ -6,12 +6,9 @@ using ComPDFKit.Tool.Help;
 using ComPDFKitViewer;
 using ComPDFKitViewer.BaseObject;
 using System.Collections.Generic;
-using System.Linq;
 using System.IO;
 using System.Windows;
-using System.Windows.Annotations;
 using System.Windows.Controls;
-using ComPDFKit.Controls.Helper;
 using static ComPDFKit.Controls.PDFControlUI.CPDFAnnotationListUI;
 using ComPDFKit.Controls.PDFControlUI;
 using System.Windows.Input;
@@ -147,16 +144,16 @@ namespace ComPDFKit.Controls.PDFControl
             pdfViewer.UpdateAnnotFrame();
             for (int i = 0; i < pageCount; i++)
             {
-
                 List<AnnotParam> annotList = GetAnnotCommentList(i, pdfViewer.PDFViewTool.GetCPDFViewer().GetDocument());
+                List<CPDFAnnotation> annotCoreList = pdfViewer?.GetCPDFViewer()?.GetDocument()?.PageAtIndex(i, false)?.GetAnnotations();
                 if (annotList != null && annotList.Count > 0)
                 {
                     Dispatcher.Invoke(() =>
                     {
                         foreach (AnnotParam annot in annotList)
                         {
-                            CPDFAnnotation annotCore = pdfViewer?.GetCPDFViewer()?.GetAnnotForIndex(i, annot.AnnotIndex)?.GetAnnotData()?.Annot;
-                            if (annotCore == null || annotCore.IsReplyAnnot())
+                            CPDFAnnotation annotCore = annotCoreList[annot.AnnotIndex];
+                            if (annotCore == null || annotCore.IsReplyAnnot() || annotCore.Type == C_ANNOTATION_TYPE.C_ANNOTATION_LINK)
                             {
                                 continue;
                             }
@@ -170,10 +167,10 @@ namespace ComPDFKit.Controls.PDFControl
                                 IsMarkState = annotCore.IsMarkedStateAnnot()
                             };
 
-                            List<CPDFAnnotation> replyAnnotations = annotCore?.GetReplies();
+                            List<CPDFTextAnnotation> replyAnnotations = annotCore?.GetReplies();
                             if (replyAnnotations != null && replyAnnotations.Count > 0)
                             {
-                                foreach (CPDFAnnotation replyAnnot in replyAnnotations)
+                                foreach (CPDFTextAnnotation replyAnnot in replyAnnotations)
                                 {
                                     if (replyAnnot == null)
                                     {
@@ -271,7 +268,6 @@ namespace ComPDFKit.Controls.PDFControl
             {
                 Directory.CreateDirectory(tempPath);
             }
-
             if (pdfViewer.PDFToolManager.GetDocument().ExportAnnotationToXFDFPath(selectedPath, tempPath))
             {
                 System.Diagnostics.Process.Start("explorer.exe", "/select," + selectedPath);
@@ -353,4 +349,41 @@ namespace ComPDFKit.Controls.PDFControl
             }
         }
     }
+
+    public class ExpandAnnotListCommand : ICommand
+    {
+        public event EventHandler CanExecuteChanged;
+
+        public bool CanExecute(object parameter)
+        {
+            return true;
+        }
+
+        public void Execute(object parameter)
+        {
+            if (parameter is CPDFAnnotationListControl annotationListControl)
+            {
+                annotationListControl.AnnotationList.ExpandAnnotList(true);
+            }
+        }
+    }
+
+    public class FoldAnnotListCommand : ICommand
+    {
+        public event EventHandler CanExecuteChanged;
+
+        public bool CanExecute(object parameter)
+        {
+            return true;
+        }
+
+        public void Execute(object parameter)
+        {
+            if (parameter is CPDFAnnotationListControl annotationListControl)
+            {
+                annotationListControl.AnnotationList.ExpandAnnotList(false);
+            }
+        }
+    }
+
 }

+ 34 - 7
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/AnnotationReplyListControl.xaml

@@ -6,6 +6,7 @@
              xmlns:common="clr-namespace:ComPDFKit.Controls.Common"
              xmlns:local="clr-namespace:ComPDFKit.Controls.PDFControlUI"
              mc:Ignorable="d" 
+             Loaded= "UserControl_Loaded"
              d:DesignHeight="450" d:DesignWidth="800">
     <UserControl.Resources>
         <ResourceDictionary>
@@ -15,10 +16,11 @@
             <common:TextLengthToVisibilityConverter x:Key="TextLengthToVisibilityConverter"></common:TextLengthToVisibilityConverter>
             <common:SubtractionConverter x:Key="SubtractionConverter"></common:SubtractionConverter>
             <common:AntiVisibilityConverter x:Key="AntiVisibilityConverter"></common:AntiVisibilityConverter>
+            <common:BoolToVisibleConverter x:Key="BoolToVisibleConverter"></common:BoolToVisibleConverter>
             <common:BotaResourceConverter x:Key="BotaResourceConverter"></common:BotaResourceConverter>
         </ResourceDictionary>
     </UserControl.Resources>
-    <Grid x:Name="ReplyGrid" Margin="5">
+    <Grid x:Name="ReplyGrid" Margin="0">
         <Grid.RowDefinitions>
             <RowDefinition Height="0"></RowDefinition>
             <RowDefinition Height="0"></RowDefinition>
@@ -31,23 +33,48 @@
                       Visibility="{Binding ElementName=InputTxb, Path=Text, Converter={StaticResource TextLengthToVisibilityConverter}}"></TextBlock>
         </Grid>
 
-        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,0,0">
+        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
             <Button Content="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Cancel}" Background="Transparent" BorderThickness="0" Margin="0,0,5,0" Width="56" Height="30" Click="ButtonCancel_Click"></Button>
             <Button Content="{Binding Converter={StaticResource BotaResourceConverter},ConverterParameter=Button_Reply}" Width="56" Height="30" Foreground="White" Background="#1460F3" BorderThickness="0" Click="ReplyButton_Click"></Button>
         </StackPanel>
 
-        <ListView Grid.Row="2" x:Name="ReplyList" Margin="0,5,0,0" VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
-                 ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderThickness="0" SelectionMode="Single" >
+        <ListView Grid.Row="2" x:Name="ReplyList" Margin="0,0,0,0" VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
+                 ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderThickness="0" SelectionMode="Single" 
+                   Visibility="{Binding ElementName=ReplyList, Path=HasItems, Converter={StaticResource BoolToVisibleConverter}}">
             <ListView.ItemsPanel>
                 <ItemsPanelTemplate>
                     <VirtualizingStackPanel Background="#FAFCFF" HorizontalAlignment="Stretch" MaxHeight="200"
                                            Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Converter={StaticResource SubtractionConverter}, ConverterParameter=5}"></VirtualizingStackPanel>
                 </ItemsPanelTemplate>
             </ListView.ItemsPanel>
-
+            <ListView.ItemContainerStyle>
+                <Style TargetType="ListViewItem">
+                    <Setter Property="Template">
+                        <Setter.Value>
+                            <ControlTemplate TargetType="ListViewItem">
+                                <ContentPresenter />
+                            </ControlTemplate>
+                        </Setter.Value>
+                    </Setter>
+                    <Setter Property="MinHeight" Value="0" />
+                    <Setter Property="Height" Value="Auto" /> 
+                </Style>
+            </ListView.ItemContainerStyle>
             <ListView.ItemTemplate>
-                <ItemContainerTemplate>
-                    <Grid Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Converter={StaticResource SubtractionConverter}, ConverterParameter=30}">
+                <ItemContainerTemplate> 
+                    <Grid>
+                        <Grid.Style>
+                            <Style TargetType="Grid"> 
+                                <Style.Triggers>
+                                    <Trigger Property="IsMouseOver" Value="True">
+                                        <Setter Property="Background" Value="#D0D9E1"/> 
+                                    </Trigger>
+                                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" Value="True">
+                                        <Setter Property="Background" Value="#D0D9E1"/> 
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </Grid.Style>
                         <Grid.RowDefinitions>
                             <RowDefinition Height="Auto"/>
                             <RowDefinition Height="Auto"/>

+ 13 - 11
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/AnnotationReplyListControl.xaml.cs

@@ -1,18 +1,8 @@
 using System;
-using System.Collections.Generic;
 using System.Collections.ObjectModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
 using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Navigation;
-using System.Windows.Shapes;
 
 namespace ComPDFKit.Controls.PDFControlUI
 {
@@ -165,9 +155,21 @@ namespace ComPDFKit.Controls.PDFControlUI
                 if (textBox.DataContext is CPDFAnnotationListUI.ReplyData replyData)
                 {
                     replyData.ReplyAnnotation.SetContent(textBox.Text);
+                    InvokeReplyListChanged();
                 }
             }
         }
+
+        private void UserControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            ReplyDeleted -= AnnotationReplyListControl_ReplyDeleted;
+            ReplyDeleted += AnnotationReplyListControl_ReplyDeleted;
+        }
+
+        private void AnnotationReplyListControl_ReplyDeleted(object sender, CPDFAnnotationListUI.ReplyData e)
+        {
+            ReplyListSource.Remove(e);
+        }
     }
 
     public class ShowContentBoxCommand : ICommand
@@ -204,8 +206,8 @@ namespace ComPDFKit.Controls.PDFControlUI
             if (parameter is CPDFAnnotationListUI.ReplyData replyData)
             {
                 replyData.ReplyAnnotation.RemoveAnnot();
-                AnnotationReplyListControl.InvokeReplyListChanged();
                 AnnotationReplyListControl.InvokeReplyDeleted(replyData);
+                AnnotationReplyListControl.InvokeReplyListChanged();
             }
         }
     }

File diff suppressed because it is too large
+ 49 - 20
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/CPDFAnnotationListUI.xaml


+ 100 - 14
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/CPDFAnnotationListUI.xaml.cs

@@ -11,9 +11,9 @@ using System.Windows.Data;
 using System.Windows.Input;
 using ComPDFKit.Controls.Helper;
 using System.Collections.Specialized;
-using ComPDFKitViewer;
 using ComPDFKit.Controls.PDFControl;
 using static ComPDFKit.Controls.PDFControlUI.CPDFAnnotationListUI;
+using ComPDFKit.Controls.Data;
 
 namespace ComPDFKit.Controls.PDFControlUI
 {
@@ -49,6 +49,10 @@ namespace ComPDFKit.Controls.PDFControlUI
             if (parameter is AnnotationBindData data)
             {
                 data.IsReplyInputVisible = !data.IsReplyInputVisible;
+                if(data.IsReplyInputVisible)
+                {
+                    data.IsReplyListVisible = true;
+                }
             }
         }
     }
@@ -64,7 +68,7 @@ namespace ComPDFKit.Controls.PDFControlUI
             get => ReplyList.Count.ToString();
         }
 
-        private bool _isReplyListVisible;
+        private bool _isReplyListVisible = true;
         public bool IsReplyListVisible
         {
             get { return _isReplyListVisible; }
@@ -106,8 +110,8 @@ namespace ComPDFKit.Controls.PDFControlUI
         {
             get
             {
-                CPDFAnnotation annotCore = pdfViewer?.GetCPDFViewer()?.GetAnnotForIndex(annotationData.PageIndex, annotationData.AnnotIndex)?.GetAnnotData()?.Annot;
-                return annotCore;
+                List<CPDFAnnotation> annotCoreList = pdfViewer?.GetCPDFViewer()?.GetDocument()?.PageAtIndex(annotationData.PageIndex, false)?.GetAnnotations();
+                return annotCoreList[annotationData.AnnotIndex];
             }
         }
 
@@ -164,7 +168,7 @@ namespace ComPDFKit.Controls.PDFControlUI
     public partial class CPDFAnnotationListUI : UserControl
     {
         public event EventHandler<CPDFAnnotationState> ReplyStatusChanged;
-          
+
         public class ReplyData
         {
             public CPDFAnnotation ReplyAnnotation { get; set; }
@@ -243,6 +247,17 @@ namespace ComPDFKit.Controls.PDFControlUI
                 OnPropertyChanged(nameof(ReplyCount));
             }
 
+            private Visibility _isAnnotListVisible = Visibility.Visible;
+            public Visibility IsAnnotListVisible
+            {
+                get { return _isAnnotListVisible; }
+                set
+                {
+                    _isAnnotListVisible = value;
+                    OnPropertyChanged(nameof(IsAnnotListVisible));
+                }
+            }
+
             public int PageIndex { get; set; }
 
             public int AnnotIndex { get => annotationData.AnnotIndex; }
@@ -269,7 +284,7 @@ namespace ComPDFKit.Controls.PDFControlUI
                     }
                     else
                     {
-                        return String.Empty;
+                        return string.Empty;
                     }
                 }
             }
@@ -279,9 +294,73 @@ namespace ComPDFKit.Controls.PDFControlUI
                 get => annotationData.Content;
             }
 
-            public C_ANNOTATION_TYPE CurrentAnnotationType
+            public CPDFAnnotationType CurrentAnnotationType
             {
-                get => annotationData.CurrentType;
+                get
+                {
+                    switch(Annotation.Type)
+                    {
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_CIRCLE:
+                            return CPDFAnnotationType.Circle;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_SQUARE:
+                            return CPDFAnnotationType.Square;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_LINE:
+                            {
+                                if(Annotation.IsMeasured())
+                                    return CPDFAnnotationType.LineMeasure;
+                                else
+                                    return CPDFAnnotationType.Line;
+                            }
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_FREETEXT:
+                             return CPDFAnnotationType.FreeText;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_HIGHLIGHT:
+                             return CPDFAnnotationType.Highlight;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_SQUIGGLY:
+                            return CPDFAnnotationType.Squiggly;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_STRIKEOUT:
+                            return CPDFAnnotationType.Strikeout;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_UNDERLINE:
+                            return CPDFAnnotationType.Underline;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_INK:
+                            return CPDFAnnotationType.Freehand;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_TEXT:
+                            return CPDFAnnotationType.Note;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_STAMP:
+                            return CPDFAnnotationType.Stamp;
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE:
+                            {
+                                if (Annotation.IsMeasured())
+                                    return CPDFAnnotationType.PolyLineMeasure;
+                                else
+                                    return CPDFAnnotationType.PolyLine;
+                            }
+
+                        case C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON:
+                            {
+                                if (Annotation.IsMeasured())
+                                    return CPDFAnnotationType.PolygonMeasure;
+                                else
+                                    return CPDFAnnotationType.Polygon;
+                            }
+
+                        default:
+                            return CPDFAnnotationType.Note;
+
+                    }
+
+                }
+
             }
 
             public AnnotParam annotationData { get; set; }
@@ -291,8 +370,8 @@ namespace ComPDFKit.Controls.PDFControlUI
             {
                 get
                 {
-                    CPDFAnnotation annotCore = pdfViewer?.GetCPDFViewer()?.GetAnnotForIndex(annotationData.PageIndex, annotationData.AnnotIndex)?.GetAnnotData()?.Annot;
-                    return annotCore;
+                    List<CPDFAnnotation> annotCoreList = pdfViewer?.GetCPDFViewer()?.GetDocument()?.PageAtIndex(annotationData.PageIndex, false)?.GetAnnotations();
+                    return annotCoreList[annotationData.AnnotIndex];
                 }
             }
 
@@ -313,8 +392,6 @@ namespace ComPDFKit.Controls.PDFControlUI
             } 
         }
 
-
-
         private ObservableCollection<AnnotationBindData> annotationList = new ObservableCollection<AnnotationBindData>();
 
         public event EventHandler<object> AnnotationSelectionChanged;
@@ -324,7 +401,6 @@ namespace ComPDFKit.Controls.PDFControlUI
         private ContextMenu popContextMenu;
         private bool enableSelectEvent = true;
 
-
         public CPDFAnnotationListUI()
         {
             InitializeComponent();
@@ -387,7 +463,6 @@ namespace ComPDFKit.Controls.PDFControlUI
             AnnotationList.ContextMenu = popContextMenu;
         }
 
-
         public void DeleteAllAnnot()
         {
             try
@@ -440,6 +515,17 @@ namespace ComPDFKit.Controls.PDFControlUI
             }
         }
 
+        public void ExpandAnnotList(bool isExpand)
+        {
+            foreach (AnnotationBindData data in annotationList)
+            {
+                if (isExpand)
+                    data.BindProperty.IsAnnotListVisible = Visibility.Visible;
+                else
+                    data.BindProperty.IsAnnotListVisible = Visibility.Collapsed;
+            }
+        }
+
         private void DeleteAllMenu_Click(object sender, RoutedEventArgs e)
         {
             try

+ 6 - 1
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/ReplyStatusControl.xaml

@@ -57,7 +57,12 @@
             <Menu Background="Transparent">
                 <local:PathMenuItem x:Name="IconMenu" Height="30" Width="30" Margin="0" Padding="0">
                     <local:PathMenuItem.Header>
-                        <Grid x:Name="ButtonIcon" Height="30" Width="30"></Grid>
+                        <Grid x:Name="ButtonIcon" Height="30" Width="30">
+                            <Canvas Height="20" Width="20"> 
+                                <Rectangle Stroke="#5A000000" StrokeThickness="2" Width="16" Height="16"/>
+                                <Line X1="1" Y1="1" X2="15" Y2="15" Stroke="#5A000000" StrokeThickness="2"/>
+                            </Canvas>
+                        </Grid>
                     </local:PathMenuItem.Header>
                 </local:PathMenuItem>
             </Menu>

+ 18 - 8
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationList/PDFAnnotationListUI/ReplyStatusControl.xaml.cs

@@ -1,10 +1,10 @@
 using ComPDFKit.PDFAnnotation;
 using System;
-using System.Collections.Generic; 
+using System.Collections.Generic;
 using System.Windows;
-using System.Windows.Controls; 
-using System.Windows.Media; 
-using System.Windows.Shapes; 
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Shapes;
 
 namespace ComPDFKit.Controls.PDFControlUI
 {
@@ -67,7 +67,10 @@ namespace ComPDFKit.Controls.PDFControlUI
                     Header = "Cancelled",
                     IconPath = new Path
                     {
-                        Data = Geometry.Parse("M2 2H13.5V13.5H2V2ZM0.5 0.5H2H13.5H15V2V13.5V15H13.5H2H0.5V13.5V2V0.5ZM5.56066 4.5L6.09099 5.03033L8.00165 6.94099L9.91231 5.03033L10.4426 4.5L11.5033 5.56066L10.973 6.09099L9.06231 8.00165L10.973 9.91232L11.5033 10.4426L10.4426 11.5033L9.91231 10.973L8.00165 9.06231L6.09099 10.973L5.56066 11.5033L4.5 10.4426L5.03033 9.91232L6.94099 8.00165L5.03033 6.09099L4.5 5.56066L5.56066 4.5Z"),
+                        Data = Geometry.Parse("M2 2 H16 V16 H2 V2 M4 4 L14 14 M14 4 L4 14"),
+                        Stroke = Brushes.Black,
+                        StrokeThickness = 1,
+                        Fill = Brushes.Transparent
                     },
                     Tag = CPDFAnnotationState.C_ANNOTATION_CANCELLED
                 },
@@ -76,19 +79,26 @@ namespace ComPDFKit.Controls.PDFControlUI
                     Header = "Completed",
                     IconPath = new Path
                     {
-                        Data = Geometry.Parse("M2 2H13.5V13.5H2V2ZM0.5 0.5H2H13.5H15V2V13.5V15H13.5H2H0.5V13.5V2V0.5ZM11.6441 6.40148L12.1745 5.87115L11.1138 4.81049L10.5835 5.34082L6.87115 9.05313L5.53033 7.71231L5 7.18198L3.93934 8.24264L4.46967 8.77297L6.34082 10.6441L6.87115 11.1745L7.40148 10.6441L11.6441 6.40148Z"),
+                        Data = Geometry.Parse("M2 2 H16 V16 H2 V2 M5 9 L8 12 L14 6"),
+                        Stroke = Brushes.Black, 
+                        StrokeThickness = 1, 
+                        Fill = Brushes.Transparent 
                     },
                     Tag = CPDFAnnotationState.C_ANNOTATION_COMPLETED
                 },
+
                 new PathMenuItem
                 {
                     Header = "None",
                     IconPath = new Path
                     {
-                        Data = Geometry.Parse("M2 2H13.5V13.5H2V2ZM0.5 0.5H2H13.5H15V2V13.5V15H13.5H2H0.5V13.5V2V0.5ZM5 7.25H4.25V8.75H5H11H11.75V7.25H11H5Z"),
+                        Data = Geometry.Parse("M2 2 H16 V16 H2 V2 M5 9 H13"),
+                        Stroke = Brushes.Black,  
+                        StrokeThickness = 1, 
+                        Fill = Brushes.Transparent 
                     },
                     Tag = CPDFAnnotationState.C_ANNOTATION_NONE
-                }
+                }, 
             };
 
             Style style = FindResource("MenuItemStyle") as Style;

+ 1 - 0
Demo/Examples/Compdfkit.Controls/Annotation/PDFAnnotationPanel/PDFAnnotationUI/CPDFSignatureUI.xaml.cs

@@ -76,6 +76,7 @@ namespace ComPDFKit.Controls.Annotation.PDFAnnotationPanel.PDFAnnotationUI
             {
                 FillForm(((sender as ListBoxItem).DataContext as CPDFSignatureData).SourcePath);
             }
+            viewControl.PDFViewTool.IsDocumentModified = true;
         }
 
         private void FillForm(string imagePath)

+ 3 - 3
Demo/Examples/Compdfkit.Controls/Common/Convert/AnnotArgsTypeToVisibilityConverter.cs

@@ -1,4 +1,4 @@
-using ComPDFKit.PDFAnnotation;
+using ComPDFKit.Controls.Data;
 using System;
 using System.Globalization;
 using System.Windows;
@@ -6,12 +6,12 @@ using System.Windows.Data;
 
 namespace ComPDFKit.Controls.Common
 {
-    [ValueConversion(typeof(C_ANNOTATION_TYPE), typeof(Visibility))]
+    [ValueConversion(typeof(CPDFAnnotationType), typeof(Visibility))]
     public class AnnotArgsTypeToVisibilityConverter : IValueConverter
     {
         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            C_ANNOTATION_TYPE annotArgsType = (C_ANNOTATION_TYPE)value;
+            CPDFAnnotationType annotArgsType = (CPDFAnnotationType)value;
             if (annotArgsType.ToString() == parameter as string)
             {
                 return Visibility.Visible;

+ 8 - 10
Demo/Examples/Compdfkit.Controls/Common/Convert/LanguageResourceConverter.cs

@@ -6,8 +6,6 @@ using ComPDFKit.Controls.Helper;
 
 namespace ComPDFKit.Controls.Common
 {
-
-
     public class BotaResourceConverter : IValueConverter
     {
         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
@@ -22,7 +20,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
 
@@ -40,7 +38,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
 
@@ -58,7 +56,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
 
@@ -76,7 +74,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
 
@@ -94,7 +92,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
     
@@ -112,7 +110,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
     
@@ -130,7 +128,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
     
@@ -148,7 +146,7 @@ namespace ComPDFKit.Controls.Common
 
         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
-            throw new NotSupportedException();
+            return null;
         }
     }
 }

+ 93 - 30
Demo/Examples/Compdfkit.Controls/Edit/ContentEditCOntrol/ContentEditControl.xaml.cs

@@ -17,7 +17,6 @@ using System.Windows.Controls.Primitives;
 using System.Windows.Forms;
 using System.Windows.Input;
 using System.Windows.Media;
-using static ComPDFKit.Tool.CPDFToolManager;
 using System.Windows.Media.Imaging;
 using ComPDFKit.Import;
 using ComPDFKit.Tool.Help;
@@ -28,6 +27,7 @@ using KeyEventHandler = System.Windows.Input.KeyEventHandler;
 using MenuItem = System.Windows.Controls.MenuItem;
 using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
 using UserControl = System.Windows.Controls.UserControl;
+using System.Linq;
 
 namespace ComPDFKit.Controls.PDFControl
 {
@@ -54,7 +54,7 @@ namespace ComPDFKit.Controls.PDFControl
         private bool textAreaCreating = false;
 
         public event PropertyChangedEventHandler PropertyChanged;
-         
+
         public bool CanUndo
         {
             get
@@ -70,8 +70,9 @@ namespace ComPDFKit.Controls.PDFControl
                 }
                 catch (Exception ex)
                 {
+                    return false;
+                }
 
-                } 
                 return false;
             }
         }
@@ -91,7 +92,7 @@ namespace ComPDFKit.Controls.PDFControl
                 }
                 catch (Exception ex)
                 {
-
+                    return false;
                 }
 
                 return false;
@@ -113,7 +114,7 @@ namespace ComPDFKit.Controls.PDFControl
                 }
                 catch (Exception ex)
                 {
-
+                    return false;
                 }
 
                 return false;
@@ -156,7 +157,7 @@ namespace ComPDFKit.Controls.PDFControl
             PdfViewControl.PDFViewTool.GetCPDFViewer().SetIsShowStampMouse(false);
             PdfViewControl.PDFViewTool.SelectedEditAreaForIndex(-1, -1);
         }
-         
+
         public void SetViewSettings(Visibility visibility, CPDFDisplaySettingsControl displaySettingsControl = null)
         {
             this.PropertyContainer.Child = displaySettingsControl;
@@ -173,7 +174,7 @@ namespace ComPDFKit.Controls.PDFControl
         {
             this.displaySettingsControl = displaySettingsControl;
         }
-         
+
         public void InitWithPDFViewer(PDFViewControl view)
         {
             PdfViewControl.PDFViewTool.GetCPDFViewer().UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
@@ -197,6 +198,7 @@ namespace ComPDFKit.Controls.PDFControl
                 {
                     PdfViewControl.PDFViewTool.RemoveHandler(KeyDownEvent, KeyDownHandler);
                 }
+
                 KeyDownHandler = new KeyEventHandler(PDFView_KeyDown);
                 PdfViewControl.PDFViewTool.AddHandler(KeyDownEvent, KeyDownHandler, false);
             }
@@ -204,7 +206,7 @@ namespace ComPDFKit.Controls.PDFControl
 
         private void PdfViewControl_DrawChanged(object sender, EventArgs e)
         {
-            if(textAreaCreating && PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.EditText)
+            if (textAreaCreating && PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.EditText)
             {
                 textAreaCreating = false;
                 int pageIndex = -1;
@@ -218,7 +220,7 @@ namespace ComPDFKit.Controls.PDFControl
                     if (editAreaArea.Type == CPDFEditType.EditText)
                     {
                         PDFEditParam pDFEditParam = ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), editAreaArea, pageIndex);
-                        pdfContentEditControl.SetPDFTextEditData((TextEditParam)pDFEditParam, true);
+                        pdfContentEditControl.SetPDFTextEditData(new List<TextEditParam> { (TextEditParam)pDFEditParam }, true);
                         PropertyContainer.Child = pdfContentEditControl;
                     }
                 }
@@ -234,6 +236,16 @@ namespace ComPDFKit.Controls.PDFControl
             {
                 return;
             }
+
+            if (e.Key == Key.LeftShift || e.Key == Key.RightShift)
+            {
+                PdfViewControl.PDFViewTool.SetMultiSelectKey(e.Key);
+            }
+            else if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
+            {
+                PdfViewControl.PDFViewTool.SetMultiSelectKey(e.Key);
+            }
+
             int pageIndex = -1;
             CPDFEditTextArea textArea = PdfViewControl.PDFToolManager.GetSelectedEditAreaObject(ref pageIndex) as CPDFEditTextArea;
             if (textArea == null)
@@ -372,6 +384,7 @@ namespace ComPDFKit.Controls.PDFControl
                     startPoint = GetPoint(textArea);
                     isUpdateStartPoint = false;
                 }
+
                 if (e.Key == Key.Left)
                 {
                     textArea.GetPreWordCharPlace();
@@ -434,7 +447,7 @@ namespace ComPDFKit.Controls.PDFControl
             PropertyContainer.Child = propertytPanel;
             PropertyContainer.Visibility = visible;
         }
-         
+
         private void PanelState_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
             if (e.PropertyName == nameof(PanelState.IsLeftPanelExpand))
@@ -478,15 +491,13 @@ namespace ComPDFKit.Controls.PDFControl
                     textEditParam.EditIndex = -1;
                     textEditParam.TextAlign = TextAlignType.AlignLeft;
                     textEditParam.Transparency = 255;
-                    pdfContentEditControl.SetPDFTextEditData(textEditParam);
+                    pdfContentEditControl.SetPDFTextEditData(new List<TextEditParam> { textEditParam });
                     DefaultSettingParam defaultSettingParam = PdfViewControl.PDFViewTool.GetDefaultSettingParam();
                     defaultSettingParam.SetPDFEditParamm(textEditParam);
                     panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
                     PdfViewControl.PDFToolManager.SetCreateContentEditType(CPDFEditType.EditText);
                     PdfViewControl.PDFViewTool.SetCurrentEditType(CPDFEditType.EditText);
                 }
-
-                PdfViewControl.PDFViewTool.GetCPDFViewer().UpdateRenderFrame();
             }
 
         }
@@ -497,7 +508,6 @@ namespace ComPDFKit.Controls.PDFControl
             if (senderBtn != null && PdfViewControl != null)
             {
                 ClearPDFEditState(senderBtn);
-                PdfViewControl.PDFViewTool.GetCPDFViewer().UpdateRenderFrame();
                 panelState.RightPanel = PanelState.RightPanelState.None;
                 senderBtn.IsChecked = false;
                 OpenFileDialog openFileDialog = new OpenFileDialog();
@@ -559,7 +569,7 @@ namespace ComPDFKit.Controls.PDFControl
             {
                 if (PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.EditText)
                 {
-                    pdfContentEditControl.SetPDFTextEditData(pdfTextCreateParam);
+                    pdfContentEditControl.SetPDFTextEditData(new List<TextEditParam> { pdfTextCreateParam });
                 }
                 else if (PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.None)
                 {
@@ -616,6 +626,19 @@ namespace ComPDFKit.Controls.PDFControl
                 case MouseHitTestType.ImageEdit:
                     CreateImageEditMenu(sender, ref ContextMenu);
                     break;
+                case MouseHitTestType.Unknown:
+                    List<int> pageInts = new List<int>();
+                    List<CPDFEditArea> editAreas = PdfViewControl.PDFToolManager.GetSelectedEditAreaListObject(ref pageInts);
+                    if (editAreas.Count > 0)
+                    {
+                        CreateMultiTextEditMenu(sender, ref ContextMenu);
+                    }
+                    else
+                    {
+                        ContextMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
+                        ContextMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_MatchPaste"), Command = CustomCommands.PasteWithoutStyle, CommandTarget = (UIElement)sender });
+                    }
+                    break;
                 default:
                     ContextMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
                     ContextMenu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_MatchPaste"), Command = CustomCommands.PasteWithoutStyle, CommandTarget = (UIElement)sender });
@@ -624,7 +647,7 @@ namespace ComPDFKit.Controls.PDFControl
             PdfViewControl.SetRightMenu(ContextMenu);
         }
         #endregion
-        
+
         #region Property changed
         protected void OnPropertyChanged([CallerMemberName] string name = null)
         {
@@ -686,27 +709,54 @@ namespace ComPDFKit.Controls.PDFControl
                     PdfViewControl.PDFToolManager.SetCreateContentEditType(CPDFEditType.None);
                 }
 
-                if(PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.EditText)
+                if (PdfViewControl.PDFToolManager.GetCreateContentEditType() == CPDFEditType.EditText)
                 {
                     textAreaCreating = true;
                 }
             }
 
             int pageIndex = -1;
-            CPDFEditArea editAreaArea = PdfViewControl.PDFToolManager.GetSelectedEditAreaObject(ref pageIndex);
-            if (editAreaArea == null)
+            CPDFEditArea editArea = PdfViewControl.PDFToolManager.GetSelectedEditAreaObject(ref pageIndex);
+            List<int> pageInts = new List<int>();
+            List<CPDFEditArea> editAreas = PdfViewControl.PDFToolManager.GetSelectedEditAreaListObject(ref pageInts);
+
+            if (editArea != null)
             {
-                return;
+                if (editArea.Type == CPDFEditType.EditText)
+                {
+                    PDFEditParam editParam = ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), editArea, pageIndex);
+                    pdfContentEditControl.SetPDFTextEditData(new List<TextEditParam> { (TextEditParam)editParam }, true);
+                    PropertyContainer.Child = pdfContentEditControl;
+                }
             }
-            else
+            else if (editAreas != null && editAreas.Count != 0)
             {
-                if (editAreaArea.Type == CPDFEditType.EditText)
+                List<CPDFEditTextArea> editTextAreas = editAreas.OfType<CPDFEditTextArea>().ToList();
+                editTextAreas.ForEach(textArea => textArea.SelectAllChars());
+                if (editAreas.Count == editTextAreas.Count)
                 {
-                    PDFEditParam pDFEditParam = ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), editAreaArea, pageIndex);
-                    pdfContentEditControl.SetPDFTextEditData((TextEditParam)pDFEditParam, true);
+                    List<TextEditParam> editParams = editTextAreas.
+                        Select(area => ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), area, pageInts.FirstOrDefault())).
+                        Cast<TextEditParam>().ToList();
+                    pdfContentEditControl.SetPDFTextEditData(editParams, true);
+                    PropertyContainer.Child = pdfContentEditControl;
+                }
+                else if (editTextAreas.Count == 0)
+                {
+                    List<ImageEditParam> editParams = editAreas.
+                        Select(area => ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), area, pageInts.FirstOrDefault())).
+                        Cast<ImageEditParam>().ToList();
+                    pdfContentEditControl.SetPDFImageEditData(editParams);
                     PropertyContainer.Child = pdfContentEditControl;
                 }
-                //panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
+                else
+                {
+                    pdfContentEditControl.ClearContentControl();
+                }
+            }
+            else
+            {
+                return;
             }
         }
 
@@ -725,7 +775,7 @@ namespace ComPDFKit.Controls.PDFControl
             {
                 if (PdfViewControl.PDFToolManager.GetCreateContentEditType() != CPDFEditType.EditText)
                 {
-                    pdfContentEditControl.ClearContentControl(); 
+                    pdfContentEditControl.ClearContentControl();
                 }
                 return;
             }
@@ -734,7 +784,7 @@ namespace ComPDFKit.Controls.PDFControl
                 if (editAreaArea.Type == CPDFEditType.EditText)
                 {
                     PDFEditParam pDFEditParam = ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), editAreaArea, pageIndex);
-                    pdfContentEditControl.SetPDFTextEditData((TextEditParam)pDFEditParam, true);
+                    pdfContentEditControl.SetPDFTextEditData(new List<TextEditParam> { (TextEditParam)pDFEditParam }, true);
                     PropertyContainer.Child = pdfContentEditControl;
                 }
 
@@ -747,9 +797,14 @@ namespace ComPDFKit.Controls.PDFControl
                         pageView.MouseLeftButtonUp += PageView_MouseLeftButtonUp;
                     }
                     PDFEditParam pDFEditParam = ParamConverter.CPDFDataConverterToPDFEitParam(PdfViewControl.PDFToolManager.GetDocument(), editAreaArea, pageIndex);
-                    pdfContentEditControl.SetPDFImageEditData((ImageEditParam)pDFEditParam);
+                    pdfContentEditControl.SetPDFImageEditData(new List<ImageEditParam> { (ImageEditParam)pDFEditParam });
                     PropertyContainer.Child = pdfContentEditControl;
-                } 
+                }
+
+                else
+                {
+
+                }
             }
         }
 
@@ -768,7 +823,7 @@ namespace ComPDFKit.Controls.PDFControl
             }
             if (imageAreaParam != null)
             {
-                pdfContentEditControl.SetPDFImageEditData((ImageEditParam)imageAreaParam);
+                pdfContentEditControl.SetPDFImageEditData(new List<ImageEditParam> { (ImageEditParam)imageAreaParam });
             }
         }
 
@@ -969,6 +1024,14 @@ namespace ComPDFKit.Controls.PDFControl
             menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Delete"), Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
             menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
         }
+
+        private void CreateMultiTextEditMenu(object sender, ref ContextMenu menu)
+        {
+            menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Copy"), Command = ApplicationCommands.Copy, CommandTarget = (UIElement)sender });
+            menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Cut"), Command = ApplicationCommands.Cut, CommandTarget = (UIElement)sender });
+            menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Delete"), Command = ApplicationCommands.Delete, CommandTarget = (UIElement)sender });
+            menu.Items.Add(new MenuItem() { Header = LanguageHelper.CommonManager.GetString("Menu_Paste"), Command = ApplicationCommands.Paste, CommandTarget = (UIElement)sender });
+        }
     }
 }
 #endregion

+ 4 - 2
Demo/Examples/Compdfkit.Controls/Edit/PDFContentEditControl.xaml.cs

@@ -1,6 +1,7 @@
 using ComPDFKit.Tool;
 using ComPDFKit.Controls.PDFControl;
 using System.Windows.Controls;
+using System.Collections.Generic;
 
 namespace ComPDFKit.Controls.Edit
 {
@@ -32,7 +33,7 @@ namespace ComPDFKit.Controls.Edit
             PDFImageEditControl.SetRotationText(rotation);
         }
 
-        public void SetPDFTextEditData(TextEditParam editEvent, bool isTemp = false)
+        public void SetPDFTextEditData(List<TextEditParam> editEvent, bool isTemp = false)
         {
             if (!isTemp)
             {
@@ -59,12 +60,13 @@ namespace ComPDFKit.Controls.Edit
             ContentEditContainer.Child = null;
         }
 
-        public void SetPDFImageEditData(ImageEditParam editEvent)
+        public void SetPDFImageEditData(List<ImageEditParam> editEvent)
         {
             PDFImageEditControl.SetPDFImageEditData(editEvent);
             ContentEditContainer.Child = PDFImageEditControl;
         }
 
+
         //public void SetPDFImageMultiEditData(List<PDFEditEvent> editEventList)
         //{
         //    PDFImageEditControl.SetPDFImageMultiEditData(editEventList);

+ 5 - 13
Demo/Examples/Compdfkit.Controls/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml

@@ -20,25 +20,17 @@
     </UserControl.Resources>
     <ScrollViewer VerticalScrollBarVisibility="Auto">
 
-        <Grid>
-            <Grid.RowDefinitions>
-                <RowDefinition Height="auto"></RowDefinition>
-                <RowDefinition Height="auto"></RowDefinition>
-                <RowDefinition Height="auto"></RowDefinition>
-                <RowDefinition Height="auto"></RowDefinition>
-                <RowDefinition Height="auto"></RowDefinition>
-                <RowDefinition Height="auto"></RowDefinition>
-            </Grid.RowDefinitions>
+        <StackPanel>
 
             <Border Background="White" Height="36">
                 <TextBlock FontSize="14" FontWeight="Bold" HorizontalAlignment="Center" Foreground="#42464D" VerticalAlignment="Center" Text="{Binding Converter={StaticResource PropertyPanelResourceConverter},ConverterParameter=Title_ImageProperty}"></TextBlock>
             </Border>
 
-            <Border Name="ImageThumbBorder" Background="White" Grid.Row="1" MinHeight="100" CornerRadius="5" Margin="0,16,0,0" BorderThickness="1" BorderBrush="#E2E3E6">
+            <Border Name="ImageThumbBorder" Background="White" Grid.Row="1" MinHeight="100" CornerRadius="5" Margin="0,16,0,0" BorderThickness="1" BorderBrush="#E2E3E6" Visibility="{Binding OnlySingleVisible}">
                 <Image Name="ImageThumbUI" MaxHeight="80" MaxWidth="230" Stretch="Uniform"></Image>
             </Border>
 
-            <StackPanel Grid.Row="2"  Margin="0,33,0,0" >
+            <StackPanel Grid.Row="2"  >
                 <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>
@@ -94,7 +86,7 @@
                 </Grid>
             </Grid>
 
-            <Grid Grid.Row="5" Margin="0,20,0,0">
+            <Grid  Margin="0,20,0,0" Visibility="{Binding OnlySingleVisible}">
                 <Grid.RowDefinitions>
                     <RowDefinition Height="auto"></RowDefinition>
                     <RowDefinition Height="auto"></RowDefinition>
@@ -152,6 +144,6 @@
 
             </Grid>
 
-        </Grid>
+        </StackPanel>
     </ScrollViewer>
 </UserControl>

+ 267 - 140
Demo/Examples/Compdfkit.Controls/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs

@@ -17,25 +17,35 @@ using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
 using System.Windows.Input;
-using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using ComPDFKit.Tool.DrawTool;
 using ComPDFKitViewer.Helper;
 using ComPDFKit.Tool.Help;
+using System.Linq;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
 
 namespace ComPDFKit.Controls.Edit
 {
-    public partial class PDFImageEditControl : UserControl
+    public partial class PDFImageEditControl : UserControl, INotifyPropertyChanged
     {
         #region property
         public CPDFViewerTool ToolView { get; set; }
-        public ImageEditParam EditEvent { get; set; }
+        public List<ImageEditParam> EditEvents { get; set; } = new List<ImageEditParam>();
+
+        private Visibility _onlySingleVisible = Visibility.Collapsed;
+        public Visibility OnlySingleVisible
+        {
+            get => _onlySingleVisible;
+            set => UpdateProper(ref  _onlySingleVisible, value);
+        }
 
         //public List<PDFEditEvent> EditMultiEvents { get; set; }
         #endregion 
 
         public PDFImageEditControl()
         {
+            DataContext = this;
             InitializeComponent();
             Loaded += PDFImageEditControl_Loaded;
             Unloaded += PDFImageEditControl_Unloaded;
@@ -57,7 +67,7 @@ namespace ComPDFKit.Controls.Edit
         {
             RotateUI.RotationChanged -= RotateUI_RotationChanged;
             FlipUI.FlipChanged -= FlipUI_FlipChanged;
-        } 
+        }
 
         #endregion
 
@@ -66,24 +76,33 @@ namespace ComPDFKit.Controls.Edit
         {
             if (ToolView.GetIsCropMode())
             {
-                GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-                SelectedRect selectedRect = ToolView.GetSelectedRectForEditAreaObject(imageArea);
-                if (selectedRect != null)
+                GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+                if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                    return;
+
+                SelectedRect selectedRect = ToolView.GetSelectedRectForEditAreaObject(imageAreas[0]);
+                if (selectedRect == null)
+                    return;
+
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                double currentZoom = ToolView.GetCPDFViewer().CurrentRenderFrame.ZoomFactor;
+                Rect rect = selectedRect.GetRect();
+                Rect maxRect = selectedRect.GetMaxRect();
+                Rect pdfRect = new Rect((rect.X - maxRect.X) / currentZoom, (rect.Y - maxRect.Y) / currentZoom, rect.Width / currentZoom, rect.Height / currentZoom);
+                pdfRect = DpiHelper.StandardRectToPDFRect(pdfRect);
+                CRect newCRect = new CRect((float)pdfRect.Left, (float)pdfRect.Bottom, (float)pdfRect.Right, (float)pdfRect.Top);
+                if(imageAreas[0].CutWithRect(newCRect))
                 {
-                    Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                    double currentZoom = ToolView.GetCPDFViewer().CurrentRenderFrame.ZoomFactor;
-                    Rect rect = selectedRect.GetRect();
-                    Rect maxRect = selectedRect.GetMaxRect();
-
-                    Rect pdfRect = new Rect((rect.X - maxRect.X) / currentZoom, (rect.Y - maxRect.Y) / currentZoom, rect.Width / currentZoom, rect.Height / currentZoom);
-                    pdfRect = DpiHelper.StandardRectToPDFRect(pdfRect);
-                    CRect newCRect = new CRect((float)pdfRect.Left, (float)pdfRect.Bottom, (float)pdfRect.Right, (float)pdfRect.Top);
-                    imageArea.CutWithRect(newCRect);
-
-                    SetImageThumb();
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
-                }
+                    PDFEditHistory editHistory = new PDFEditHistory();
+                    editHistory.EditPage = editPage;
+                    editHistory.PageIndex = pdfPage.PageIndex;
+
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                 }
+
+                editPage.EndEdit();
+                SetImageThumb();
             }
         }
 
@@ -110,16 +129,16 @@ namespace ComPDFKit.Controls.Edit
 
         public void SetImageThumb()
         {
-            if (EditEvent != null)
+            if (EditEvents.Count == 1)
             {
                 try
                 {
-                    GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
+                    GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
 
                     string path = Path.GetTempPath();
                     string uuid = Guid.NewGuid().ToString("N");
                     string imagePath = Path.Combine(path, uuid + ".tmp");
-                    imageArea.ExtractImage(imagePath);
+                    imageAreas.FirstOrDefault().ExtractImage(imagePath);
 
                     Bitmap bitmapImage = new Bitmap(imagePath);
                     MemoryStream memoryStream = new MemoryStream();
@@ -144,31 +163,33 @@ namespace ComPDFKit.Controls.Edit
             OpacityTextBox.Text = string.Format("{0}%", (int)(Math.Round(ImasgeOpacitySlider.Value * 100)));
         }
 
-        public void SetPDFImageEditData(ImageEditParam newEvent)
+        public void SetPDFImageEditData(List<ImageEditParam> newEvents)
         {
-            if (newEvent.EditIndex < 0)
+
+            EditEvents = newEvents.Where(newEvent => newEvent.EditIndex >= 0 && newEvent.EditType == CPDFEditType.EditImage).ToList();
+
+            if (EditEvents.Count > 0)
             {
-                EditEvent = null;
+                SetImageTransparency(EditEvents.FirstOrDefault().Transparency);
             }
-            else
+
+            if (RotationTxb != null && EditEvents.Count > 0)
             {
-                EditEvent = newEvent;
+                GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+                RotationTxb.Text = imageAreas?.FirstOrDefault()?.GetRotation().ToString();
             }
-            if (newEvent != null && newEvent.EditType == CPDFEditType.EditImage)
+
+            if (EditEvents.Count == 1)
             {
-                SetImageTransparency(newEvent.Transparency);
+                OnlySingleVisible = Visibility.Visible;
+                SetImageThumb();
             }
-
-            if (RotationTxb != null && newEvent != null && newEvent.EditType == CPDFEditType.EditImage)
+            else
             {
-                GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-                RotationTxb.Text = imageArea?.GetRotation().ToString();
-                //RotationTxb.Text = newEvent.Rotate.ToString(CultureInfo.CurrentCulture);
+                OnlySingleVisible = Visibility.Collapsed;
             }
-
-            EditEvent = newEvent;
-            SetImageThumb();
         }
+
         #endregion
 
         //public void SetPDFImageMultiEditData(List<PDFEditEvent> editEvents)
@@ -213,36 +234,64 @@ namespace ComPDFKit.Controls.Edit
 
         private void FlipUI_FlipChanged(object sender, bool e)
         {
-            GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (imageArea != null)
+            GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if(ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                bool result = false;
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                bool result;
                 if (e)
                 {
-                    result = imageArea.VerticalMirror();
+                    result = imageAreas[0].VerticalMirror();
                 }
                 else
                 {
-                    result = imageArea.HorizontalMirror();
+                    result = imageAreas[0].HorizontalMirror();
                 }
+
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditImageArea imageArea in imageAreas)
+                {
+                    bool result;
+                    if (e)
                     {
-                        editHistory.PageIndex = pdfPage.PageIndex;
+                        result = imageArea.VerticalMirror();
+                    }
+                    else
+                    {
+                        result = imageArea.HorizontalMirror();
                     }
 
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
+                    if (result)
+                    {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
+                        editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
+                    }
                 }
 
-                SetImageThumb();
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
+            editPage.EndEdit();
+            if (imageAreas.Count == 1)
+                SetImageThumb();
+
             //if (EditMultiEvents != null)
             //{
             //    foreach (PDFEditEvent editEvent in EditMultiEvents)
@@ -262,28 +311,45 @@ namespace ComPDFKit.Controls.Edit
 
         private void RotateUI_RotationChanged(object sender, double e)
         {
-            GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (imageArea != null)
+            GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if(ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                if (imageArea.Rotate((int)e))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                if (imageAreas[0].Rotate((int)e))
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditImageArea imageArea in imageAreas)
+                {
+                    if (imageArea.Rotate((int)e))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    //SetRotationText(EditEvent.CurrentRotated);
-                    SetImageThumb();
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
-                    RotationTxb.Text = imageArea.GetRotation().ToString();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
+            editPage.EndEdit();
+            RotationTxb.Text = imageAreas.FirstOrDefault().GetRotation().ToString();
+            if (imageAreas.Count == 1)
+                SetImageThumb();
+
             //if (EditMultiEvents != null)
             //{
             //    foreach (PDFEditEvent editEvent in EditMultiEvents)
@@ -310,34 +376,44 @@ namespace ComPDFKit.Controls.Edit
             {
                 slider.Tag = "true";
             }
-            GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (imageArea != null)
+
+            GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                if (imageAreas[0].SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditImageArea imageArea in imageAreas)
+                {
+                    if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    SetImageThumb();
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            //if (EditMultiEvents != null)
-            //{
-            //    foreach (PDFEditEvent editEvent in EditMultiEvents)
-            //    {
-            //        editEvent.Transparency = (int)(ImageOpacitySlider.Value * 255);
-            //    }
-            //    PDFEditEvent.UpdatePDFEditList(EditMultiEvents);
-            //}
+            editPage.EndEdit();
+            if (imageAreas.Count == 1)
+                SetImageThumb();
         }
 
         private void SliderOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
@@ -352,25 +428,44 @@ namespace ComPDFKit.Controls.Edit
             {
                 return;
             }
-            GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (imageArea != null)
+
+            GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                if (imageAreas[0].SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditImageArea imageArea in imageAreas)
+                {
+                    if (imageArea.SetImageTransparency((byte)(ImasgeOpacitySlider.Value * 255)))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    SetImageThumb();
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
+
+            editPage.EndEdit();
+            if (imageAreas.Count == 1)
+                SetImageThumb();
         }
 
         private void ImageReplaceBtn_Click(object sender, RoutedEventArgs e)
@@ -380,39 +475,35 @@ namespace ComPDFKit.Controls.Edit
             //    return;
             //}
 
-            if (EditEvent != null)
+            if (EditEvents.Count > 0)
             {
                 OpenFileDialog openFileDialog = new OpenFileDialog();
                 openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
                 if (openFileDialog.ShowDialog() == true)
                 {
-                    GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-                    if (imageArea != null)
+                    GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+                    if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                        return;
+
+                    int imageWidth = 0;
+                    int imageHeight = 0;
+                    byte[] imageData = null;
+                    PDFHelp.ImagePathToByte(openFileDialog.FileName, ref imageData, ref imageWidth, ref imageHeight);
+                    if (imageData != null && imageWidth > 0 && imageHeight > 0)
                     {
-                        int imageWidth = 0;
-                        int imageHeight = 0;
-                        byte[] imageData = null;
-                        PDFHelp.ImagePathToByte(openFileDialog.FileName, ref imageData, ref imageWidth, ref imageHeight);
-
-                        if (imageData != null && imageWidth > 0 && imageHeight > 0)
+                        Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                        CRect imageRect = imageAreas[0].GetClipRect();
+                        if (imageAreas[0].ReplaceImageArea(imageRect, imageData, imageWidth, imageHeight))
                         {
-                            Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                            CRect imageRect = imageArea.GetClipRect();
-                            if (imageArea.ReplaceImageArea(imageRect, imageData, imageWidth, imageHeight))
-                            {
-                                PDFEditHistory editHistory = new PDFEditHistory();
-                                editHistory.EditPage = editPage;
-                                if (pdfPage != null)
-                                {
-                                    editHistory.PageIndex = pdfPage.PageIndex;
-                                }
-
-                                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                                SetImageThumb();
-                                ToolView.UpdateRender(oldRect, imageArea);
-                                editPage.EndEdit();
-                            }
+                            PDFEditHistory editHistory = new PDFEditHistory();
+                            editHistory.EditPage = editPage;
+                            editHistory.PageIndex = pdfPage.PageIndex;
+                            ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                            ToolView.UpdateRender(oldRect, imageAreas[0]);
                         }
+
+                        editPage.EndEdit();
+                        SetImageThumb();
                     }
                 }
             }
@@ -472,27 +563,29 @@ namespace ComPDFKit.Controls.Edit
             }
         }
 
-        private void GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage)
+        private void GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage)
         {
-            imageArea = null;
+            imageAreas = new List<CPDFEditImageArea>();
             editPage = null;
             pdfPage = null;
-            if (ToolView == null || EditEvent == null)
+            if (ToolView == null || EditEvents.Count == 0)
             {
                 return;
             }
-
             try
             {
-                CPDFViewer pdfViewer = ToolView.GetCPDFViewer();
-                CPDFDocument pdfDoc = pdfViewer.GetDocument();
-                pdfPage = pdfDoc.PageAtIndex(EditEvent.PageIndex);
-                editPage = pdfPage.GetEditPage();
-                List<CPDFEditArea> editAreas = editPage.GetEditAreaList();
-                if (editAreas != null && editAreas.Count > EditEvent.EditIndex)
+                foreach (var EditEvent in EditEvents)
                 {
-                    imageArea = editAreas[EditEvent.EditIndex] as CPDFEditImageArea;
-                }
+                    CPDFViewer pdfViewer = ToolView.GetCPDFViewer();
+                    CPDFDocument pdfDoc = pdfViewer.GetDocument();
+                    pdfPage = pdfDoc.PageAtIndex(EditEvent.PageIndex);
+                    editPage = pdfPage.GetEditPage();
+                    List<CPDFEditArea> editAreas = editPage.GetEditAreaList();
+                    if (editAreas != null && editAreas.Count > EditEvent.EditIndex)
+                    {
+                        imageAreas.Add(editAreas[EditEvent.EditIndex] as CPDFEditImageArea);
+                    }
+                } 
             }
             catch (Exception ex)
             {
@@ -502,26 +595,45 @@ namespace ComPDFKit.Controls.Edit
 
         private void SetAbsRotation(double absRotation)
         {
-            GetImageArea(out CPDFEditImageArea imageArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (imageArea != null)
+            GetImageArea(out List<CPDFEditImageArea> imageAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (imageAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                int rotation = (int)absRotation - imageArea.GetRotation();
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageArea.GetFrame());
-                if (imageArea.Rotate(rotation))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(imageAreas[0].GetFrame());
+                int rotation = (int)absRotation - imageAreas[0].GetRotation();
+                if (imageAreas[0].Rotate(rotation))
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, imageAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditImageArea imageArea in imageAreas)
+                {
+                    int rotation = (int)absRotation - imageArea.GetRotation();
+                    if (imageArea.Rotate(rotation))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    SetImageThumb();
-                    ToolView.UpdateRender(oldRect, imageArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
+
+            editPage.EndEdit();
+            if(imageAreas.Count == 1)
+                SetImageThumb();
         }
 
         private void RotationTxb_LostFocus(object sender, RoutedEventArgs e)
@@ -540,6 +652,21 @@ namespace ComPDFKit.Controls.Edit
                 RotationTxb_LostFocus(null, null);
             }
         }
-        #endregion 
+        #endregion
+
+        public event PropertyChangedEventHandler PropertyChanged;
+        protected bool UpdateProper<T>(ref T properValue,
+                                           T newValue,
+                                           [CallerMemberName] string properName = "")
+        {
+            if (object.Equals(properValue, newValue))
+                return false;
+
+            properValue = newValue;
+            OnPropertyChanged(properName);
+            return true;
+        }
+        protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
+    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
 }

+ 292 - 154
Demo/Examples/Compdfkit.Controls/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml.cs

@@ -5,7 +5,6 @@ using ComPDFKit.Tool;
 using ComPDFKit.Tool.SettingParam;
 using ComPDFKit.Tool.UndoManger;
 using ComPDFKit.Viewer.Helper;
-using ComPDFKit.Controls.PDFControl;
 using ComPDFKitViewer;
 using System;
 using System.Collections.Generic;
@@ -15,27 +14,26 @@ using System.Windows.Controls.Primitives;
 using System.Windows.Media;
 using System.ComponentModel;
 using System.Runtime.CompilerServices;
+using System.Linq;
+
 namespace ComPDFKit.Controls.Edit
 {
     public partial class PDFTextEditControl : UserControl, INotifyPropertyChanged
     {
         #region Property
         public CPDFViewerTool ToolView { get; private set; }
-        public TextEditParam EditEvent { get; set; }
+        public List<TextEditParam> EditEvents { get; set; }
 
 
         public event PropertyChangedEventHandler PropertyChanged;
 
-        private bool _isMultiSelected;
+        private bool _isMultiSelected = true;
         public bool IsMultiSelected
         {
             get => _isMultiSelected;
             set
             {
-                if (UpdateProper(ref _isMultiSelected, value))
-                {
-                    ToolView.GetCPDFViewer().UpdateRenderFrame();
-                }
+                UpdateProper(ref _isMultiSelected, value);
             }
         }
 
@@ -45,7 +43,7 @@ namespace ComPDFKit.Controls.Edit
             get => _showBorder;
             set
             {
-                UpdateProper(ref _showBorder, value); 
+                UpdateProper(ref _showBorder, value);
             }
         }
         #endregion 
@@ -66,23 +64,18 @@ namespace ComPDFKit.Controls.Edit
         #endregion
 
         #region UI
-        public void SetPDFTextEditData(TextEditParam newEvent)
+        public void SetPDFTextEditData(List<TextEditParam> newEvents)
         {
-            if (newEvent.EditIndex < 0)
-            {
-                EditEvent = null;
-            }
-            else
+            EditEvents = newEvents.Where(newEvent => newEvent.EditIndex >= 0 && newEvent.EditType == CPDFEditType.EditText).ToList();
+            TextEditParam defaultEvent = EditEvents.FirstOrDefault();
+            if (EditEvents.Count > 0)
             {
-                EditEvent = newEvent;
-            }
-            if (newEvent != null && newEvent.EditType == CPDFEditType.EditText)
-            {
-                GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
+                GetTextArea(out List<CPDFEditTextArea> textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
+
                 List<string> sysfontList = new List<string>();
                 if (textArea != null)
                 {
-                    sysfontList = textArea.GetFontList();
+                    sysfontList = textArea.FirstOrDefault().GetFontList();
                 }
                 if (sysfontList.Count == 0)
                 {
@@ -90,28 +83,26 @@ namespace ComPDFKit.Controls.Edit
                     sysfontList.Add("Courier New");
                     sysfontList.Add("Times New Roman");
                 }
-                if (sysfontList.Contains(newEvent.FontName) == false && string.IsNullOrEmpty(newEvent.FontName) == false)
+                if (sysfontList.Contains(defaultEvent.FontName) == false && string.IsNullOrEmpty(defaultEvent.FontName) == false)
                 {
-                    sysfontList.Add(newEvent.FontName);
+                    sysfontList.Add(defaultEvent.FontName);
                 }
 
                 TextStyleUI.SetFontNames(sysfontList);
-                TextStyleUI.SelectFontName(newEvent.FontName);
-                TextStyleUI.SetFontStyle(newEvent.IsBold, newEvent.IsItalic);
-                TextStyleUI.SetFontSize(newEvent.FontSize);
-                OpacityTextBox.Text = string.Format("{0}%", (int)(Math.Ceiling(newEvent.Transparency * 100 / 255D)));
-                FontOpacitySlider.Value = ((int)(Math.Ceiling(newEvent.Transparency * 100 / 255D))) / 100D;
-                TextAlignUI.SetFontAlign(newEvent.TextAlign);
-                if (newEvent.FontColor != null && newEvent.FontColor.Length == 3)
+                TextStyleUI.SelectFontName(defaultEvent.FontName);
+                TextStyleUI.SetFontStyle(defaultEvent.IsBold, defaultEvent.IsItalic);
+                TextStyleUI.SetFontSize(defaultEvent.FontSize);
+                OpacityTextBox.Text = string.Format("{0}%", (int)(Math.Ceiling(defaultEvent.Transparency * 100 / 255D)));
+                FontOpacitySlider.Value = ((int)(Math.Ceiling(defaultEvent.Transparency * 100 / 255D))) / 100D;
+                TextAlignUI.SetFontAlign(defaultEvent.TextAlign);
+                if (defaultEvent.FontColor != null && defaultEvent.FontColor.Length == 3)
                 {
                     FontColorUI.SetCheckedForColor(Color.FromRgb(
-                        newEvent.FontColor[0],
-                        newEvent.FontColor[1],
-                        newEvent.FontColor[2]));
+                        defaultEvent.FontColor[0],
+                        defaultEvent.FontColor[1],
+                        defaultEvent.FontColor[2]));
                 }
-
             }
-            EditEvent = newEvent;
         }
 
         //public void SetPDFTextMultiEditData(List<PDFEditEvent> editEvents)
@@ -158,12 +149,15 @@ namespace ComPDFKit.Controls.Edit
                 slider.Tag = "true";
             }
 
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -171,33 +165,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], (byte)(FontOpacitySlider.Value * 255), isBold, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], (byte)(FontOpacitySlider.Value * 255), isBold, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255));
+                    result = textAreas[0].SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255));
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255)))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.Transparency = (byte)(FontOpacitySlider.Value * 255);
+                EditEvents.FirstOrDefault().Transparency = (byte)(FontOpacitySlider.Value * 255);
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
         }
 
@@ -214,12 +222,15 @@ namespace ComPDFKit.Controls.Edit
                 return;
             }
 
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -227,34 +238,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], (byte)(FontOpacitySlider.Value * 255), isBold, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], (byte)(FontOpacitySlider.Value * 255), isBold, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255));
+                    result = textAreas[0].SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255));
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontTransparency((byte)(FontOpacitySlider.Value * 255)))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents?.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.Transparency = (byte)(FontOpacitySlider.Value * 255);
+                EditEvents.FirstOrDefault().Transparency = (byte)(FontOpacitySlider.Value * 255);
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
         }
 
@@ -296,12 +320,15 @@ namespace ComPDFKit.Controls.Edit
 
         private void TextStyleUI_TextSizeChanged(object sender, double e)
         {
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -309,33 +336,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, (float)e, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, (float)e, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontSize((float)e, true);
+                    result = textAreas[0].SetCharsFontSize((float)e, true);
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontSize((float)e, true))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.FontSize = e;
+                EditEvents.FirstOrDefault().FontSize = e;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
 
             //if (EditMultiEvents != null)
@@ -351,12 +392,15 @@ namespace ComPDFKit.Controls.Edit
         private void FontColorUI_ColorChanged(object sender, EventArgs e)
         {
             SolidColorBrush newBrush = FontColorUI.Brush as SolidColorBrush;
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null && newBrush != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -364,75 +408,116 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, fontSize, newBrush.Color.R, newBrush.Color.G, newBrush.Color.B, transparency, isBold, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, fontSize, newBrush.Color.R, newBrush.Color.G, newBrush.Color.B, transparency, isBold, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontColor(newBrush.Color.R, newBrush.Color.G, newBrush.Color.B);
+                    result = textAreas[0].SetCharsFontColor(newBrush.Color.R, newBrush.Color.G, newBrush.Color.B);
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontColor(newBrush.Color.R, newBrush.Color.G, newBrush.Color.B))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
 
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
+                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                    ToolView.GetCPDFViewer()?.UpdateRenderFrame();
                 }
             }
 
-            if (EditEvent != null && textArea == null && newBrush != null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && newBrush != null)
             {
                 byte[] Color = new byte[3];
                 Color[0] = newBrush.Color.R;
                 Color[1] = newBrush.Color.G;
                 Color[2] = newBrush.Color.B;
-                EditEvent.FontColor = Color;
+                EditEvents.FirstOrDefault().FontColor = Color;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
         }
 
         private void TextAlignUI_TextAlignChanged(object sender, TextAlignType e)
         {
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                bool result = false;
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
-                if (textArea.SelectLineRects != null && textArea.SelectLineRects.Count > 0)
+                bool result;
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (textAreas[0].SelectLineRects != null && textAreas[0].SelectLineRects.Count > 0)
                 {
-                    result = textArea.SetTextRangeAlign(e);
+                    result = textAreas[0].SetTextRangeAlign(e);
                 }
                 else
                 {
-                    result = textArea.SetTextAreaAlign(e);
+                    result = textAreas[0].SetTextAreaAlign(e);
                 }
+
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    bool result;
+                    if (textArea.SelectLineRects != null && textArea.SelectLineRects.Count > 0)
                     {
+                        result = textArea.SetTextRangeAlign(e);
+                    }
+                    else
+                    {
+                        result = textArea.SetTextAreaAlign(e);
+                    }
+
+                    if (result)
+                    {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.TextAlign = e;
+                EditEvents.FirstOrDefault().TextAlign = e;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
 
             //if (EditMultiEvents != null)
@@ -447,12 +532,15 @@ namespace ComPDFKit.Controls.Edit
 
         private void TextStyleUI_TextItalicChanged(object sender, bool e)
         {
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -460,34 +548,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, e);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, e);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontItalic(e);
+                    result = textAreas[0].SetCharsFontItalic(e);
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontItalic(e))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.IsItalic = e;
+                EditEvents.FirstOrDefault().IsItalic = e;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
 
             //if (EditMultiEvents != null)
@@ -502,12 +603,15 @@ namespace ComPDFKit.Controls.Edit
 
         private void TextStyleUI_TextBoldChanged(object sender, bool e)
         {
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -515,33 +619,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, e, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(fontName, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, e, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontBold(e);
+                    result = textAreas[0].SetCharsFontBold(e);
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontBold(e))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.IsBold = e;
+                EditEvents.FirstOrDefault().IsBold = e;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
 
             //if (EditMultiEvents != null)
@@ -556,12 +674,15 @@ namespace ComPDFKit.Controls.Edit
 
         private void TextStyleUI_TextFontChanged(object sender, string e)
         {
-            GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage);
-            if (textArea != null)
+            GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage);
+            if (textAreas.Count == 0 || pdfPage == null || editPage == null)
+                return;
+
+            if (ToolView.CurrentEditAreaObject() != null)
             {
-                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textArea.GetFrame());
                 bool result;
-                if (string.IsNullOrEmpty(textArea.SelectText))
+                Rect oldRect = DataConversionForWPF.CRectConversionForRect(textAreas[0].GetFrame());
+                if (string.IsNullOrEmpty(textAreas[0].SelectText))
                 {
                     string fontName = "Helvetica";
                     float fontSize = 14;
@@ -569,33 +690,47 @@ namespace ComPDFKit.Controls.Edit
                     byte transparency = 255;
                     bool isBold = false;
                     bool isItalic = false;
-                    textArea.GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
-                    result = textArea.SetCurTextStyle(e, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, isItalic);
+                    textAreas[0].GetTextStyle(ref fontName, ref fontSize, ref fontColor, ref transparency, ref isBold, ref isItalic);
+                    result = textAreas[0].SetCurTextStyle(e, fontSize, fontColor[0], fontColor[1], fontColor[2], transparency, isBold, isItalic);
                 }
                 else
                 {
-                    result = textArea.SetCharsFontName(e);
+                    result = textAreas[0].SetCharsFontName(e);
                 }
 
                 if (result)
                 {
                     PDFEditHistory editHistory = new PDFEditHistory();
                     editHistory.EditPage = editPage;
-                    if (pdfPage != null)
+                    editHistory.PageIndex = pdfPage.PageIndex;
+                    ToolView.GetCPDFViewer().UndoManager.AddHistory(editHistory);
+                    ToolView.UpdateRender(oldRect, textAreas[0]);
+                }
+            }
+            else
+            {
+                GroupHistory groupHistory = new GroupHistory();
+                foreach (CPDFEditTextArea textArea in textAreas)
+                {
+                    if (textArea.SetCharsFontName(e))
                     {
+                        PDFEditHistory editHistory = new PDFEditHistory();
+                        editHistory.EditPage = editPage;
                         editHistory.PageIndex = pdfPage.PageIndex;
+                        groupHistory.Histories.Add(editHistory);
                     }
-                    ToolView.GetCPDFViewer()?.UndoManager.AddHistory(editHistory);
-                    ToolView.UpdateRender(oldRect, textArea);
-                    editPage.EndEdit();
                 }
+
+                ToolView.GetCPDFViewer()?.UndoManager.AddHistory(groupHistory);
+                ToolView.GetCPDFViewer()?.UpdateRenderFrame();
             }
 
-            if (EditEvent != null && textArea == null)
+            editPage.EndEdit();
+            if (EditEvents.Count > 0 && textAreas.Count > 0)
             {
-                EditEvent.FontName = e;
+                EditEvents.FirstOrDefault().FontName = e;
                 DefaultSettingParam defaultSettingParam = ToolView.GetDefaultSettingParam();
-                defaultSettingParam.SetPDFEditParamm(EditEvent);
+                defaultSettingParam.SetPDFEditParamm(EditEvents.FirstOrDefault());
             }
 
             //if (EditMultiEvents != null)
@@ -624,27 +759,30 @@ namespace ComPDFKit.Controls.Edit
         #endregion
 
         #region Text Edit
-        private void GetTextArea(out CPDFEditTextArea textArea, out CPDFPage pdfPage, out CPDFEditPage editPage)
+        private void GetTextArea(out List<CPDFEditTextArea> textAreas, out CPDFPage pdfPage, out CPDFEditPage editPage)
         {
-            textArea = null;
+            textAreas = new List<CPDFEditTextArea>();
             editPage = null;
             pdfPage = null;
             if (ToolView == null)
             {
                 return;
             }
-            if (EditEvent != null)
+            if (EditEvents != null && EditEvents.Count>0 )
             {
                 try
                 {
                     CPDFViewer pdfViewer = ToolView.GetCPDFViewer();
                     CPDFDocument pdfDoc = pdfViewer.GetDocument();
-                    pdfPage = pdfDoc.PageAtIndex(EditEvent.PageIndex);
+                    pdfPage = pdfDoc.PageAtIndex(EditEvents.FirstOrDefault().PageIndex);
                     editPage = pdfPage.GetEditPage();
                     List<CPDFEditArea> editAreas = editPage.GetEditAreaList();
-                    if (editAreas != null && editAreas.Count > EditEvent.EditIndex)
+                    foreach (TextEditParam editEvent in EditEvents)
                     {
-                        textArea = editAreas[EditEvent.EditIndex] as CPDFEditTextArea;
+                        if (editAreas != null && editAreas.Count > editEvent.EditIndex)
+                        {
+                            textAreas.Add(editAreas[editEvent.EditIndex] as CPDFEditTextArea);
+                        }
                     }
                 }
                 catch (Exception ex)

+ 5 - 2
Demo/Examples/Compdfkit.Controls/PDFView/PDFViewControl/PDFViewControl.xaml.cs

@@ -122,6 +122,7 @@ namespace ComPDFKit.Controls.PDFControl
 
         private void PDFViewTool_DrawChanged(object sender, EventArgs e)
         {
+            FocusPDFViewToolChanged?.Invoke(this, EventArgs.Empty);
             DrawChanged?.Invoke(sender, e);
         }
 
@@ -199,7 +200,7 @@ namespace ComPDFKit.Controls.PDFControl
 
         private void PDFViewTool_SizeChanged(object sender, SizeChangedEventArgs e)
         {
-            PDFViewTool.GetCPDFViewer().UpdateRenderFrame();
+
         }
 
         private void SplitViewerTool_SizeChanged(object sender, SizeChangedEventArgs e)
@@ -208,11 +209,11 @@ namespace ComPDFKit.Controls.PDFControl
             {
                 splitWidthScale = VerticalView.ActualWidth / ViewToolGrid.ActualWidth;
             }
+
             if (HorizontalView.Visibility == Visibility.Visible)
             {
                 splitHeightScale = HorizontalView.ActualHeight / ViewToolGrid.ActualHeight;
             }
-            splitViewerTool.GetCPDFViewer().UpdateRenderFrame();
         }
 
         public void InitDocument(string Path)
@@ -225,6 +226,8 @@ namespace ComPDFKit.Controls.PDFControl
                 PDFViewTool.GetCPDFViewer().SetFitMode(FitMode.FitHeight);
                 PDFViewTool.GetCPDFViewer().SetViewMode(ViewMode.SingleContinuous);
 
+                PDFViewTool.SetIsMultiSelected(true);
+
                 splitViewerTool.GetCPDFViewer().InitDoc(pdfDoc);
 
                 splitViewerTool.GetCPDFViewer().SetFitMode(FitMode.FitHeight);

+ 6 - 7
Demo/Examples/Compdfkit.Controls/Printer/PrintHelper.cs

@@ -174,11 +174,11 @@ namespace ComPDFKit.Controls.Printer
                     {
                         for (int x = 0; x < w; x++)
                         {
-                            if (mode == 0) // 加权平均
+                            if (mode == 0) 
                             {
                                 newColor = (byte)((float)p[0] * 0.114f + (float)p[1] * 0.587f + (float)p[2] * 0.299f);
                             }
-                            else    // 算数平均
+                            else   
                             {
                                 newColor = (byte)((float)(p[0] + p[1] + p[2]) / 3.0f);
                             }
@@ -286,7 +286,7 @@ namespace ComPDFKit.Controls.Printer
 
                     byte[] bmpData = new byte[(int)(pageSize.Width * pageSize.Height * 4)];
 
-                    page.RenderPageBitmap(0, 0, pageSize.Width, pageSize.Height, 0xFFFFFFFF, bmpData, printSettingsInfo.IsPrinAnnot ? 1 : 0, printSettingsInfo.IsPrintForm);
+                    page.RenderPageBitmap(0, 0, pageSize.Width, pageSize.Height, 0xFFFFFFFF, bmpData, printSettingsInfo.IsPrintAnnot ? 1 : 0, printSettingsInfo.IsPrintForm);
                     Bitmap bitmap = BuildBmp((int)pageSize.Width, (int)pageSize.Height, bmpData);
 
                     if (printSettingsInfo.IsGrayscale)
@@ -406,7 +406,7 @@ namespace ComPDFKit.Controls.Printer
                             e.HasMorePages = false;
                             if (PrintIndex % 2 == 0)
                             {
-
+                                //
                             }
                         }
                     }
@@ -435,11 +435,10 @@ namespace ComPDFKit.Controls.Printer
                     break;
                 case PosterModeInfo _:
                     break;
-                case MultipleModeInfo _:
+                case MultipleModeInfo _: 
 
                     break;
-                case BookletModeInfo _:
-
+                case BookletModeInfo _: 
                     break;
             }
         }

+ 1 - 1
Demo/Examples/Compdfkit.Controls/Printer/PrintPreviewControl.xaml.cs

@@ -288,7 +288,7 @@ namespace ComPDFKit.Controls.PDFControl
 
             if (page != null)
             {
-                page.RenderPageBitmapWithMatrix((float)1, pageRect, 0xFFFFFFFF, bmpData, printSettingsInfo.IsPrinAnnot?1:0, printSettingsInfo.IsPrintForm);
+                page.RenderPageBitmapWithMatrix((float)1, pageRect, 0xFFFFFFFF, bmpData, printSettingsInfo.IsPrintAnnot?1:0, printSettingsInfo.IsPrintForm);
                 Point startPoint = new Point(0, 0);
 
                 Bitmap bitmap = PrintHelper.BuildBmp((int)pageRect.width(), (int)pageRect.height(), bmpData);

+ 2 - 2
Demo/Examples/Compdfkit.Controls/Printer/PrinterDialog.xaml

@@ -195,10 +195,10 @@
                 <CheckBox Name="chkDuplex" Margin="0,8,0,8" Tag="" Click="chkDuplex_Click">
                     <TextBlock Text="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=Printer_Duplex}"></TextBlock>
                 </CheckBox>
-                <RadioButton GroupName="Flip" Tag="" x:Name="rdoLongEdge" IsChecked="True" IsEnabled="{Binding IsChecked, ElementName=chkDuplex, Converter={StaticResource BoolToVisibleConverter}}" Margin="0,0,0,8" Click="rdoDuplex_Click" >
+                <RadioButton GroupName="Flip" x:Name="rdoLongEdge" Tag="LongEdge" IsChecked="True" IsEnabled="{Binding IsChecked, ElementName=chkDuplex, Converter={StaticResource BoolToVisibleConverter}}" Margin="0,0,0,8" Click="rdoDuplex_Click" >
                     <TextBlock Text="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=Printer_LongEdge}"></TextBlock>
                 </RadioButton>
-                <RadioButton GroupName="Flip" x:Name="rdoShortEdge" Click="rdoDuplex_Click" IsEnabled="{Binding IsChecked, ElementName=chkDuplex, Converter={StaticResource BoolToVisibleConverter}}">
+                <RadioButton GroupName="Flip" x:Name="rdoShortEdge" Tag="ShortEdge" Click="rdoDuplex_Click" IsEnabled="{Binding IsChecked, ElementName=chkDuplex, Converter={StaticResource BoolToVisibleConverter}}">
                     <TextBlock Text="{Binding Converter={StaticResource CommonResourceConverter},ConverterParameter=Printer_ShortEdge}"></TextBlock>
                 </RadioButton>
             </StackPanel>

+ 4 - 4
Demo/Examples/Compdfkit.Controls/Printer/PrinterDialog.xaml.cs

@@ -138,7 +138,7 @@ namespace ComPDFKit.Controls.PDFControl
             printSettingsInfo.PrintOrientation = PrintOrientation.Portrait;
             printSettingsInfo.PaperSize = printerSettings.PaperSizes[cmbPaper.SelectedIndex];
 
-            printSettingsInfo.IsPrinAnnot = true;
+            printSettingsInfo.IsPrintAnnot = true;
             printSettingsInfo.IsPrintForm = true;
             printSettingsInfo.IsReverseOrder = false;
             printSettingsInfo.IsGrayscale = false;
@@ -206,15 +206,15 @@ namespace ComPDFKit.Controls.PDFControl
             switch (tag)
             {
                 case "Document":
-                    printSettingsInfo.IsPrinAnnot = false;
+                    printSettingsInfo.IsPrintAnnot = false;
                     printSettingsInfo.IsPrintForm = false;
                     break;
                 case "Document and Markups":
-                    printSettingsInfo.IsPrinAnnot = true;
+                    printSettingsInfo.IsPrintAnnot = true;
                     printSettingsInfo.IsPrintForm = true;
                     break;
                 case "Document and Stamps":
-                    printSettingsInfo.IsPrinAnnot = true;
+                    printSettingsInfo.IsPrintAnnot = true;
                     printSettingsInfo.IsPrintForm = false;
                     break;
             }

+ 1 - 1
Demo/Examples/Compdfkit.Controls/Printer/PrinterModel.cs

@@ -92,7 +92,7 @@ namespace ComPDFKit.Controls
         public bool NeedRerendering { get; set; } = true;
         public bool IsPaperSizeChanged { get; set; } = false;
         public bool NeedReversePage { get; set; } = false;
-        public bool IsPrinAnnot { get; set; } = true;
+        public bool IsPrintAnnot { get; set; } = true;
         public bool IsPrintForm { get; set; } = true;
 
         public int Copies { get; set; } = 1;

+ 2 - 2
Demo/Examples/Compdfkit.Controls/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 1 - 1
Demo/Examples/Compdfkit.Controls/Strings/Bota.resx

@@ -262,7 +262,7 @@
     <value>Delete all annotations</value>
   </data>
   <data name="Menu_DelAllReply" xml:space="preserve">
-    <value>Delete a replies</value>
+    <value>Delete all replies</value>
   </data>
   <data name="Menu_DelAnnot" xml:space="preserve">
     <value>Delete annotation</value>

+ 0 - 1
Demo/Examples/ContentEditor/MainWindow.xaml.cs

@@ -267,7 +267,6 @@ namespace ContentEditorViewControl
         private void LeftToolPanelButton_Click(object sender, RoutedEventArgs e)
         {
             panelState.IsLeftPanelExpand = (sender as ToggleButton).IsChecked == true;
-            contentEditControl.PdfViewControl.GetCPDFViewer().GoToPage(pageIndex: 1, new Point(100, 100));
         }
 
         private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

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

@@ -22,5 +22,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -20,5 +20,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -6,23 +6,19 @@ using System.Windows;
 
 [assembly: AssemblyTitle("Document Editor_ComPDFKit")]
 [assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("PDF Technologies, Inc.")]
+[assembly: AssemblyConfiguration("")][assembly: AssemblyCompany("PDF Technologies, Inc.")]
 [assembly: AssemblyProduct("Document Editor_ComPDFKit")]
 [assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
-
 [assembly: ComVisible(false)]
 
 //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
 
-
 [assembly: ThemeInfo(
     ResourceDictionaryLocation.None,                         
     ResourceDictionaryLocation.SourceAssembly         
 )]
 
-
-[assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Measure/Properties/AssemblyInfo.cs

@@ -20,5 +20,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly                                        
 )]
 
-[assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -24,5 +24,5 @@ using System.Windows;
     ResourceDictionaryLocation.SourceAssembly 
 )]
 
-[assembly: AssemblyVersion("2.0.0.0")]
-[assembly: AssemblyFileVersion("2.0.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -1,8 +1,7 @@
-#if NET451_OR_GREATER
-
-using System.Reflection;
+using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+
 // General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
@@ -10,7 +9,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("PDF Technologies, Inc.")]
-[assembly: AssemblyProduct("BatesTest")]
+[assembly: AssemblyProduct("AnnotationImportExportTest")]
 [assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
@@ -21,7 +20,7 @@ using System.Runtime.InteropServices;
 [assembly: ComVisible(false)]
 
 // The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("9A19103F-16F7-4668-BE54-9A1E7A4F7556")]
+[assembly: Guid("e2693237-d8f2-4e1c-b3c3-0b3acfb73728")]
 
 // Version information for an assembly consists of the following four values:
 //
@@ -33,6 +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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
-#endif
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -15,5 +15,5 @@ using System.Runtime.InteropServices;
 
 [assembly: Guid("7372311c-7a31-4d97-a2c0-fc005fc345c1")]
 
-[assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 '查看程序集特性的值
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("DocumentCompareTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("DocumentCompareTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 '通过使用 "*",如下所示:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("2.1.0.0")>
+<Assembly: AssemblyFileVersion("2.1.0.0")>

+ 2 - 2
Demo/Examples/Samples/DocumentInfoTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/EncryptTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/FlattenTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/HeaderFooterTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/ImageExtractTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/InteractiveFormsTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/OutlineTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/PDFATest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/PDFPageTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

+ 2 - 2
Demo/Examples/Samples/PDFRedactTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]

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

@@ -8,11 +8,11 @@ Imports System.Runtime.InteropServices
 
 '查看程序集特性的值
 
-<Assembly: AssemblyTitle("VB")>
+<Assembly: AssemblyTitle("PDFToImageTest")>
 <Assembly: AssemblyDescription("")>
-<Assembly: AssemblyCompany("")>
-<Assembly: AssemblyProduct("VB")>
-<Assembly: AssemblyCopyright("Copyright ©  2023")>
+<Assembly: AssemblyCompany("PDF Technologies, Inc.")>
+<Assembly: AssemblyProduct("PDFToImageTest")>
+<Assembly: AssemblyCopyright("Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.")>
 <Assembly: AssemblyTrademark("")>
 
 <Assembly: ComVisible(False)>
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
 '通过使用 "*",如下所示:
 ' <Assembly: AssemblyVersion("1.0.*")>
 
-<Assembly: AssemblyVersion("1.0.0.0")>
-<Assembly: AssemblyFileVersion("1.0.0.0")>
+<Assembly: AssemblyVersion("2.1.0.0")>
+<Assembly: AssemblyFileVersion("2.1.0.0")>

+ 2 - 2
Demo/Examples/Samples/TextExtractTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.0.0.0")]
+[assembly: AssemblyFileVersion("2.0.0.0")]

+ 2 - 2
Demo/Examples/Samples/TextSearchTest/CS/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.0.0.0")]
+[assembly: AssemblyFileVersion("2.0.0.0")]

+ 1 - 1
Demo/Examples/Samples/WatermarkTest/CS/Properties/AssemblyInfo.cs

@@ -33,4 +33,4 @@ using System.Runtime.InteropServices;
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("1.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyFileVersion("1.13.0.0")]

+ 2 - 2
Demo/Examples/Viewer/Properties/AssemblyInfo.cs

@@ -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.13.0.0")]
-[assembly: AssemblyFileVersion("1.13.0.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]