using ComPDFKit.Import; using ComPDFKit.PDFAnnotation; using ComPDFKit.PDFDocument; using ComPDFKit.PDFPage; using ComPDFKitViewer; using ComPDFKitViewer.AnnotEvent; using ComPDFKitViewer.PdfViewer; using PDF_Master.Helper; using PDF_Master.Model.BOTA; using PDF_Master.ViewModels.BOTA; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using static Dropbox.Api.Files.SearchMatchTypeV2; namespace PDF_Master.Views.BOTA { /// /// AnnotationListItem.xaml 的交互逻辑 /// public partial class AnnotationListItem : System.Windows.Controls.UserControl { //private Brush strikeoutColor = new SolidColorBrush(Color.FromRgb(0xFF, 0xBB, 0x00)); public AnnotationListItem() { InitializeComponent(); } private void GridIco_Loaded(object sender, RoutedEventArgs e) { if (e.Source is Grid grid) { if (grid.DataContext == null) { //var data= this.DataContext as AnnotationHandlerEventArgs; } if (grid.DataContext is AnnotationHandlerEventArgs args) { //var args = grid.DataContext as AnnotationHandlerEventArgs; AnnotHandlerEventArgs data = args.AnnotHandlerEventArgs; if (data == null) { return; } TxbMarkupContent.Text = data.MarkupContent; TxbContent.Text = data.Content; switch (data.EventType) { case AnnotArgsType.AnnotFreeText: if (data is FreeTextAnnotArgs freeTextAnnotArgs) { BtnAnnotFreeText.Visibility = Visibility.Visible; //TxbContent.Foreground = new SolidColorBrush(freeTextAnnotArgs.FontColor); } //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbMarkupContent.Text = ""; break; case AnnotArgsType.AnnotHighlight: if (data is TextHighlightAnnotArgs textHighlightAnnotArgs) { BtnHighlight.Visibility = Visibility.Visible; PathHighlight.Background = new SolidColorBrush(textHighlightAnnotArgs.Color); //PathHighlight.Opacity = textHighlightAnnotArgs.Transparency; //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } break; case AnnotArgsType.AnnotFreehand: if (data is FreehandAnnotArgs freehandAnnotArgs) { BtnFreeHand.Visibility = Visibility.Visible; PathFreehand.Fill = new SolidColorBrush(freehandAnnotArgs.InkColor); ImageContext.Visibility = Visibility.Visible; TxbContent.Visibility = Visibility.Collapsed; SetImageContext(args, freehandAnnotArgs); //var encoder = new PngBitmapEncoder(); //encoder.Frames.Add(BitmapFrame.Create((BitmapSource)ImageContext.Source)); //FileStream file = new FileStream(String.Format($@"C:\Users\oyxh\Desktop\images\PDFText\{data.AnnotIndex}.png"), FileMode.Create); //encoder.Save(file); //file.Close(); } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } break; case AnnotArgsType.AnnotSquiggly://波浪线 if (data is TextSquigglyAnnotArgs textSquigglyAnnotArgs) { AnnotSquiggly.Visibility = Visibility.Visible; AnnotSquigglycolor.Stroke = new SolidColorBrush(textSquigglyAnnotArgs.Color); } #region TO DO //TextDecoration mySquiggly = new TextDecoration(); //Pen myPen = new Pen(); //myPen.Brush = new SolidColorBrush((data as TextSquigglyAnnotArgs).Color); //myPen.Brush.Opacity = 0.8; //myPen.Thickness = 2; //myPen.DashStyle = DashStyles.Dash; //mySquiggly.Pen = myPen; //mySquiggly.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection = new TextDecorationCollection(); //myCollection.Add(mySquiggly); //TxbContext.TextDecorations = myCollection; #endregion TO DO break; case AnnotArgsType.AnnotStamp: BtnAnnotStamp.Visibility = Visibility.Visible; if (string.IsNullOrEmpty(data.Content) == false) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } break; case AnnotArgsType.AnnotStrikeout://删除线 if (data is TextStrikeoutAnnotArgs textStrikeoutAnnotArgs) { BtnAnnotStrikeout.Visibility = Visibility.Visible; PathStrikeoutyColor.Fill = new SolidColorBrush(textStrikeoutAnnotArgs.Color); //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } #region to do //TextDecoration myStrikeout = new TextDecoration(); //Pen myPen2 = new Pen(); //myPen2.Brush = new SolidColorBrush((data as TextStrikeoutAnnotArgs).Color); //myPen2.Brush.Opacity = 0.8; //myPen2.Thickness = 2; //myStrikeout.Pen = myPen2; //myStrikeout.PenOffset = -4; //myStrikeout.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection2 = new TextDecorationCollection(); //myCollection2.Add(myStrikeout); ////因为波浪线无法实现 暂时只显示文字 不显示下划线,删除线等 //TxbMarkupContent.TextDecorations = myCollection2; #endregion to do break; case AnnotArgsType.AnnotSticky://便签 if (data is StickyAnnotArgs stickyAnnotArgs) { BtnAnnotSticky.Visibility = Visibility; PathSticky.Fill = new SolidColorBrush(stickyAnnotArgs.Color); } //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbMarkupContent.Text = ""; break; case AnnotArgsType.AnnotUnderline: if (data is TextUnderlineAnnotArgs textUnderlineAnnotArgs) { BtnUnderLine.Visibility = Visibility.Visible; RectangleUnderline.Fill = new SolidColorBrush(textUnderlineAnnotArgs.Color); } //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); //TxbMarkupContent.Text = ""; #region TO DO //TextDecoration myUnderline = new TextDecoration(); //Pen myPen1 = new Pen(); //myPen1.Brush = new SolidColorBrush((data as TextUnderlineAnnotArgs).Color); //myPen1.Brush.Opacity = 0.8; //myPen1.Thickness = 2; //myUnderline.Pen = myPen1; //myUnderline.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection1 = new TextDecorationCollection(); //myCollection1.Add(myUnderline); //TxbMarkupContent.TextDecorations = myCollection1; #endregion TO DO break; case AnnotArgsType.AnnotLine: if (data is LineAnnotArgs lineAnnotArgs) { if (lineAnnotArgs.HeadLineType >= (C_LINE_TYPE)1 || lineAnnotArgs.TailLineType >= (C_LINE_TYPE)1) { BtnSharpArrow.Visibility = Visibility.Visible; PathArrow.Fill = new SolidColorBrush(lineAnnotArgs.LineColor); } else { PathSharpLine.Fill = new SolidColorBrush(lineAnnotArgs.LineColor); BtnSharpLine.Visibility = Visibility.Visible; } ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } } break; case AnnotArgsType.AnnotSquare: if (data is SquareAnnotArgs squareAnnotArgs) { BtnAnnotSquare.Visibility = Visibility.Visible; RectAnnotSquare.Stroke = new SolidColorBrush(squareAnnotArgs.LineColor); RectAnnotSquare.Fill = new SolidColorBrush(squareAnnotArgs.BgColor); ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } break; case AnnotArgsType.AnnotCircle: if (data is CircleAnnotArgs circleAnnotArgs) { BtnAnnotCircle.Visibility = Visibility.Visible; EllipseCircle.Stroke = new SolidColorBrush(circleAnnotArgs.LineColor); EllipseCircle.Fill = new SolidColorBrush(circleAnnotArgs.BgColor); ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); } break; case AnnotArgsType.AnnotLink: BtnAnnotLink.Visibility = Visibility.Visible; if (data is LinkAnnotArgs linkAnnotArgs) { if (string.IsNullOrEmpty(linkAnnotArgs.Content)) { if (linkAnnotArgs.DestIndex != -1) { TxbContent.Text = string.Format($"To Page {linkAnnotArgs.DestIndex + 1}"); } else { TxbContent.Text = string.Format($"{linkAnnotArgs.URI}"); } } } break; default: break; } } } } private void SetImageContext(AnnotationHandlerEventArgs args, FreehandAnnotArgs freehandAnnotArgs) { if (args == null && freehandAnnotArgs == null) { return; } if (args.WriteableBitmap == null) { return; } double width = args.WriteableBitmap.Width; double height = args.WriteableBitmap.Height; CPDFDocument doc = args.Document; if (doc != null) { CPDFPage docPage = doc.PageAtIndex(args.PageIndex, false); if (docPage != null) { double maxWidth = docPage.PageSize.Width; double maxHeight = docPage.PageSize.Height; ImageContext.MaxHeight = maxHeight; if (width > 168) { ImageContext.Stretch = Stretch.Uniform; } else { if (height >= maxHeight / 2) { //ImageContext.MaxHeight = 900; ImageContext.Stretch = Stretch.None; } if (height < maxHeight / 2) { if (height <= 20) { ImageContext.MinHeight = height; ImageContext.Height = 30; } ImageContext.Stretch = Stretch.None; } //else //{ // ImageContext.Stretch = Stretch.Uniform; //} } } } } private void GridIco_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue is AnnotationHandlerEventArgs args) { //var args = grid.DataContext as AnnotationHandlerEventArgs; AnnotHandlerEventArgs data = args.AnnotHandlerEventArgs; if (data == null) { return; } TxbMarkupContent.Text = data.MarkupContent; TxbContent.Text = data.Content; switch (data.EventType) { case AnnotArgsType.AnnotFreeText: if (data is FreeTextAnnotArgs freeTextAnnotArgs) { BtnAnnotFreeText.Visibility = Visibility.Visible; //TxbContent.Foreground = new SolidColorBrush(freeTextAnnotArgs.FontColor); } //文本注释、便签、链接、表格不支持添加附注 TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbMarkupContent.Text = ""; break; case AnnotArgsType.AnnotHighlight: if (data is TextHighlightAnnotArgs textHighlightAnnotArgs) { BtnHighlight.Visibility = Visibility.Visible; PathHighlight.Background = new SolidColorBrush(textHighlightAnnotArgs.Color); //PathHighlight.Opacity = textHighlightAnnotArgs.Transparency; //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = data.Content; } break; case AnnotArgsType.AnnotFreehand: if (data is FreehandAnnotArgs freehandAnnotArgs) { BtnFreeHand.Visibility = Visibility.Visible; PathFreehand.Fill = new SolidColorBrush(freehandAnnotArgs.InkColor); ImageContext.Visibility = Visibility.Visible; TxbContent.Visibility = Visibility.Collapsed; SetImageContext(args, freehandAnnotArgs); //var encoder = new PngBitmapEncoder(); //encoder.Frames.Add(BitmapFrame.Create((BitmapSource)ImageContext.Source)); //FileStream file = new FileStream(String.Format($@"C:\Users\oyxh\Desktop\images\PDFText\{data.AnnotIndex}.png"), FileMode.Create); //encoder.Save(file); //file.Close(); } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = data.Content; } break; case AnnotArgsType.AnnotSquiggly://波浪线 if (data is TextSquigglyAnnotArgs textSquigglyAnnotArgs) { AnnotSquiggly.Visibility = Visibility.Visible; AnnotSquigglycolor.Stroke = new SolidColorBrush(textSquigglyAnnotArgs.Color); } #region TO DO //TextDecoration mySquiggly = new TextDecoration(); //Pen myPen = new Pen(); //myPen.Brush = new SolidColorBrush((data as TextSquigglyAnnotArgs).Color); //myPen.Brush.Opacity = 0.8; //myPen.Thickness = 2; //myPen.DashStyle = DashStyles.Dash; //mySquiggly.Pen = myPen; //mySquiggly.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection = new TextDecorationCollection(); //myCollection.Add(mySquiggly); //TxbContext.TextDecorations = myCollection; #endregion TO DO break; case AnnotArgsType.AnnotStamp: BtnAnnotStamp.Visibility = Visibility.Visible; if (string.IsNullOrEmpty(data.Content) == false) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; TxbMarkupContent.Text = data.Content; } break; case AnnotArgsType.AnnotStrikeout://删除线 if (data is TextStrikeoutAnnotArgs textStrikeoutAnnotArgs) { BtnAnnotStrikeout.Visibility = Visibility.Visible; PathStrikeoutyColor.Fill = new SolidColorBrush(textStrikeoutAnnotArgs.Color); //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = data.Content; } #region to do //TextDecoration myStrikeout = new TextDecoration(); //Pen myPen2 = new Pen(); //myPen2.Brush = new SolidColorBrush((data as TextStrikeoutAnnotArgs).Color); //myPen2.Brush.Opacity = 0.8; //myPen2.Thickness = 2; //myStrikeout.Pen = myPen2; //myStrikeout.PenOffset = -4; //myStrikeout.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection2 = new TextDecorationCollection(); //myCollection2.Add(myStrikeout); ////因为波浪线无法实现 暂时只显示文字 不显示下划线,删除线等 //TxbMarkupContent.TextDecorations = myCollection2; #endregion to do break; case AnnotArgsType.AnnotSticky://便签 if (data is StickyAnnotArgs stickyAnnotArgs) { BtnAnnotSticky.Visibility = Visibility; PathSticky.Fill = new SolidColorBrush(stickyAnnotArgs.Color); } //BOTA - 注释,MVP不处理高亮 / 下划线 / 删除线的样式,只显示文字 //文本注释、便签、链接、表格不支持添加附注 TxbMarkupContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbMarkupContent.Text = ""; break; case AnnotArgsType.AnnotUnderline: if (data is TextUnderlineAnnotArgs textUnderlineAnnotArgs) { BtnUnderLine.Visibility = Visibility.Visible; RectangleUnderline.Fill = new SolidColorBrush(textUnderlineAnnotArgs.Color); } //文本注释、便签、链接、表格不支持添加附注 //高亮、下划线、删除线,不是文本注释 TxbContent.Text = Regex.Replace(data.MarkupContent, "[\r\n]", " "); TxbMarkupContent.Text = data.Content; //TxbMarkupContent.Text = ""; #region TO DO //TextDecoration myUnderline = new TextDecoration(); //Pen myPen1 = new Pen(); //myPen1.Brush = new SolidColorBrush((data as TextUnderlineAnnotArgs).Color); //myPen1.Brush.Opacity = 0.8; //myPen1.Thickness = 2; //myUnderline.Pen = myPen1; //myUnderline.PenThicknessUnit = TextDecorationUnit.FontRecommended; //TextDecorationCollection myCollection1 = new TextDecorationCollection(); //myCollection1.Add(myUnderline); //TxbMarkupContent.TextDecorations = myCollection1; #endregion TO DO break; case AnnotArgsType.AnnotLine: if (data is LineAnnotArgs lineAnnotArgs) { if (lineAnnotArgs.HeadLineType >= (C_LINE_TYPE)1 || lineAnnotArgs.TailLineType >= (C_LINE_TYPE)1) { BtnSharpArrow.Visibility = Visibility.Visible; PathArrow.Fill = new SolidColorBrush(lineAnnotArgs.LineColor); } else { PathSharpLine.Fill = new SolidColorBrush(lineAnnotArgs.LineColor); BtnSharpLine.Visibility = Visibility.Visible; } ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = data.Content; } } break; case AnnotArgsType.AnnotSquare: if (data is SquareAnnotArgs squareAnnotArgs) { BtnAnnotSquare.Visibility = Visibility.Visible; RectAnnotSquare.Stroke = new SolidColorBrush(squareAnnotArgs.LineColor); RectAnnotSquare.Fill = new SolidColorBrush(squareAnnotArgs.BgColor); ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = data.Content; } break; case AnnotArgsType.AnnotCircle: if (data is CircleAnnotArgs circleAnnotArgs) { BtnAnnotCircle.Visibility = Visibility.Visible; EllipseCircle.Stroke = new SolidColorBrush(circleAnnotArgs.LineColor); EllipseCircle.Fill = new SolidColorBrush(circleAnnotArgs.BgColor); ///对于形状注释等只有Note 的处理 if (!string.IsNullOrEmpty(data.Content) && string.IsNullOrEmpty(data.MarkupContent)) { TxbContent.Text = Regex.Replace(data.Content, "[\r\n]", " "); TxbContent.Text = ""; } } if (string.IsNullOrEmpty(data.Content) == false) { TxbMarkupContent.Text = data.Content; } break; case AnnotArgsType.AnnotLink: BtnAnnotLink.Visibility = Visibility.Visible; if (data is LinkAnnotArgs linkAnnotArgs) { if (string.IsNullOrEmpty(linkAnnotArgs.Content)) { if (linkAnnotArgs.DestIndex != -1) { TxbContent.Text = string.Format($"To Page {linkAnnotArgs.DestIndex + 1}"); } else { TxbContent.Text = string.Format($"{linkAnnotArgs.URI}"); } } } break; default: break; } } } } }