Browse Source

compdfkit demo windows - 增加文字编辑和图片编辑

liyuxuan 1 year ago
parent
commit
34fed925f7
22 changed files with 1425 additions and 8 deletions
  1. 139 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml
  2. 215 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs
  3. 24 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageFlipUI.xaml
  4. 51 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageFlipUI.xaml.cs
  5. 23 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageRotateUI.xaml
  6. 51 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageRotateUI.xaml.cs
  7. 93 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml
  8. 168 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml.cs
  9. 62 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextAlignUI.xaml
  10. 103 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextAlignUI.xaml.cs
  11. 28 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextStyleUI.xaml
  12. 120 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextStyleUI.xaml.cs
  13. 42 0
      compdfkit_demo_windows/compdfkit/compdfkit-tools/compdfkit-tools.csproj
  14. 55 4
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/App.xaml.cs
  15. BIN
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/ComPDFKit.Desk.dll
  16. BIN
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/ComPDFKit.Viewer.dll
  17. 55 2
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/MainWindow.xaml
  18. 167 2
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/MainWindow.xaml.cs
  19. BIN
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/PDFA/sRGB2014.icc
  20. 29 0
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/edit-ctrl-demo.csproj
  21. BIN
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/x64/ComPDFKit.dll
  22. BIN
      compdfkit_demo_windows/compdfkit/edit-ctrl-demo/x86/ComPDFKit.dll

+ 139 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml

@@ -0,0 +1,139 @@
+<UserControl x:Class="compdfkit_tools.Edit.PDFImageEditControl"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             xmlns:common="clr-namespace:compdfkit_tools.Common"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800" MinWidth="250" Padding="10">
+    <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>
+            <RowDefinition Height="auto"></RowDefinition>
+            <RowDefinition Height="auto"></RowDefinition>
+        </Grid.RowDefinitions>
+
+        <TextBlock FontSize="20" FontWeight="Bold" HorizontalAlignment="Center">图片属性</TextBlock>
+
+        <Border Background="LightGray" Grid.Row="1" MinHeight="100" CornerRadius="5" Margin="0,10,0,0">
+            <Image Name="ImageThumbUI" MaxHeight="100" MaxWidth="230"></Image>
+        </Border>
+        
+        <!--图片旋转-->
+        <local:CPDFImageRotateUI x:Name="RotateUI" Grid.Row="2" FontSize="16" Margin="0,10,0,0"></local:CPDFImageRotateUI>
+        
+        <!--图片翻转-->
+        <local:CPDFImageFlipUI x:Name="FlipUI" Grid.Row="3" FontSize="16" Margin="0,10,0,0"></local:CPDFImageFlipUI>
+        
+        <!--透明度-->
+        <Grid Grid.Row="4" Margin="0,20,0,0">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"></RowDefinition>
+                <RowDefinition Height="auto"></RowDefinition>
+            </Grid.RowDefinitions>
+
+            <TextBlock FontSize="16">透明度:</TextBlock>
+            
+            <StackPanel Grid.Row="1" Orientation="Horizontal">
+                <Slider Width="150"
+                    Name="ImageOpacitySlider" 
+                    Value="1"  
+                    IsSelectionRangeEnabled="True" 
+                    IsMoveToPointEnabled="True" 
+                    Margin="2,5,10,0"  
+                    Maximum="1" 
+                    Minimum="0" 
+                    TickFrequency="0.01"
+                    IsSnapToTickEnabled="True" 
+                    Thumb.DragCompleted="SliderOpacity_DragCompleted"
+                    Thumb.DragStarted="Slider_DragStarted"
+                    ValueChanged="SliderOpacity_ValueChanged"
+                    Tag="true"
+                    />
+                <TextBox Name="ImageOpacityBox" Grid.Column="1" Margin="0,5,0,0" Height="20" Width="50" 
+                         VerticalContentAlignment="Center" HorizontalContentAlignment="Center" 
+                         IsReadOnly="True">100%</TextBox>
+            </StackPanel>
+        </Grid>
+       
+        
+        <!--图片替换-->
+        <Grid Grid.Row="5" Margin="0,20,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <TextBlock VerticalAlignment="Center" FontSize="16">图片替换:</TextBlock>
+            <Button Grid.Column="1" Width="40" Height="25" BorderThickness="0" Click="ImageReplaceBtn_Click">
+                <Button.Content>
+                    <Path Fill="Gray">
+                        <Path.Data>
+                            M0.75 3.25C0.75 1.73122 1.98122 0.5 3.5 0.5H18.5C20.0188 0.5 21.25 1.73122 21.25 3.25V14.7511C21.25 16.2699 20.0188 17.5011 18.5 
+                                17.5011H3.5C1.98122 17.5011 0.75 16.2699 0.75 14.7511V3.25ZM3.5 2C2.80964 2 2.25 2.55964 2.25 3.25V9.80764L4.62588 7.18104C5.29052 
+                                6.44627 6.43205 6.40929 7.14284 7.09952L10.8426 10.6922C10.9226 10.7699 11.0443 10.7852 11.141 10.7298L14.8017 8.63369C15.3394 8.32578 
+                                15.9999 8.32519 16.5382 8.63215L19.75 10.4637V3.25C19.75 2.55964 19.1904 2 18.5 2H3.5ZM19.75 12.1905L15.7951 9.93517C15.7182 9.89132 
+                                15.6239 9.8914 15.547 9.93539L11.8864 12.0315C11.2093 12.4192 10.3574 12.3119 9.79764 11.7683L6.09787 8.17563C5.99633 8.07703 5.83325 
+                                8.08231 5.7383 8.18728L2.25 12.0437V14.7511C2.25 15.4415 2.80964 16.0011 3.5 16.0011H18.5C19.1904 16.0011 19.75 15.4415 19.75 
+                                14.7511V12.1905ZM17.2732 5.63378C17.2732 6.45448 16.6016 7.11979 15.7732 7.11979C14.9448 7.11979 14.2732 6.45448 14.2732 5.63378C14.2732 
+                                4.81308 14.9448 4.14777 15.7732 4.14777C16.6016 4.14777 17.2732 4.81308 17.2732 5.63378Z
+                        </Path.Data>
+                    </Path>
+                </Button.Content>
+            </Button>
+        </Grid>
+       
+        <!--图片导出-->
+        <Grid Grid.Row="6"  Margin="0,10,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <TextBlock VerticalAlignment="Center" FontSize="16">图片导出:</TextBlock>
+            <Button Grid.Column="1" Width="40" Height="25" BorderThickness="0" Click="ImageExportBtn_Click">
+                <Button.Content>
+                    <Viewbox>
+                        <Path Fill="Gray">
+                            <Path.Data>
+                                M903.872912 0H120.127088A120.127088 120.127088 0 0 0 0 120.127088v783.745824a120.127088 120.127088 0 0 0 120.127088 120.127088h783.745824a120.127088
+                            120.127088 0 0 0 120.127088-120.127088V120.127088A120.127088 120.127088 0 0 0 903.872912 0zM353.707536 278.628106l135.977189-135.97719a31.283096
+                            31.283096 0 0 1 44.213442 0l135.977189 135.97719A31.283096 31.283096 0 1 1 625.661914 322.841548l-83.421588-83.421589V717.425662a31.283096 31.283096
+                            0 0 1-62.566192 0V240.254175l-83.421588 83.421589a31.283096 31.283096 0 0 1-42.54501-45.047658zM871.755601 803.349898a87.17556 87.17556 0 0 1-87.17556
+                            87.17556H239.419959a87.17556 87.17556 0 0 1-87.17556-87.17556v-158.08391a31.283096 31.283096 0 0 1 62.566192 0v158.08391a24.609369 24.609369 0 0 0 24.609368
+                            24.609369h545.160082a24.609369 24.609369 0 0 0 24.609368-24.609369v-162.25499a31.283096 31.283096 0 0 1 62.566192 0z
+                            </Path.Data>
+                        </Path>
+                    </Viewbox>
+                </Button.Content>
+            </Button>
+        </Grid>
+        
+        <!--图片裁剪-->
+        <Grid Grid.Row="7"  Margin="0,10,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <TextBlock VerticalAlignment="Center" FontSize="16">图片裁剪:</TextBlock>
+            <Button Grid.Column="1" Width="40" Height="25" BorderThickness="0" Click="ImageClipBtn_Click">
+                <Button.Content>
+                    <Path Fill="Gray">
+                        <Path.Data>
+                            M5.00786 2.39823C4.9582 2.03215 4.6444 1.75 4.26471 1.75C3.85049 1.75 3.51471 2.08579 3.51471 2.5V3.51471H2.5L2.39823 3.52155C2.03215 3.57121 
+                                1.75 3.88501 1.75 4.26471L1.75685 4.36648C1.80651 4.73255 2.1203 5.01471 2.5 5.01471L3.51471 5.01465V15.7353L3.52155 15.8371C3.57121 16.2031 
+                                3.88501 16.4853 4.26471 16.4853H14.9853L14.9853 17.5L14.9921 17.6018C15.0418 17.9678 15.3556 18.25 15.7353 18.25C16.1495 18.25 16.4853 17.9142 
+                                16.4853 17.5V16.4853H17.5L17.6018 16.4784C17.9678 16.4288 18.25 16.115 18.25 15.7353L18.2432 15.6335C18.1935 15.2674 17.8797 14.9853 17.5 
+                                14.9853L16.4853 14.9853V4.26471L16.4784 4.16294C16.4288 3.79686 16.115 3.51471 15.7353 3.51471H5.01465L5.01471 2.5L5.00786 2.39823ZM5.01456 
+                                5.01456L5.014 14.985L14.9852 14.9852L14.985 5.014L5.01456 5.01456Z
+                        </Path.Data>
+                    </Path>
+                </Button.Content>
+            </Button>
+        </Grid>
+    </Grid>
+</UserControl>

+ 215 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageEditControl/PDFImageEditControl.xaml.cs

@@ -0,0 +1,215 @@
+using ComPDFKitViewer.PdfViewer;
+using ComPDFKitViewer;
+using System;
+using System.Collections.Generic;
+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;
+using ComPDFKit.PDFPage;
+using System.Windows.Controls.Primitives;
+using Microsoft.Win32;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+
+namespace compdfkit_tools.Edit
+{
+    public partial class PDFImageEditControl : UserControl
+    {
+        public CPDFViewer PDFView { get; private set; }
+        public PDFEditEvent EditEvent { get; set; }
+
+        public PDFImageEditControl()
+        {
+            InitializeComponent();
+            Loaded += PDFImageEditControl_Loaded;
+        }
+
+        public void InitWithPDFViewer(CPDFViewer newPDFView)
+        {
+            PDFView = newPDFView;
+        }
+
+        public void SetPDFImageEditData(PDFEditEvent newEvent)
+        {
+            if (newEvent != null && newEvent.EditType == CPDFEditType.EditImage)
+            {
+                ImageOpacitySlider.Value = newEvent.Transparency / 255D;
+                ImageOpacityBox.Text = string.Format("{0}%", (int)(ImageOpacitySlider.Value * 100));
+                if(PDFView!=null)
+                {
+                    try
+                    {
+                        Dictionary<int, List<System.Drawing.Bitmap>> imageDict = PDFView.GetSelectedImages();
+                        foreach (int pageIndex in imageDict.Keys)
+                        {
+                            List<System.Drawing.Bitmap> imageList = imageDict[pageIndex];
+                            if(imageList.Count > 0)
+                            {
+                                Bitmap bitmapImage= imageList[0];
+                                MemoryStream memoryStream = new MemoryStream();
+
+                                bitmapImage.Save(memoryStream, bitmapImage.RawFormat);
+                                BitmapImage imageShow = new BitmapImage();
+                                imageShow.BeginInit();
+                                imageShow.StreamSource = memoryStream;
+                                imageShow.EndInit();
+                                ImageThumbUI.Source = imageShow;
+                                break;
+                            }
+                        }
+                      
+                    }
+                    catch (Exception ex)
+                    {
+
+                    }
+                }
+                
+            }
+            EditEvent = newEvent;
+        }
+
+        private void PDFImageEditControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            RotateUI.RotationChanged += RotateUI_RotationChanged;
+            FlipUI.FlipChanged += FlipUI_FlipChanged;
+        }
+
+        private void FlipUI_FlipChanged(object sender, bool e)
+        {
+            if (EditEvent != null)
+            {
+                if(e)
+                {
+                    EditEvent.VerticalMirror = true;
+                }
+                else
+                {
+                    EditEvent.HorizontalMirror = true;
+                }
+              
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void RotateUI_RotationChanged(object sender, double e)
+        {
+            if (EditEvent != null)
+            {
+                EditEvent.Rotate = (int)e;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void Slider_DragStarted(object sender, DragStartedEventArgs e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null)
+            {
+                slider.Tag = "false";
+            }
+        }
+
+        private void SliderOpacity_DragCompleted(object sender, DragCompletedEventArgs e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null)
+            {
+                slider.Tag = "true";
+            }
+            if (EditEvent != null)
+            {
+                EditEvent.Transparency = (int)(ImageOpacitySlider.Value * 255);
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void SliderOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+        {
+            Slider slider = sender as Slider;
+            if(ImageOpacityBox!=null)
+            {
+                ImageOpacityBox.Text = string.Format("{0}%", (int)(ImageOpacitySlider.Value * 100));
+            }
+          
+            if (slider != null && slider.Tag != null && slider.Tag.ToString() == "false")
+            {
+                return;
+            }
+
+            if (EditEvent != null)
+            {
+                EditEvent.Transparency = (int)(ImageOpacitySlider.Value * 255);
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void ImageReplaceBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (EditEvent != null)
+            {
+                OpenFileDialog openFileDialog = new OpenFileDialog();
+                openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
+                if (openFileDialog.ShowDialog() == true)
+                {
+                    EditEvent.ReplaceImagePath = openFileDialog.FileName;
+                    EditEvent.UpdatePDFEditByEventArgs();
+                }
+            }
+        }
+
+        private void ImageExportBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (PDFView != null)
+            {
+                Dictionary<int, List<System.Drawing.Bitmap>> imageDict = PDFView.GetSelectedImages();
+                if (imageDict != null && imageDict.Count > 0)
+                {
+                    System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
+                    if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+                    {
+                        string choosePath = folderBrowser.SelectedPath;
+                        string openPath = choosePath;
+                        try
+                        {
+                            foreach (int pageIndex in imageDict.Keys)
+                            {
+                                List<System.Drawing.Bitmap> imageList = imageDict[pageIndex];
+                                foreach (System.Drawing.Bitmap image in imageList)
+                                {
+                                    string savePath = System.IO.Path.Combine(choosePath, Guid.NewGuid() + ".jpg");
+                                    image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
+                                    openPath = savePath;
+                                }
+                            }
+                            Process.Start("explorer", "/select,\"" + openPath + "\"");
+                        }
+                        catch (Exception ex)
+                        {
+
+                        }
+                    }
+                }
+            }
+        }
+
+        private void ImageClipBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (EditEvent != null)
+            {
+                EditEvent.ClipImage = true;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+    }
+}

+ 24 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageFlipUI.xaml

@@ -0,0 +1,24 @@
+<UserControl x:Class="compdfkit_tools.Edit.CPDFImageFlipUI"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             mc:Ignorable="d" 
+             d:DesignHeight="150" d:DesignWidth="300">
+    <StackPanel Name="ImageFlipUI">
+        <Grid>
+            <TextBlock VerticalAlignment="Center"  Margin="0,10,10,0">变换形状:</TextBlock>
+        </Grid>
+
+        <Grid Margin="0,10,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <Button Margin="0,0,10,0" Padding="0,5,0,5" BorderThickness="0" Click="FlipHorizontal_Click">水平镜像</Button>
+            <Button Grid.Column="1" Margin="10,0,0,0" Padding="0,5,0,5" BorderThickness="0" Click="FlipVertical_Click">垂直镜像</Button>
+        </Grid>
+    </StackPanel>
+    
+</UserControl>

+ 51 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageFlipUI.xaml.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+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_tools.Edit
+{
+    /// <summary>
+    /// CPDFImageFlipUI.xaml 的交互逻辑
+    /// </summary>
+    public partial class CPDFImageFlipUI : UserControl
+    {
+        public event EventHandler<bool> FlipChanged;
+        public CPDFImageFlipUI()
+        {
+            InitializeComponent();
+        }
+
+        public Orientation Orientation
+        {
+            get
+            {
+                return ImageFlipUI.Orientation;
+            }
+            set
+            {
+                ImageFlipUI.Orientation = value;
+            }
+        }
+
+        private void FlipVertical_Click(object sender, RoutedEventArgs e)
+        {
+            FlipChanged?.Invoke(this, true);
+        }
+
+        private void FlipHorizontal_Click(object sender, RoutedEventArgs e)
+        {
+            FlipChanged?.Invoke(this, false);
+        }
+    }
+}

+ 23 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageRotateUI.xaml

@@ -0,0 +1,23 @@
+<UserControl x:Class="compdfkit_tools.Edit.CPDFImageRotateUI"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             mc:Ignorable="d" 
+             d:DesignHeight="150" d:DesignWidth="300">
+    <StackPanel Name="ImageRotateUI">
+        <Grid>
+            <TextBlock VerticalAlignment="Center"  Margin="0,10,10,0">旋转:</TextBlock>
+        </Grid>
+
+        <Grid Margin="0,10,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <Button Margin="0,0,10,0" Padding="0,5,0,5" BorderThickness="0" Click="RotateLeftBtn_Click">左旋转</Button>
+            <Button Grid.Column="1" Margin="10,0,0,0" Padding="0,5,0,5" BorderThickness="0" Click="RotateRightBtn_Click">右旋转</Button>
+        </Grid>
+    </StackPanel>
+</UserControl>

+ 51 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFImageEdit/PDFImageUI/CPDFImageRotateUI.xaml.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+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_tools.Edit
+{
+    /// <summary>
+    /// CPDFImageRotateUI.xaml 的交互逻辑
+    /// </summary>
+    public partial class CPDFImageRotateUI : UserControl
+    {
+        public event EventHandler<double> RotationChanged;
+        public CPDFImageRotateUI()
+        {
+            InitializeComponent();
+        }
+
+        public Orientation Orientation
+        {
+            get
+            {
+                return ImageRotateUI.Orientation;
+            }
+            set
+            {
+                ImageRotateUI.Orientation = value;
+            }
+        }
+
+        private void RotateLeftBtn_Click(object sender, RoutedEventArgs e)
+        {
+            RotationChanged?.Invoke(this, -90);
+        }
+
+        private void RotateRightBtn_Click(object sender, RoutedEventArgs e)
+        {
+            RotationChanged?.Invoke(this, 90);
+        }
+    }
+}

+ 93 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml

@@ -0,0 +1,93 @@
+<UserControl x:Class="compdfkit_tools.Edit.PDFTextEditControl"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             xmlns:common="clr-namespace:compdfkit_tools.Common"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800" MinWidth="250" Padding="10">
+    <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>
+            <RowDefinition Height="auto"></RowDefinition>
+        </Grid.RowDefinitions>
+        
+        <TextBlock FontSize="20" FontWeight="Bold" HorizontalAlignment="Center">文本属性</TextBlock>
+        
+        <TextBlock Grid.Row="1" FontSize="16" Margin="0,20,0,0">字体颜色:</TextBlock>
+        
+        <common:ColorPickerControl x:Name="FontColorUI" Grid.Row="2" Margin="0,20,0,0"></common:ColorPickerControl>
+
+        <local:CPDFTextStyleUI x:Name="TextStyleUI" Grid.Row="3" FontSize="16" Margin="0,20,0,0" Orientation="Horizontal"></local:CPDFTextStyleUI>
+
+        <local:CPDFTextAlignUI x:Name="TextAlignUI" Grid.Row="4" FontSize="16" Margin="0,20,0,0" Orientation="Horizontal"></local:CPDFTextAlignUI>
+
+        <Grid Grid.Row="5" Margin="0,20,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"></RowDefinition>
+                <RowDefinition Height="auto"></RowDefinition>
+            </Grid.RowDefinitions>
+            <TextBlock FontSize="16">字号:</TextBlock>
+            <TextBox Grid.Column="1" BorderThickness="0,0,0,1" Width="50" HorizontalContentAlignment="Center" 
+                     Text="{Binding ElementName=FontSizeSlider,Path=Value,StringFormat=N0}" IsReadOnly="True"></TextBox>
+            
+            <Slider Grid.Row="1" Grid.ColumnSpan="2"
+                    Name="FontSizeSlider" 
+                    Value="14"  
+                    IsSelectionRangeEnabled="True" 
+                    IsMoveToPointEnabled="True" 
+                    Margin="2,20,2,0"  
+                    Maximum="72" 
+                    Minimum="5" 
+                    TickFrequency="1" 
+                    IsSnapToTickEnabled="True" 
+                    Thumb.DragCompleted="Slider_DragCompleted"
+                    Thumb.DragStarted="Slider_DragStarted"
+                    ValueChanged="Slider_ValueChanged"
+                    Tag="true"
+                    />
+           
+        </Grid>
+
+        <Grid Grid.Row="6" Margin="0,20,0,0">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"></RowDefinition>
+                <RowDefinition Height="auto"></RowDefinition>
+            </Grid.RowDefinitions>
+            
+            <TextBlock FontSize="16">透明度:</TextBlock>
+            <TextBox Name="TextOpacityBox" Grid.Column="1" BorderThickness="0,0,0,1" Width="50" HorizontalContentAlignment="Center" IsReadOnly="True"></TextBox>
+
+            <Slider Grid.Row="1" Grid.ColumnSpan="2"
+                    Name="FontOpacitySlider" 
+                    Value="14"  
+                    IsSelectionRangeEnabled="True" 
+                    IsMoveToPointEnabled="True" 
+                    Margin="2,20,2,0"  
+                    Maximum="1" 
+                    Minimum="0" 
+                    TickFrequency="0.01"
+                    IsSnapToTickEnabled="True" 
+                    Thumb.DragCompleted="SliderOpacity_DragCompleted"
+                    Thumb.DragStarted="Slider_DragStarted"
+                    ValueChanged="SliderOpacity_ValueChanged"
+                    Tag="true"
+                    />
+        </Grid>
+
+    </Grid>
+</UserControl>

+ 168 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditControl/PDFTextEditControl.xaml.cs

@@ -0,0 +1,168 @@
+using ComPDFKit.PDFPage;
+using ComPDFKit.PDFPage.Edit;
+using ComPDFKitViewer;
+using ComPDFKitViewer.PdfViewer;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+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_tools.Edit
+{
+    public partial class PDFTextEditControl : UserControl
+    {
+        public CPDFViewer PDFView { get;private set; }
+        public PDFEditEvent EditEvent { get; set; }
+        public PDFTextEditControl()
+        {
+            InitializeComponent();
+            Loaded += PDFTextEditControl_Loaded;
+        }
+
+        public void InitWithPDFViewer(CPDFViewer newPDFView)
+        {
+            PDFView = newPDFView;
+        }
+
+        public void SetPDFTextEditData(PDFEditEvent newEvent)
+        {
+            if(newEvent!=null && newEvent.EditType==CPDFEditType.EditText)
+            {
+                if (newEvent.SystemFontNameList.Contains(newEvent.FontName) == false && string.IsNullOrEmpty(newEvent.FontName)==false)
+                {
+                    newEvent.SystemFontNameList.Add(newEvent.FontName);
+                }
+
+                TextStyleUI.SetFontNames(newEvent.SystemFontNameList);
+                TextStyleUI.SelectFontName(newEvent.FontName);
+                TextStyleUI.SetFontBold(newEvent.IsBold);
+                TextStyleUI.SetFontItalic(newEvent.IsItalic);
+                TextAlignUI.SetFontAlign(newEvent.TextAlign);
+            }
+            EditEvent = newEvent;
+        }
+
+        private void Slider_DragCompleted(object sender, DragCompletedEventArgs e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null)
+            {
+                slider.Tag = "true";
+            }
+            if (EditEvent != null)
+            {
+                EditEvent.FontSize = slider.Value;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void SliderOpacity_DragCompleted(object sender, DragCompletedEventArgs e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null)
+            {
+                slider.Tag = "true";
+            }
+            if (EditEvent != null)
+            {
+                EditEvent.Transparency = (int)(FontOpacitySlider.Value * 255);
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void SliderOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+        {
+            Slider slider = sender as Slider;
+            TextOpacityBox.Text = string.Format("{0}%", (int)(FontOpacitySlider.Value * 100));
+            if (slider != null && slider.Tag != null && slider.Tag.ToString() == "false")
+            {
+                return;
+            }
+
+            if (EditEvent != null)
+            {
+                EditEvent.Transparency = (int)(FontOpacitySlider.Value * 255);
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void Slider_DragStarted(object sender, DragStartedEventArgs e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null)
+            {
+                slider.Tag = "false";
+            }
+        }
+
+        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+        {
+            Slider slider = sender as Slider;
+            if (slider != null && slider.Tag != null && slider.Tag.ToString() == "false")
+            {
+                return;
+            }
+
+            if (EditEvent != null)
+            {
+                EditEvent.FontSize = slider.Value;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void PDFTextEditControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            TextStyleUI.TextFontChanged += TextStyleUI_TextFontChanged;
+            TextStyleUI.TextBoldChanged += TextStyleUI_TextBoldChanged;
+            TextStyleUI.TextItalicChanged += TextStyleUI_TextItalicChanged;
+            TextAlignUI.TextAlignChanged += TextAlignUI_TextAlignChanged;
+        }
+
+        private void TextAlignUI_TextAlignChanged(object sender,TextAlignType e)
+        {
+            if (EditEvent != null)
+            {
+                EditEvent.TextAlign = e;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void TextStyleUI_TextItalicChanged(object sender, bool e)
+        {
+            if(EditEvent!=null)
+            {
+                EditEvent.IsItalic = e;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void TextStyleUI_TextBoldChanged(object sender, bool e)
+        {
+            if (EditEvent != null)
+            {
+                EditEvent.IsBold = e;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+
+        private void TextStyleUI_TextFontChanged(object sender, string e)
+        {
+            if (EditEvent != null)
+            {
+                EditEvent.FontName = e;
+                EditEvent.UpdatePDFEditByEventArgs();
+            }
+        }
+    }
+}

+ 62 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextAlignUI.xaml

@@ -0,0 +1,62 @@
+<UserControl x:Class="compdfkit_tools.Edit.CPDFTextAlignUI"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <StackPanel Name="TextAlignUI">
+
+        <Grid>
+            <TextBlock VerticalAlignment="Center"  Margin="0,10,10,0">对齐方式:</TextBlock>
+        </Grid>
+        
+        <StackPanel Name="AlignPanel" Orientation="Horizontal">
+
+            <Button Width="30" BorderThickness="0" Padding="0,5,0,5" Tag="AlignLeft" Click="TextAlignBtn_Click">
+                <Button.Content>
+                    <Path Name="AlignLeftPath" Fill="Gray">
+                        <Path.Data>
+                            M11.25 3.25C11.6642 3.25 12 3.58579 12 4C12 4.41421 11.6642 4.75 11.25 4.75H2.75C2.33579 4.75 2 4.41421 2 4C2 3.58579 2.33579 3.25 2.75 
+                                3.25H11.25ZM15.25 7.25C15.6642 7.25 16 7.58579 16 8C16 8.41421 15.6642 8.75 15.25 8.75H2.75C2.33579 8.75 2 8.41421 2 8C2 7.58579 
+                                2.33579 7.25 2.75 7.25H15.25ZM12 12C12 11.5858 11.6642 11.25 11.25 11.25H2.75C2.33579 11.25 2 11.5858 2 12C2 12.4142 2.33579 
+                                12.75 2.75 12.75H11.25C11.6642 12.75 12 12.4142 12 12ZM17.25 15.25C17.6642 15.25 18 15.5858 18 16C18 16.4142 17.6642 16.75 
+                                17.25 16.75H2.75C2.33579 16.75 2 16.4142 2 16C2 15.5858 2.33579 15.25 2.75 15.25H17.25Z
+                        </Path.Data>
+                    </Path>
+                </Button.Content>
+            </Button>
+
+            <Button Width="30" Margin="10,0,0,0" BorderThickness="0" Padding="0,5,0,5" Tag="AlignCenter" Click="TextAlignBtn_Click">
+                <Button.Content>
+                    <Path Name="AlignCenterPath" Fill="Gray">
+                        <Path.Data>
+                            M5 4C5 3.58579 5.33579 3.25 5.75 3.25H14.25C14.6642 3.25 15 3.58579 15 4C15 4.41421 14.6642 4.75 14.25 4.75H5.75C5.33579 4.75 5 
+                                    4.41421 5 4ZM3.75 7.25C3.33579 7.25 3 7.58579 3 8C3 8.41421 3.33579 8.75 3.75 8.75H16.25C16.6642 8.75 17 8.41421 17 8C17 
+                                    7.58579 16.6642 7.25 16.25 7.25H3.75ZM2.75 15.25C2.33579 15.25 2 15.5858 2 16C2 16.4142 2.33579 16.75 2.75 16.75H17.25C17.6642 
+                                    16.75 18 16.4142 18 16C18 15.5858 17.6642 15.25 17.25 15.25H2.75ZM5.75 11.25C5.33579 11.25 5 11.5858 5 12C5 12.4142 5.33579 
+                                    12.75 5.75 12.75H14.25C14.6642 12.75 15 12.4142 15 12C15 11.5858 14.6642 11.25 14.25 11.25H5.75Z
+                        </Path.Data>
+                    </Path>
+                </Button.Content>
+            </Button>
+
+            <Button Width="30" Margin="10,0,0,0" BorderThickness="0" Padding="0,5,0,5" Tag="AlignRight" Click="TextAlignBtn_Click">
+                <Button.Content>
+                    <Path Name="AlignRightPath" Fill="Gray">
+                        <Path.Data>
+                            M8.75 3.25C8.33579 3.25 8 3.58579 8 4C8 4.41421 8.33579 4.75 8.75 4.75H17.25C17.6642 4.75 18 4.41421 18 4C18 3.58579 
+                                    17.6642 3.25 17.25 3.25H8.75ZM2.75 15.25C2.33579 15.25 2 15.5858 2 16C2 16.4142 2.33579 16.75 2.75 16.75H17.25C17.6642 
+                                    16.75 18 16.4142 18 16C18 15.5858 17.6642 15.25 17.25 15.25H2.75ZM4 8C4 7.58579 4.33579 7.25 4.75 7.25H17.25C17.6642 7.25 
+                                    18 7.58579 18 8C18 8.41421 17.6642 8.75 17.25 8.75H4.75C4.33579 8.75 4 8.41421 4 8ZM8.75 11.25C8.33579 11.25 8 11.5858 8 
+                                    12C8 12.4142 8.33579 12.75 8.75 12.75H17.25C17.6642 12.75 18 12.4142 18 12C18 11.5858 17.6642 11.25 17.25 11.25H8.75Z
+                        </Path.Data>
+                    </Path>
+                </Button.Content>
+            </Button>
+            
+        </StackPanel>
+        
+    </StackPanel>
+</UserControl>

+ 103 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextAlignUI.xaml.cs

@@ -0,0 +1,103 @@
+using ComPDFKit.PDFPage.Edit;
+using ComPDFKitViewer.PdfViewer;
+using System;
+using System.Collections.Generic;
+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_tools.Edit
+{
+    /// <summary>
+    /// CPDFTextAlignUI.xaml 的交互逻辑
+    /// </summary>
+    public partial class CPDFTextAlignUI : UserControl
+    {
+        public event EventHandler<TextAlignType> TextAlignChanged;
+        public CPDFTextAlignUI()
+        {
+            InitializeComponent();
+        }
+
+        public Orientation Orientation
+        {
+            get
+            {
+                return TextAlignUI.Orientation;
+            }
+            set
+            {
+                TextAlignUI.Orientation = value;
+            }
+        }
+
+        public TextAlignType Alignment { get;private set; }
+
+        public void SetFontAlign(TextAlignType newAlign)
+        {
+            ClearAlign();
+            Alignment = newAlign;
+            switch (newAlign)
+            {
+                case TextAlignType.AlignLeft:
+                    AlignLeftPath.Fill = Brushes.Blue;
+                    break;
+                case TextAlignType.AlignMiddle:
+                    AlignCenterPath.Fill = Brushes.Blue;
+                    break;
+                case TextAlignType.AlignRight:
+                    AlignRightPath.Fill = Brushes.Blue;
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        public void ClearAlign()
+        {
+            Alignment = TextAlignType.AlignNone;
+            AlignLeftPath.Fill = Brushes.Gray;
+            AlignCenterPath.Fill= Brushes.Gray;
+            AlignRightPath.Fill= Brushes.Gray;
+        }
+
+        private void TextAlignBtn_Click(object sender, RoutedEventArgs e)
+        {
+            Button clickBtn = sender as Button;
+            if (clickBtn != null && clickBtn.Tag!=null)
+            {
+                TextAlignType newAlign = Alignment;
+
+                switch(clickBtn.Tag.ToString())
+                {
+                    case "AlignLeft":
+                        newAlign= TextAlignType.AlignLeft;
+                        break;
+                    case "AlignCenter":
+                        newAlign = TextAlignType.AlignMiddle;
+                        break;
+                    case "AlignRight":
+                        newAlign= TextAlignType.AlignRight;
+                        break;
+                    default:
+                        break;
+                }
+
+                if(newAlign!=Alignment)
+                {
+                    SetFontAlign(newAlign);
+                    TextAlignChanged?.Invoke(this, newAlign);
+                }
+            }
+        }
+    }
+}

+ 28 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextStyleUI.xaml

@@ -0,0 +1,28 @@
+<UserControl x:Class="compdfkit_tools.Edit.CPDFTextStyleUI"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:compdfkit_tools.Edit"
+             mc:Ignorable="d" 
+             d:DesignHeight="450" d:DesignWidth="800">
+    <StackPanel Name="TextStyleUI">
+        
+        <Grid>
+            <TextBlock VerticalAlignment="Center" Margin="0,10,10,0">字体样式:</TextBlock>
+        </Grid>
+      
+        <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
+            <ComboBox Name="FontNameComboBox" Width="90" FontSize="14" SelectionChanged="FontNameComboBox_SelectionChanged">
+                <ComboBoxItem Content="Courier"></ComboBoxItem>
+                <ComboBoxItem Content="Helvetica"></ComboBoxItem>
+                <ComboBoxItem Content="Times"></ComboBoxItem>
+            </ComboBox>
+            <ToggleButton Name="FontBoldBtn" FontSize="14" FontWeight="Bold" Width="40" Margin="10,0,10,0" BorderThickness="0" 
+                          Checked="FontBoldBtn_CheckChanged" Unchecked="FontBoldBtn_CheckChanged">B</ToggleButton>
+            <ToggleButton Name="FontItalicBtn" FontSize="14" FontWeight="Bold" Width="40" BorderThickness="0" FontStyle="Italic"
+                          Checked="FontItalicBtn_CheckChanged" Unchecked="FontItalicBtn_CheckChanged">U</ToggleButton>
+        </StackPanel>
+        
+    </StackPanel>
+</UserControl>

+ 120 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/Edit/PDFTextEdit/PDFTextEditUI/CPDFTextStyleUI.xaml.cs

@@ -0,0 +1,120 @@
+using System;
+using System.Collections.Generic;
+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_tools.Edit
+{
+    /// <summary>
+    /// CPDFFontStyleUI.xaml 的交互逻辑
+    /// </summary>
+    public partial class CPDFTextStyleUI : UserControl
+    {
+        public event EventHandler<string> TextFontChanged;
+        public event EventHandler<bool> TextBoldChanged;
+        public event EventHandler<bool> TextItalicChanged;
+        public CPDFTextStyleUI()
+        {
+            InitializeComponent();
+        }
+
+        public Orientation Orientation
+        {
+            get
+            {
+                return TextStyleUI.Orientation;
+            }
+            set
+            {
+                TextStyleUI.Orientation = value;
+            }
+        }
+
+        public void SetFontNames(List<string> fontNames)
+        {
+            FontNameComboBox.Items?.Clear();
+            if (fontNames != null && fontNames.Count > 0)
+            {
+                List<ComboBoxItem> fontNameList = new List<ComboBoxItem>();
+                foreach (string fontName in fontNames)
+                {
+                    fontNameList.Add(new ComboBoxItem()
+                    {
+                        Content = fontName
+                    });
+                }
+                FontNameComboBox.ItemsSource = fontNameList;
+            }
+        }
+
+        public void SelectFontName(string fontName)
+        {
+            if(string.IsNullOrEmpty(fontName))
+            {
+                return;
+            }
+
+            List<ComboBoxItem> fontNameList = FontNameComboBox.ItemsSource as List<ComboBoxItem>;
+            if (fontNameList != null && fontNameList.Count>0)
+            {
+                int selectIndex = -1;
+                for(int i=0;i<fontNameList.Count; i++)
+                {
+                    ComboBoxItem checkItem= fontNameList[i];
+                    if(checkItem.Content!=null && checkItem.Content.ToString().ToLower()==fontName.ToLower() )
+                    {
+                        selectIndex=i; 
+                        break;
+                    }
+                }
+
+                FontNameComboBox.SelectedIndex = selectIndex;
+            }
+        }
+
+        public void SetFontBold(bool isBold)
+        {
+            FontBoldBtn.IsChecked = isBold;
+        }
+
+        public void SetFontItalic(bool isItalic) 
+        {
+            FontItalicBtn.IsChecked= isItalic;
+        }
+
+        private void FontNameComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            if(FontNameComboBox.SelectedIndex==-1)
+            {
+                TextFontChanged?.Invoke(this,string.Empty);
+                return;
+            }
+
+            ComboBoxItem selectItem= FontNameComboBox.SelectedItem as ComboBoxItem;
+            if(selectItem != null && selectItem.Content != null)
+            {
+                TextFontChanged?.Invoke(this, selectItem.Content.ToString());
+            }
+        }
+
+        private void FontBoldBtn_CheckChanged(object sender, RoutedEventArgs e)
+        {
+            TextBoldChanged?.Invoke(this, FontBoldBtn.IsChecked==true);
+        }
+
+        private void FontItalicBtn_CheckChanged(object sender, RoutedEventArgs e)
+        {
+            TextItalicChanged?.Invoke(this, FontItalicBtn.IsChecked == true);
+        }
+    }
+}

+ 42 - 0
compdfkit_demo_windows/compdfkit/compdfkit-tools/compdfkit-tools.csproj

@@ -103,6 +103,24 @@
     <Compile Include="Common\PropertyControl\OpactiyControl.xaml.cs">
       <DependentUpon>OpactiyControl.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Edit\PDFImageEdit\PDFImageEditControl\PDFImageEditControl.xaml.cs">
+      <DependentUpon>PDFImageEditControl.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Edit\PDFImageEdit\PDFImageUI\CPDFImageFlipUI.xaml.cs">
+      <DependentUpon>CPDFImageFlipUI.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Edit\PDFImageEdit\PDFImageUI\CPDFImageRotateUI.xaml.cs">
+      <DependentUpon>CPDFImageRotateUI.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Edit\PDFTextEdit\PDFTextEditControl\PDFTextEditControl.xaml.cs">
+      <DependentUpon>PDFTextEditControl.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Edit\PDFTextEdit\PDFTextEditUI\CPDFTextAlignUI.xaml.cs">
+      <DependentUpon>CPDFTextAlignUI.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Edit\PDFTextEdit\PDFTextEditUI\CPDFTextStyleUI.xaml.cs">
+      <DependentUpon>CPDFTextStyleUI.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Helper\CommonHelper.cs" />
     <Compile Include="PDFView\PDFBookmark\PDFBookmarkControl\CPDFBookmarkControl.xaml.cs">
       <DependentUpon>CPDFBookmarkControl.xaml</DependentUpon>
@@ -255,6 +273,30 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Edit\PDFImageEdit\PDFImageEditControl\PDFImageEditControl.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Edit\PDFImageEdit\PDFImageUI\CPDFImageFlipUI.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Edit\PDFImageEdit\PDFImageUI\CPDFImageRotateUI.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Edit\PDFTextEdit\PDFTextEditControl\PDFTextEditControl.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Edit\PDFTextEdit\PDFTextEditUI\CPDFTextAlignUI.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Edit\PDFTextEdit\PDFTextEditUI\CPDFTextStyleUI.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="PDFView\PDFBookmark\PDFBookmarkControl\CPDFBookmarkControl.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 55 - 4
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/App.xaml.cs

@@ -1,17 +1,68 @@
-using System;
+using ComPDFKit.NativeMethod;
+using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Data;
 using System.Linq;
+using System.Reflection;
 using System.Threading.Tasks;
 using System.Windows;
+using System.Xml;
+using static ComPDFKit.NativeMethod.CPDFSDKVerifier;
 
 namespace edit_ctrl_demo
 {
-    /// <summary>
-    /// App.xaml 的交互逻辑
-    /// </summary>
+    public class SDKLicenseHelper
+    {
+        public string key = string.Empty;
+        public string secret = string.Empty;
+        public SDKLicenseHelper()
+        {
+            string sdkLicensePath = "..\\..\\..\\SDKLicense.xml";
+            Assembly assembly = Assembly.GetExecutingAssembly();
+            XmlDocument xmlDocument = new XmlDocument();
+            xmlDocument.Load(sdkLicensePath);
+            var node = xmlDocument.SelectSingleNode("License");
+            if (node != null)
+            {
+                key = node.Attributes["key"].Value;
+                secret = node.Attributes["secret"].Value;
+            }
+        }
+    }
+
     public partial class App : Application
     {
+        protected override void OnStartup(StartupEventArgs e)
+        {
+            base.OnStartup(e);
+            LicenseVerify();
+        }
+
+        private static bool LicenseVerify()
+        {
+            try
+            {
+                if (!CPDFSDKVerifier.LoadNativeLibrary())
+                {
+                    return false;
+                }
+                SDKLicenseHelper sdkLicenseHelper = new SDKLicenseHelper();
+                LicenseErrorCode verifyResult = CPDFSDKVerifier.LicenseVerify(sdkLicenseHelper.key, sdkLicenseHelper.secret);
+                if (verifyResult != LicenseErrorCode.LICENSE_ERR_SUCCESS)
+                {
+                    return false;
+                }
+
+                return true;
+
+            }
+            catch(Exception ex)
+            {
+
+            }
+
+            return false;
+        }
     }
 }

BIN
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/ComPDFKit.Desk.dll


BIN
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/ComPDFKit.Viewer.dll


+ 55 - 2
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/MainWindow.xaml

@@ -4,9 +4,62 @@
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:edit_ctrl_demo"
+        xmlns:pdfview="clr-namespace:ComPDFKitViewer.PdfViewer;assembly=ComPDFKit.Viewer"
+        xmlns:tools="clr-namespace:compdfkit_tools.PDFControl;assembly=com.compdfkit.tools"
         mc:Ignorable="d"
-        Title="MainWindow" Height="450" Width="800">
+        Title="MainWindow" Height="700" Width="1200" WindowStartupLocation="CenterScreen">
     <Grid>
-        
+        <Grid.RowDefinitions>
+            <RowDefinition Height="auto"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+            <RowDefinition Height="auto"></RowDefinition>
+        </Grid.RowDefinitions>
+
+        <!--顶部菜单部分-->
+        <Grid>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"></RowDefinition>
+                <RowDefinition Height="auto"></RowDefinition>
+            </Grid.RowDefinitions>
+            <tools:TitleBarControl Name="TitleBarTool"></tools:TitleBarControl>
+            <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,10">
+                <!--文字编辑按钮-->
+                <ToggleButton Name="PDFTextEditButton" BorderThickness="0" Padding="10,5,10,5" Click="PDFTextEditButton_Click">
+                    <TextBlock  FontSize="14" VerticalAlignment="Center">文字编辑</TextBlock>
+                </ToggleButton>
+                <!--图片编辑按钮-->
+                <ToggleButton Name="PDFImageEditButton" BorderThickness="0" Padding="10,5,10,5" Margin="10,0,0,0" Click="PDFImageEditButton_Click">
+                    <TextBlock FontSize="14" VerticalAlignment="Center">图片编辑</TextBlock>
+                </ToggleButton>
+                <!--撤销-->
+                <Button BorderThickness="0" Padding="10,5,10,5" Margin="10,0,0,0"  IsEnabled="{Binding CanUndo,Mode=OneWay}" Click="UndoBtn_Click">
+                    <TextBlock FontSize="14" VerticalAlignment="Center">撤销</TextBlock>
+                </Button>
+                <!--重做-->
+                <Button BorderThickness="0" Padding="10,5,10,5" Margin="10,0,0,0"  IsEnabled="{Binding CanRedo,Mode=OneWay}" Click="RedoBtn_Click">
+                    <TextBlock FontSize="14" VerticalAlignment="Center">重做</TextBlock>
+                </Button>
+            </StackPanel>
+        </Grid>
+
+        <!--中间内容部分-->
+        <Grid Grid.Row="1">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*"></ColumnDefinition>
+                <ColumnDefinition Width="auto"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+
+            <pdfview:CPDFViewer Name="PDFView"></pdfview:CPDFViewer>
+            
+            <!--右侧属性面板-->
+            <Border Name="PDFEditContainer" Grid.Column="1">
+                
+            </Border>
+        </Grid>
+
+        <!--底部工具部分-->
+        <Grid Grid.Row="2">
+            
+        </Grid>
     </Grid>
 </Window>

+ 167 - 2
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/MainWindow.xaml.cs

@@ -1,10 +1,19 @@
-using System;
+using ComPDFKit.PDFPage;
+using compdfkit_tools.Edit;
+using compdfkit_tools.PDFControl;
+using ComPDFKitViewer;
+using ComPDFKitViewer.PdfViewer;
+using System;
 using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
 using System.Windows.Data;
 using System.Windows.Documents;
 using System.Windows.Input;
@@ -12,17 +21,173 @@ using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
+using System.Xml.Linq;
 
 namespace edit_ctrl_demo
 {
     /// <summary>
     /// MainWindow.xaml 的交互逻辑
     /// </summary>
-    public partial class MainWindow : Window
+    public partial class MainWindow : Window,INotifyPropertyChanged
     {
+        public bool CanUndo
+        {
+            get
+            {
+                if (PDFView != null)
+                {
+                    return PDFView.UndoManager.CanUndo;
+                }
+                return false;
+            }
+        }
+
+        public bool CanRedo
+        {
+            get
+            {
+                if (PDFView != null)
+                {
+                    return PDFView.UndoManager.CanRedo;
+                }
+                return false;
+            }
+        }
+
         public MainWindow()
         {
             InitializeComponent();
+            Loaded += MainWindow_Loaded;
+            DataContext = this;
+        }
+
+        public event PropertyChangedEventHandler PropertyChanged;
+        protected void OnPropertyChanged([CallerMemberName] string name = null)
+        {
+            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+        }
+
+        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+        {
+            LoadDefaultDocument();
+            TitleBarTool.OpenFileEvent += TitleBarTool_OpenFileEvent;
+            PDFView.PDFEditActiveHandler += PDFView_PDFEditActiveHandler;
+            PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
+        }
+
+        private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            OnPropertyChanged(e.PropertyName);
+        }
+
+        /// <summary>
+        /// 文字或图片块选中事件
+        /// </summary>
+        private void PDFView_PDFEditActiveHandler(object sender, PDFEditEvent e)
+        {
+            if (e == null)
+            {
+                PDFEditContainer.Child= null;
+                return;
+            }
+
+            if(e.EditType==CPDFEditType.EditText)
+            {
+                PDFTextEditControl textEditControl= new PDFTextEditControl();
+                textEditControl.SetPDFTextEditData(e);
+                PDFEditContainer.Child = textEditControl;
+                return;
+            }
+
+            if(e.EditType== CPDFEditType.EditImage)
+            {
+                PDFImageEditControl imageEditControl= new PDFImageEditControl();
+                imageEditControl.InitWithPDFViewer(PDFView);
+                imageEditControl.SetPDFImageEditData(e);
+                PDFEditContainer.Child = imageEditControl;
+                return;
+            }
+        }
+
+        private void TitleBarTool_OpenFileEvent(object sender, string filePath)
+        {
+            ClearPDFEditState();
+            PDFView?.CloseDocument();
+            PDFView?.InitDocument(filePath);
+            PDFView?.Load();
+            PDFView?.SetMouseMode(MouseModes.PanTool);
+        }
+
+        private void LoadDefaultDocument()
+        {
+            string defaultFilePath = "..\\..\\..\\..\\developer_guide_windows.pdf";
+            PDFView?.InitDocument(defaultFilePath);
+            PDFView?.Load();
+        }
+
+        /// <summary>
+        /// 文字编辑模式
+        /// </summary>
+        private void PDFTextEditButton_Click(object sender, RoutedEventArgs e)
+        {
+            ToggleButton senderBtn=sender as ToggleButton;
+            if(senderBtn != null)
+            {
+                PDFImageEditButton.IsChecked = false;
+                if (senderBtn.IsChecked == true)
+                {
+                    PDFView?.SetPDFEditType(CPDFEditType.EditText);
+                    PDFView?.SetMouseMode(MouseModes.PDFEdit);
+                    PDFView?.ReloadDocument();
+                }
+                else
+                {
+                    PDFView?.SetPDFEditType(CPDFEditType.None);
+                    PDFView?.SetMouseMode(MouseModes.PanTool);
+                    PDFView?.ReloadDocument();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 图片编辑模式
+        /// </summary>
+        private void PDFImageEditButton_Click(object sender, RoutedEventArgs e)
+        {
+            ToggleButton senderBtn = sender as ToggleButton;
+            if (senderBtn != null)
+            {
+                PDFTextEditButton.IsChecked= false;
+                if (senderBtn.IsChecked == true)
+                {
+                    PDFView?.SetPDFEditType(CPDFEditType.EditImage);
+                    PDFView?.SetMouseMode(MouseModes.PDFEdit);
+                    PDFView?.ReloadDocument();
+                }
+                else
+                {
+                    PDFView?.SetPDFEditType(CPDFEditType.None);
+                    PDFView?.SetMouseMode(MouseModes.PanTool);
+                    PDFView?.ReloadDocument();
+                }
+            }
+        }
+
+        private void ClearPDFEditState()
+        {
+            PDFTextEditButton.IsChecked = false;
+            PDFImageEditButton.IsChecked = false;
+            PDFEditContainer.Child = null;
+        }
+
+        private void UndoBtn_Click(object sender, RoutedEventArgs e)
+        {
+            PDFView?.UndoManager?.Undo();
+        }
+
+        private void RedoBtn_Click(object sender, RoutedEventArgs e)
+        {
+            PDFView?.UndoManager?.Redo();
         }
     }
 }

BIN
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/PDFA/sRGB2014.icc


+ 29 - 0
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/edit-ctrl-demo.csproj

@@ -24,6 +24,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -35,6 +36,14 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="ComPDFKit.Desk, Version=1.7.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>.\ComPDFKit.Desk.dll</HintPath>
+    </Reference>
+    <Reference Include="ComPDFKit.Viewer, Version=1.7.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>.\ComPDFKit.Viewer.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
@@ -86,6 +95,9 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
+    <None Include="PDFA\sRGB2014.icc">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -94,5 +106,22 @@
   <ItemGroup>
     <None Include="App.config" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="ComPDFKit.Desk.dll" />
+    <Content Include="ComPDFKit.Viewer.dll" />
+    <Content Include="x64\ComPDFKit.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="x86\ComPDFKit.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\compdfkit-tools\compdfkit-tools.csproj">
+      <Project>{9363bcb1-3a67-446a-8093-5708b86bf418}</Project>
+      <Name>compdfkit-tools</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

BIN
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/x64/ComPDFKit.dll


BIN
compdfkit_demo_windows/compdfkit/edit-ctrl-demo/x86/ComPDFKit.dll