using ComPDFKit.PDFAnnotation; using ComPDFKit.PDFDocument; using ComPDFKitViewer; using ComPDFKitViewer.AnnotEvent; using ComPDFKitViewer.PdfViewer; using Microsoft.Office.Core; using Microsoft.Win32; using PDF_Office.CustomControl; using PDF_Office.Helper; using PDF_Office.Model.BOTA; using PDF_Office.Properties; using PDF_Office.ViewModels.BOTA; using PDF_Office.ViewModels.PropertyPanel.AnnotPanel; using PDF_Office.Views.BOTA; using PDF_Office.Views.PropertyPanel.AnnotPanel; using PDFSettings; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Media; using static Dropbox.Api.Sharing.ListFileMembersIndividualResult; using ContextMenu = System.Windows.Controls.ContextMenu; using HorizontalAlignment = System.Windows.HorizontalAlignment; using MenuItem = System.Windows.Controls.MenuItem; using OpenFileDialog = Microsoft.Win32.OpenFileDialog; namespace PDF_Office.ViewModels.Tools { public sealed partial class AnnotToolContentViewModel : BindableBase, INavigationAware { #region 初始化 #region 初始化数据 //初始化注释的属性值,并存在本地缓存数据集里 private void InitDefaultValue() { InitAnnotHighlight(); InitAnnotUnderline(); InitAnnotSquiggly(); InitAnnotStrikeout(); } private void InitAnnotHighlight() { DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotHighlight); if (annotProperty == null) { annotProperty = new DefaultAnnotProperty(); annotProperty.AnnotToolType = AnnotArgsType.AnnotHighlight; annotProperty.BackgroundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.ForgoundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.Opacity = 0.5; SettingHelper.SetAnnotDefaultProperty(annotProperty); } else { HighLightColor = new SolidColorBrush(annotProperty.BackgroundColor); HighLightOpacity = annotProperty.Opacity; } } private void InitAnnotUnderline() { DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotUnderline); if (annotProperty == null) { annotProperty = new DefaultAnnotProperty(); annotProperty.AnnotToolType = AnnotArgsType.AnnotUnderline; annotProperty.BackgroundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.ForgoundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.Opacity = 0.5; SettingHelper.SetAnnotDefaultProperty(annotProperty); } else { UnderLineColor = new SolidColorBrush(annotProperty.BackgroundColor); UnderLineOpacity = annotProperty.Opacity; } } private void InitAnnotSquiggly() { DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotSquiggly); if (annotProperty == null) { annotProperty = new DefaultAnnotProperty(); annotProperty.AnnotToolType = AnnotArgsType.AnnotSquiggly; annotProperty.BackgroundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.ForgoundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.Opacity = 0.5; SettingHelper.SetAnnotDefaultProperty(annotProperty); } else { SquigglyColor = new SolidColorBrush(annotProperty.BackgroundColor); SquigglyOpacity = annotProperty.Opacity; } } private void InitAnnotStrikeout() { DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotStrikeout); if (annotProperty == null) { annotProperty = new DefaultAnnotProperty(); annotProperty.AnnotToolType = AnnotArgsType.AnnotStrikeout; annotProperty.BackgroundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.ForgoundColor = Color.FromRgb(0xFF, 0xBB, 0x00); annotProperty.Opacity = 0.5; SettingHelper.SetAnnotDefaultProperty(annotProperty); } else { StrikeoutColor = new SolidColorBrush(annotProperty.BackgroundColor); StrikeoutOpacity = annotProperty.Opacity; } } //用来记录选中和创建注释的标识 private void InitToolDict() { ToolExpandDict.Add("SnapshotEdit", AnnotArgsType.SnapshotWithEditTool); ToolExpandDict.Add("HighLight", AnnotArgsType.AnnotHighlight); ToolExpandDict.Add("UnderLine", AnnotArgsType.AnnotUnderline); ToolExpandDict.Add("Squiggly", AnnotArgsType.AnnotSquiggly); ToolExpandDict.Add("Strikeout", AnnotArgsType.AnnotStrikeout); ToolExpandDict.Add("Freehand", AnnotArgsType.AnnotFreehand); ToolExpandDict.Add("Freetext", AnnotArgsType.AnnotFreeText); ToolExpandDict.Add("StickyNote", AnnotArgsType.AnnotSticky); ToolExpandDict.Add("Rect", AnnotArgsType.AnnotSquare); ToolExpandDict.Add("Circle", AnnotArgsType.AnnotCircle); ToolExpandDict.Add("Arrow", AnnotArgsType.AnnotLine); ToolExpandDict.Add("Line", AnnotArgsType.AnnotLine); ToolExpandDict.Add("Link", AnnotArgsType.AnnotLink); } #endregion 初始化数据 #endregion 初始化 #region 注释工具 //注释工具 private void FindAnnotTypeKey(string tag, ref AnnotHandlerEventArgs annotArgs, bool isRightMenuAdd = false) { switch (tag) { case "SnapshotEdit"://内容选择 annotArgs = GetSnapshotEdit(); break; case "HighLight"://字体高亮 annotArgs = GetHighLight(); break; case "UnderLine"://下划线 annotArgs = GetUnderLine(); break; case "Squiggly"://波浪线 annotArgs = GetSquiggly(); break; case "Strikeout"://删除线 annotArgs = GetStrikeout(); break; case "Freehand"://手绘 annotArgs = GetFreehand(); break; case "Freetext"://文本 annotArgs = GetFreetext(); break; case "StickyNote"://便签 annotArgs = GetStickyNote(); break; case "Rect"://矩形 annotArgs = GetRect(); break; case "Circle"://圆 annotArgs = GetCircle(); break; case "Arrow"://箭头 case "Line"://线 annotArgs = GetArrowLine(tag); break; case "Stamp"://图章 annotArgs = GetStamp(); break; case "Image": annotArgs = GetImage(); break; case "Signature"://签名 annotArgs = GetSignature(); PDFViewer.SetMouseMode(MouseModes.PanTool);//清空其他注释 break; case "Link"://链接 viewContentViewModel.IsRightMenuCreateLink = isRightMenuAdd; annotArgs = GetLink(); break; } } /// /// 高亮注释 /// /// private AnnotHandlerEventArgs GetHighLight(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); TextHighlightAnnotArgs highlightArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { highlightArgs = new TextHighlightAnnotArgs(); highlightArgs.Color = Color.FromRgb(0xFF, 0xBB, 0x00); highlightArgs.Transparency = 0.5; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotHighlight); if (annotProperty != null) { highlightArgs.Color = annotProperty.ForgoundColor; highlightArgs.Transparency = annotProperty.Opacity; highlightArgs.Content = annotProperty.NoteText; } if (highlightArgs != null) { selectedArgs = new List(); selectedArgs.Add(highlightArgs); } } else { highlightArgs = selectedArgs[0] as TextHighlightAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = highlightArgs.Color; annotAttribsList[AnnotAttrib.Transparency] = highlightArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = highlightArgs.Content; AddToPropertyPanel("TextAnnotProperty", "HighLight", selectedArgs, annotAttribsList); return highlightArgs; } /// /// 链接 /// /// /// /// public AnnotHandlerEventArgs GetLink(List selectedArgs = null, AnnotAttribEvent annotAttribEvent = null) { Dictionary annotAttribsList = new Dictionary(); LinkAnnotArgs linkArgs = new LinkAnnotArgs(); DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotLink); if (annotProperty != null) { } if (selectedArgs != null && selectedArgs.Count > 1) { if (linkArgs != null) { selectedArgs = new List(); selectedArgs.Add(linkArgs); } } else { linkArgs.URI = string.Empty; linkArgs.LinkType = LINK_TYPE.GOTO; linkArgs.DestIndex = -1; } annotAttribsList[AnnotAttrib.LinkType] = linkArgs.LinkType; annotAttribsList[AnnotAttrib.LinkUri] = linkArgs.URI; annotAttribsList[AnnotAttrib.LinkDestIndx] = linkArgs.DestIndex; AddToPropertyPanel("LinkAnnotProperty", "Link", selectedArgs, annotAttribsList, annotAttribEvent); return linkArgs; } /// /// 下划线 /// /// /// private AnnotHandlerEventArgs GetUnderLine(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); TextUnderlineAnnotArgs underlineArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { underlineArgs = new TextUnderlineAnnotArgs(); underlineArgs.Color = Color.FromRgb(0x12, 0xFD, 0xFF); underlineArgs.Transparency = 1; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotUnderline); if (annotProperty != null) { underlineArgs.Color = annotProperty.ForgoundColor; underlineArgs.Transparency = annotProperty.Opacity; underlineArgs.Content = annotProperty.NoteText; } if (underlineArgs != null) { selectedArgs = new List(); selectedArgs.Add(underlineArgs); } } else { underlineArgs = selectedArgs[0] as TextUnderlineAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = underlineArgs.Color; annotAttribsList[AnnotAttrib.Transparency] = underlineArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = underlineArgs.Content; AddToPropertyPanel("TextAnnotProperty", "UnderLine", selectedArgs, annotAttribsList); return underlineArgs; } /// /// 波浪线 /// /// /// private AnnotHandlerEventArgs GetSquiggly(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); TextSquigglyAnnotArgs squigglyArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { squigglyArgs = new TextSquigglyAnnotArgs(); squigglyArgs.Color = Color.FromRgb(0xFF, 0x87, 0x16); squigglyArgs.Transparency = 1; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotSquiggly); if (annotProperty != null) { squigglyArgs.Color = annotProperty.ForgoundColor; squigglyArgs.Transparency = annotProperty.Opacity; squigglyArgs.Content = annotProperty.NoteText; } if (squigglyArgs != null) { selectedArgs = new List(); selectedArgs.Add(squigglyArgs); } } else { squigglyArgs = selectedArgs[0] as TextSquigglyAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = squigglyArgs.Color; annotAttribsList[AnnotAttrib.Transparency] = squigglyArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = squigglyArgs.Content; AddToPropertyPanel("TextAnnotProperty", "Squiggly", selectedArgs, annotAttribsList); return squigglyArgs; } /// /// 删除线 /// /// /// private AnnotHandlerEventArgs GetStrikeout(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); TextStrikeoutAnnotArgs strikeoutArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { strikeoutArgs = new TextStrikeoutAnnotArgs(); strikeoutArgs.Color = Color.FromRgb(0xFF, 0x3B, 0x30); strikeoutArgs.Transparency = 1; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotStrikeout); if (annotProperty != null) { strikeoutArgs.Color = annotProperty.ForgoundColor; strikeoutArgs.Transparency = annotProperty.Opacity; strikeoutArgs.Content = annotProperty.NoteText; } if (strikeoutArgs != null) { selectedArgs = new List(); selectedArgs.Add(strikeoutArgs); } } else { strikeoutArgs = selectedArgs[0] as TextStrikeoutAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = strikeoutArgs.Color; annotAttribsList[AnnotAttrib.Transparency] = strikeoutArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = strikeoutArgs.Content; AddToPropertyPanel("TextAnnotProperty", "Strikeout", selectedArgs, annotAttribsList); return strikeoutArgs; } /// /// 手绘 /// /// /// private AnnotHandlerEventArgs GetFreehand(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); FreehandAnnotArgs freehandArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { freehandArgs = new FreehandAnnotArgs(); freehandArgs.InkColor = Color.FromRgb(0x38, 0xE0, 0x2E); freehandArgs.Transparency = 1; freehandArgs.LineWidth = 2; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotFreehand); if (annotProperty != null) { freehandArgs.InkColor = annotProperty.ForgoundColor; freehandArgs.Transparency = annotProperty.Opacity; freehandArgs.LineWidth = annotProperty.Thickness; freehandArgs.Content = annotProperty.NoteText; } if (freehandArgs != null) { selectedArgs = new List(); selectedArgs.Add(freehandArgs); } } else { freehandArgs = selectedArgs[0] as FreehandAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = freehandArgs.InkColor; annotAttribsList[AnnotAttrib.Transparency] = freehandArgs.Transparency; annotAttribsList[AnnotAttrib.Thickness] = freehandArgs.LineWidth; annotAttribsList[AnnotAttrib.NoteText] = freehandArgs.Content; AddToPropertyPanel("FreehandAnnotProperty", "Freehand", selectedArgs, annotAttribsList); return freehandArgs; } /// /// 文本 /// /// /// private AnnotHandlerEventArgs GetFreetext(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); FreeTextAnnotArgs freetextArgs = null; TextAlignment textAlignment; if (selectedArgs == null || selectedArgs.Count == 0) { freetextArgs = new FreeTextAnnotArgs(); freetextArgs.Align = TextAlignment.Left; freetextArgs.BgColor = Colors.Transparent; freetextArgs.FontFamily = new FontFamily(Settings.Default.AppProperties.Annotate.TextFontFamaily); freetextArgs.FontColor = Colors.Black; freetextArgs.FontSize = 14; freetextArgs.Transparency = 1; freetextArgs.LineColor = Colors.Black; freetextArgs.LineWidth = 0; freetextArgs.TextContent = string.Empty; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotFreeText); if (annotProperty != null) { freetextArgs.Align = annotProperty.TextAlign; freetextArgs.BgColor = annotProperty.BackgroundColor; freetextArgs.FontFamily = new FontFamily(annotProperty.FontFamily); freetextArgs.FontColor = annotProperty.ForgoundColor; freetextArgs.FontSize = annotProperty.FontSize; freetextArgs.Transparency = annotProperty.Opacity; freetextArgs.LineColor = annotProperty.BorderColor; freetextArgs.LineWidth = annotProperty.Thickness; freetextArgs.TextContent = annotProperty.NoteText; freetextArgs.FontWeight = annotProperty.FontWeight; freetextArgs.FontStyle = annotProperty.FontStyle; } int align = (int)Settings.Default.AppProperties.Annotate.TextAlign; if (align == 0) textAlignment = TextAlignment.Left; else if (align == 1) textAlignment = TextAlignment.Center; else textAlignment = TextAlignment.Right; if (freetextArgs != null) { selectedArgs = new List(); selectedArgs.Add(freetextArgs); } } else { freetextArgs = selectedArgs[0] as FreeTextAnnotArgs; textAlignment = freetextArgs.Align; } annotAttribsList[AnnotAttrib.Color] = freetextArgs.LineColor; annotAttribsList[AnnotAttrib.FillColor] = freetextArgs.BgColor; annotAttribsList[AnnotAttrib.Thickness] = freetextArgs.LineWidth; annotAttribsList[AnnotAttrib.Transparency] = freetextArgs.Transparency; annotAttribsList[AnnotAttrib.FontColor] = freetextArgs.FontColor; annotAttribsList[AnnotAttrib.FontSize] = freetextArgs.FontSize; annotAttribsList[AnnotAttrib.FontFamily] = freetextArgs.FontFamily; annotAttribsList[AnnotAttrib.FontStyle] = freetextArgs.FontStyle; annotAttribsList[AnnotAttrib.FontWeight] = freetextArgs.FontWeight; annotAttribsList[AnnotAttrib.TextAlign] = textAlignment; annotAttribsList[AnnotAttrib.NoteText] = freetextArgs.TextContent; AddToPropertyPanel("FreetextAnnotProperty", "Freetext", selectedArgs, annotAttribsList); return freetextArgs; } /// /// 便签 /// /// /// private AnnotHandlerEventArgs GetStickyNote(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); StickyAnnotArgs stickyAnnotArgs = new StickyAnnotArgs(); if (selectedArgs == null || selectedArgs.Count == 0) { stickyAnnotArgs.Color = Color.FromRgb(0xFF, 0x81, 0x33); stickyAnnotArgs.StickyNote = string.Empty; stickyAnnotArgs.Transparency = 1; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotSticky); if (annotProperty != null) { stickyAnnotArgs.Color = annotProperty.ForgoundColor; stickyAnnotArgs.StickyNote = annotProperty.NoteText; stickyAnnotArgs.Transparency = annotProperty.Opacity; } if (stickyAnnotArgs != null) { selectedArgs = new List(); selectedArgs.Add(stickyAnnotArgs); } } else { stickyAnnotArgs = selectedArgs[0] as StickyAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = stickyAnnotArgs.Color; annotAttribsList[AnnotAttrib.Transparency] = stickyAnnotArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = stickyAnnotArgs.StickyNote; annotAttribsList[AnnotAttrib.StickyIcon] = stickyAnnotArgs.IconName; List stickyAnnotArgsList = new List(); if (stickyAnnotArgs != null) stickyAnnotArgsList.Add(stickyAnnotArgs); AddToPropertyPanel("StickyNoteProperty", "StickyNote", selectedArgs, annotAttribsList); return stickyAnnotArgs; } /// /// 矩形 /// /// /// private AnnotHandlerEventArgs GetRect(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); SquareAnnotArgs squareArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { squareArgs = new SquareAnnotArgs(); squareArgs.LineColor = Colors.Red; squareArgs.BgColor = Colors.Transparent; squareArgs.LineWidth = 1; squareArgs.Transparency = 1; squareArgs.LineDash = DashStyles.Solid; squareArgs.Content = string.Empty; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotSquare); if (annotProperty != null) { squareArgs.LineColor = annotProperty.BorderColor; squareArgs.BgColor = annotProperty.BackgroundColor; if (annotProperty.DashArray == null || annotProperty.DashArray.Count == 0) { squareArgs.LineDash = DashStyles.Solid; } else { DashStyle dash = new DashStyle(); foreach (var offset in annotProperty.DashArray) { dash.Dashes.Add(offset); } squareArgs.LineDash = dash; } squareArgs.LineWidth = annotProperty.Thickness; squareArgs.Transparency = annotProperty.Opacity; squareArgs.Content = annotProperty.NoteText; } if (squareArgs != null) { selectedArgs = new List(); selectedArgs.Add(squareArgs); } } else { squareArgs = selectedArgs[0] as SquareAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = squareArgs.LineColor; annotAttribsList[AnnotAttrib.FillColor] = squareArgs.BgColor; annotAttribsList[AnnotAttrib.LineStyle] = squareArgs.LineDash; annotAttribsList[AnnotAttrib.Thickness] = squareArgs.LineWidth; annotAttribsList[AnnotAttrib.Transparency] = squareArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = squareArgs.Content; AddToPropertyPanel("SharpsAnnotProperty", "Rect", selectedArgs, annotAttribsList); return squareArgs; } /// /// 圆 /// /// /// private AnnotHandlerEventArgs GetCircle(List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); CircleAnnotArgs circleAnnotArgs = null; if (selectedArgs == null || selectedArgs.Count == 0) { circleAnnotArgs = new CircleAnnotArgs(); circleAnnotArgs.LineColor = Colors.Red; circleAnnotArgs.BgColor = Colors.Transparent; circleAnnotArgs.LineWidth = 1; circleAnnotArgs.Transparency = 1; circleAnnotArgs.LineDash = DashStyles.Solid; circleAnnotArgs.Content = string.Empty; DefaultAnnotProperty annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotCircle); if (annotProperty != null) { circleAnnotArgs.LineColor = annotProperty.BorderColor; circleAnnotArgs.BgColor = annotProperty.BackgroundColor; if (annotProperty.DashArray == null || annotProperty.DashArray.Count == 0) { circleAnnotArgs.LineDash = DashStyles.Solid; } else { DashStyle dash = new DashStyle(); foreach (var offset in annotProperty.DashArray) { dash.Dashes.Add(offset); } circleAnnotArgs.LineDash = dash; } circleAnnotArgs.LineWidth = annotProperty.Thickness; circleAnnotArgs.Transparency = annotProperty.Opacity; circleAnnotArgs.Content = annotProperty.NoteText; } if (circleAnnotArgs != null) { selectedArgs = new List(); selectedArgs.Add(circleAnnotArgs); } } else { circleAnnotArgs = selectedArgs[0] as CircleAnnotArgs; } annotAttribsList[AnnotAttrib.Color] = circleAnnotArgs.LineColor; annotAttribsList[AnnotAttrib.FillColor] = circleAnnotArgs.BgColor; annotAttribsList[AnnotAttrib.LineStyle] = circleAnnotArgs.LineDash; annotAttribsList[AnnotAttrib.Thickness] = circleAnnotArgs.LineWidth; annotAttribsList[AnnotAttrib.Transparency] = circleAnnotArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = circleAnnotArgs.Content; AddToPropertyPanel("SharpsAnnotProperty", "Circle", selectedArgs, annotAttribsList); return circleAnnotArgs; } /// /// 箭头 线 /// /// /// /// private AnnotHandlerEventArgs GetArrowLine(string TagStr, List selectedArgs = null) { Dictionary annotAttribsList = new Dictionary(); LineAnnotArgs lineArgs = new LineAnnotArgs(); if (selectedArgs == null || selectedArgs.Count == 0) { lineArgs.LineColor = Colors.Red; lineArgs.HeadLineType = C_LINE_TYPE.LINETYPE_NONE; if (TagStr == "Line") { lineArgs.TailLineType = C_LINE_TYPE.LINETYPE_NONE; } else { lineArgs.TailLineType = C_LINE_TYPE.LINETYPE_ARROW; } lineArgs.LineDash = DashStyles.Solid; lineArgs.LineWidth = 1; lineArgs.Transparency = 1; lineArgs.Content = string.Empty; if (lineArgs != null) { selectedArgs = new List(); selectedArgs.Add(lineArgs); } } else { lineArgs = selectedArgs[0] as LineAnnotArgs; } DefaultAnnotProperty annotProperty = null; if (TagStr == "Line") { annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotLine, "Line"); if (annotProperty != null) { annotProperty.HeadLineType = C_LINE_TYPE.LINETYPE_NONE; annotProperty.TailLineType = C_LINE_TYPE.LINETYPE_NONE; } } else { annotProperty = SettingHelper.GetAnnotDefaultProperty(AnnotArgsType.AnnotLine, "Arrow"); } if (annotProperty != null) { lineArgs.LineColor = annotProperty.BorderColor; lineArgs.HeadLineType = annotProperty.HeadLineType; lineArgs.TailLineType = annotProperty.TailLineType; DashStyle dash = new DashStyle(); foreach (var offset in annotProperty.DashArray) { dash.Dashes.Add(offset); } lineArgs.LineDash = dash; lineArgs.LineWidth = annotProperty.Thickness; lineArgs.Transparency = annotProperty.Opacity; lineArgs.Content = annotProperty.NoteText; } annotAttribsList[AnnotAttrib.Color] = lineArgs.LineColor; annotAttribsList[AnnotAttrib.LineStart] = lineArgs.HeadLineType; annotAttribsList[AnnotAttrib.LineEnd] = lineArgs.TailLineType; annotAttribsList[AnnotAttrib.LineStyle] = lineArgs.LineDash; annotAttribsList[AnnotAttrib.Thickness] = lineArgs.LineWidth; annotAttribsList[AnnotAttrib.Transparency] = lineArgs.Transparency; annotAttribsList[AnnotAttrib.NoteText] = lineArgs.Content; AddToPropertyPanel("SharpsAnnotProperty", TagStr, selectedArgs, annotAttribsList); return lineArgs; } /// /// 图章 /// /// private AnnotHandlerEventArgs GetStamp() { StampAnnotArgs stampAnnotArgs = new StampAnnotArgs(); stampAnnotArgs.Opacity = 1; stampAnnotArgs.StampText = "APPROVED"; stampAnnotArgs.Type = StampType.STANDARD_STAMP; Dictionary annotAttribsList = new Dictionary(); annotAttribsList[AnnotAttrib.Transparency] = stampAnnotArgs.Opacity; List stampAnnotArgsList = new List(); if (stampAnnotArgs != null) stampAnnotArgsList.Add(stampAnnotArgs); AddToPropertyPanel("StampAnnotProperty", null, stampAnnotArgsList, annotAttribsList); return stampAnnotArgs; } /// /// 签名 /// /// private AnnotHandlerEventArgs GetSignature() { AddToPropertyPanel("SignatureAnnotProperty"); return null; } private AnnotHandlerEventArgs GetImage() { Dictionary annotAttribsList = new Dictionary(); StampAnnotArgs stampArgs = new StampAnnotArgs(); stampArgs.Opacity = 1; stampArgs.Type = StampType.IMAGE_STAMP; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;"; if (openFileDialog.ShowDialog() == true) { stampArgs.ImagePath = openFileDialog.FileName; } List stampArgsList = new List(); if (stampArgs != null) stampArgsList.Add(stampArgs); AddToPropertyPanel("ImageAnnotProperty", null, stampArgsList, annotAttribsList); return stampArgs; } /// /// 内容选择 /// /// /// private AnnotHandlerEventArgs GetSnapshotEdit() { SnapshotEditToolArgs snapshotArgs = new SnapshotEditToolArgs(); //SnapshotEditMenuViewModel snapshotEditMenuViewModel = new SnapshotEditMenuViewModel(); snapshotArgs.ControlPointColor = Colors.White; snapshotArgs.BgColor = Color.FromArgb(0x99, 0x00, 0x00, 0x00); snapshotArgs.LineColor = Color.FromArgb(0xFF, 0x47, 0x7E, 0xDE); SnapshotEditMenuViewModel.SnapToolArgs = snapshotArgs; SnapshotEditMenuViewModel.PDFViewer = PDFViewer; SnapshotEditMenuViewModel.SnapToolEvent -= SnapshotEditMenuViewModel_SnapToolEvent; SnapshotEditMenuViewModel.SnapToolEvent += SnapshotEditMenuViewModel_SnapToolEvent; #region to do //SnapshotEditMenu snapMenu = new SnapshotEditMenu(); //snapshotArgs.ToolPanel = snapMenu; //SnapshotEditMenuViewModel snapshotEditMenuViewModel = (SnapshotEditMenuViewModel)snapMenu.DataContext; //snapshotEditMenuViewModel.SnapToolArgs = snapshotArgs; //snapshotEditMenuViewModel.PDFViewer = PDFViewer; //snapshotEditMenuViewModel.ToggleBtn = annotBtn; //snapshotEditMenuViewModel.SnapToolEvent += SnapshotEditMenuViewModel_SnapToolEvent; //SnapshotEditMenuViewModel = snapshotEditMenuViewModel; #endregion to do return snapshotArgs; } /// /// 导航到同一个注释xaml时,需要区分某个注释;比如高亮、删除线、下划线 /// /// 对应的注释面板 /// 导航到同一个注释xaml时,需要区分某个注释;比如高亮、删除线、下划线 /// 注释 /// 更改注释属性的键值对,更改值后会自动记录undoRedo容器里 private void AddToPropertyPanel(string viewContent, string toolTag = null, List annots = null, Dictionary annotAttribsList = null, AnnotAttribEvent annotAttribEvent = null) { if (annots != null) { propertyPanel.annotlists = annots; propertyPanel.annot = annots[0]; } else { propertyPanel.annotlists = null; propertyPanel.annot = null; } if (annotAttribsList != null) { if(annots.Count > 1) { if (propertyPanel.AnnotEvents == null) propertyPanel.AnnotEvents = new List(); propertyPanel.AnnotEvents.Clear(); foreach (var itemAnnot in annots) { var eventitem = AnnotAttribEvent.GetAnnotAttribEvent(itemAnnot, annotAttribsList); propertyPanel.AnnotEvents.Add(eventitem); } } propertyPanel.AnnotEvent = AnnotAttribEvent.GetAnnotAttribEvent(annots[0], annotAttribsList); if (annots[0] is LinkAnnotArgs && annotAttribEvent != null) { propertyPanel.AnnotEvent = annotAttribEvent; } } if (string.IsNullOrEmpty(viewContent) == false) { viewContentViewModel.SelectedPrpoertyPanel(viewContent, propertyPanel); } } #endregion 注释工具 #region 属性面板 /// /// 展开显示属性面板 /// private void ShowPropertyPanel(bool show = true) { viewContentViewModel.IsPropertyOpen = show; } #endregion 属性面板 #region 菜单 private ContextMenu ViewerContextMenu() { ContextMenu contextMenu = App.Current.FindResource("ViewerContextMenu") as ContextMenu; //contextMenu.Loaded += ContextMenu_Loaded; ViewerContextMenu_Loaded(contextMenu, null); return contextMenu; } private void ViewerContextMenu_Loaded(object sender, RoutedEventArgs e) { ContextMenu contextMenu = sender as ContextMenu; if (contextMenu.Items.Count > 0) { int index = PDFViewer.CurrentIndex; //检测是否已存在相同数据 CPDFBookmark list = PDFViewer.Document.GetBookmarkList().FirstOrDefault(q => q.PageIndex == index); if (list != null) { isAddBookMark = false; } else { isAddBookMark = true; } foreach (var item in contextMenu.Items) { if (item is MenuItem menuItem1) { //if (menuItem1.Tag.ToString() == "DisplayAnnot" || menuItem1.Tag.ToString() == "HiddenAnnot") //{ // SetMenuItemVisibility(menuItem1, "DisplayAnnot", "HiddenAnnot", isHiddenAnnot); //} switch (menuItem1.Tag.ToString()) { case "Copy": //粘贴 if (!ApplicationCommands.Paste.CanExecute(null, (UIElement)sender)) { menuItem1.IsEnabled = false; menuItem1.Opacity = 0.5; } else { menuItem1.IsEnabled = true; menuItem1.Opacity = 1; } menuItem1.CommandTarget = (UIElement)sender; menuItem1.Command = ApplicationCommands.Copy; break; case "AddAnnotation": if (menuItem1.Items.Count > 0) { SetAddAnnotation(menuItem1.Items); } break; case "HiddenAnnot": menuItem1.Click -= HiddenAnnot_Click; menuItem1.Click += HiddenAnnot_Click; SetMenuItemVisibility(menuItem1, "DisplayAnnot", "HiddenAnnot", isHiddenAnnot); break; case "DisplayAnnot": menuItem1.Click -= DisplayAnnot_Click; menuItem1.Click += DisplayAnnot_Click; SetMenuItemVisibility(menuItem1, "DisplayAnnot", "HiddenAnnot", isHiddenAnnot); break; case "AddBookMark": menuItem1.Click -= AddBookMark_Click; menuItem1.Click += AddBookMark_Click; SetMenuItemVisibility(menuItem1, "DelBookMark", "AddBookMark", isAddBookMark); break; case "DelBookMark": menuItem1.Click -= DelBookMark_Click; menuItem1.Click += DelBookMark_Click; SetMenuItemVisibility(menuItem1, "DelBookMark", "AddBookMark", isAddBookMark); break; case "ToolMode": if (menuItem1.Items.Count > 0) { SetToolMode(menuItem1.Items); } break; case "ReadModel": SetMenuItemVisibility(menuItem1, "ReadModel", "UnReadModel", App.IsBookMode); menuItem1.Click -= ReadModel_Click; menuItem1.Click += ReadModel_Click; break; case "UnReadModel": SetMenuItemVisibility(menuItem1, "ReadModel", "UnReadModel", App.IsBookMode); menuItem1.Click -= UnReadModel_Click; menuItem1.Click += UnReadModel_Click; break; case "ViewZoom": if (menuItem1.Items.Count > 0) { ViewZoom(menuItem1.Items); } break; case "PageDisplay": if (menuItem1.Items.Count > 0) { PageDisplay(menuItem1.Items); } break; case "Select": menuItem1.Click -= Select_Click; menuItem1.Click += Select_Click; break; case "Print": menuItem1.Command = viewContentViewModel.PrintCommand; break; } } } } } private void SetMenuItemVisibility(MenuItem menuItem1, string right, string deny, bool flag) { if (menuItem1.Tag.ToString() == right && flag) { menuItem1.Visibility = Visibility.Collapsed; } if (menuItem1.Tag.ToString() == right && flag == false) { menuItem1.Visibility = Visibility.Visible; } if (menuItem1.Tag.ToString() == deny && flag == false) { menuItem1.Visibility = Visibility.Collapsed; } if (menuItem1.Tag.ToString() == deny && flag) { menuItem1.Visibility = Visibility.Visible; } } private ContextMenu SelectAnnotContextMenu(object sender) { var popMenu = App.Current.FindResource("SelectAnnotContextMenu") as ContextMenu; if (popMenu != null && popMenu.Items.Count == 4) { //剪切 MenuItem menuItem = popMenu.Items[0] as MenuItem; menuItem.CommandTarget = (UIElement)sender; menuItem.Command = ApplicationCommands.Cut; //复制 menuItem = popMenu.Items[1] as MenuItem; menuItem.CommandTarget = (UIElement)sender; menuItem.Command = ApplicationCommands.Copy; //删除 menuItem = popMenu.Items[2] as MenuItem; menuItem.CommandTarget = (UIElement)sender; menuItem.Command = ApplicationCommands.Delete; //笔记 //menuItem = popMenu.Items[2] as MenuItem; //menuItem.CommandTarget = (UIElement)sender; //menuItem.Command = ApplicationCommands.no; } return popMenu; } private ContextMenu NoneSelectAnnotContextMenu(object sender, AnnotCommandArgs annotCommand) { ContextMenu popMenu = new ContextMenu(); popMenu.FontSize = 14; MenuItem menuItem = new MenuItem(); menuItem = new MenuItem(); menuItem.CommandTarget = (UIElement)sender; menuItem.Command = ApplicationCommands.Copy; popMenu.Items.Add(menuItem); menuItem = new MenuItem(); menuItem.CommandTarget = (UIElement)sender; menuItem.Command = ApplicationCommands.Paste; popMenu.Items.Add(menuItem); Separator separator = null; if (annotCommand.CommandTarget == TargetType.ImageSelection) { separator = SetSeparator(); popMenu.Items.Add(separator); SetSelectTextOrImageMenuItem("导出图片...", "ExportPicture", annotCommand, out menuItem); popMenu.Items.Add(menuItem); } else if (annotCommand.CommandTarget == TargetType.Annot) { separator = SetSeparator(); popMenu.Items.Add(separator); SetSelectTextOrImageMenuItem("高亮", "HighLight", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("下划线", "UnderLine", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("删除线", "Strikeout", annotCommand, out menuItem); popMenu.Items.Add(menuItem); } separator = SetSeparator(); popMenu.Items.Add(separator); SetSelectTextOrImageMenuItem("文本", "Freetext", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("便签", "StickyNote", annotCommand, out menuItem); popMenu.Items.Add(menuItem); separator = SetSeparator(); popMenu.Items.Add(separator); SetSelectTextOrImageMenuItem("矩形", "Rect", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("椭圆形", "Circle", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("直线", "Line", annotCommand, out menuItem); popMenu.Items.Add(menuItem); separator = SetSeparator(); popMenu.Items.Add(separator); SetSelectTextOrImageMenuItem("添加链接", "Link", annotCommand, out menuItem); popMenu.Items.Add(menuItem); SetSelectTextOrImageMenuItem("添加大纲", "OutLine", annotCommand, out menuItem); popMenu.Items.Add(menuItem); return popMenu; } private void SetSelectTextOrImageMenuItem(string header, string tag, AnnotCommandArgs annotCommand, out MenuItem menuItem) { menuItem = new MenuItem(); menuItem.Header = header; menuItem.Tag = tag; menuItem.Click -= AnnotToolMenu_Click; menuItem.Click += AnnotToolMenu_Click; menuItem.CommandParameter = annotCommand; } private Separator SetSeparator() { Separator separator = new Separator { Height = 1, BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#33000000")), BorderThickness = new Thickness(1), Style = (Style)App.Current.FindResource(System.Windows.Controls.ToolBar.SeparatorStyleKey) }; return separator; } private void AnnotToolMenu_Click(object sender, RoutedEventArgs e) { if (sender is MenuItem clickMenu && clickMenu.CommandParameter is AnnotCommandArgs) { AnnotCommandArgs annotCommand = clickMenu.CommandParameter as AnnotCommandArgs; switch (clickMenu.Tag.ToString()) { case "HighLight"://字体高亮 TextHighlightAnnotArgs highlightArgs = (TextHighlightAnnotArgs)GetHighLight(); highlightArgs.ClientRect = annotCommand.TextRect; highlightArgs.Content = annotCommand.Text; highlightArgs.Author = Settings.Default.AppProperties.Description.Author; PDFViewer.SetMouseMode(MouseModes.AnnotCreate); PDFViewer.SetToolParam(highlightArgs); PDFViewer.SetMouseMode(MouseModes.PanTool); break; case "UnderLine"://下划线 TextUnderlineAnnotArgs underlineArgs = (TextUnderlineAnnotArgs)GetUnderLine(); underlineArgs.ClientRect = annotCommand.TextRect; underlineArgs.Content = annotCommand.Text; underlineArgs.Author = Settings.Default.AppProperties.Description.Author; PDFViewer.SetMouseMode(MouseModes.AnnotCreate); PDFViewer.SetToolParam(underlineArgs); PDFViewer.SetMouseMode(MouseModes.PanTool); break; case "Strikeout"://删除线 TextStrikeoutAnnotArgs strikeoutArgs = (TextStrikeoutAnnotArgs)GetStrikeout(); strikeoutArgs.ClientRect = annotCommand.TextRect; strikeoutArgs.Content = annotCommand.Text; strikeoutArgs.Author = Settings.Default.AppProperties.Description.Author; PDFViewer.SetMouseMode(MouseModes.AnnotCreate); PDFViewer.SetToolParam(strikeoutArgs); PDFViewer.SetMouseMode(MouseModes.PanTool); break; case "Freetext"://文本 FreeTextAnnotArgs textArgs = (FreeTextAnnotArgs)GetFreetext(); textArgs.ClientRect = annotCommand.TextRect; //textArgs.Transparency = 1; //textArgs.BgColor = Colors.Transparent; //textArgs.LineColor = Colors.Red; //textArgs.LineWidth = 2; textArgs.TextContent = annotCommand.Text; PDFViewer.CreatePageAnnot(annotCommand.PageIndex, textArgs); break; case "StickyNote"://便签 StickyAnnotArgs stickyAnnotArgs = (StickyAnnotArgs)GetStickyNote(); stickyAnnotArgs.ClientRect = annotCommand.TextRect; PDFViewer.CreatePageAnnot(annotCommand.PageIndex, stickyAnnotArgs); break; case "Rect"://矩形 SquareAnnotArgs squareAnnotArgs = (SquareAnnotArgs)GetRect(); squareAnnotArgs.ClientRect = annotCommand.TextRect; PDFViewer.CreatePageAnnot(annotCommand.PageIndex, squareAnnotArgs); break; case "Circle"://圆 CircleAnnotArgs circleAnnotArgs = (CircleAnnotArgs)GetCircle(); circleAnnotArgs.ClientRect = annotCommand.TextRect; PDFViewer.CreatePageAnnot(annotCommand.PageIndex, circleAnnotArgs); break; case "Line"://线 LineAnnotArgs lineAnnotArgs = (LineAnnotArgs)GetArrowLine(clickMenu.Tag.ToString()); lineAnnotArgs.ClientRect = annotCommand.TextRect; lineAnnotArgs.LinePoints.Add(new Point(annotCommand.TextRect.Left, annotCommand.TextRect.Top)); lineAnnotArgs.LinePoints.Add(new Point(annotCommand.TextRect.Right, annotCommand.TextRect.Bottom)); PDFViewer.CreatePageAnnot(annotCommand.PageIndex, lineAnnotArgs); break; case "Link"://链接 LinkAnnotArgs linkArgs = new LinkAnnotArgs(); linkArgs.ClientRect = annotCommand.TextRect; linkArgs.URI = string.Empty; linkArgs.LinkType = LINK_TYPE.GOTO; linkArgs.DestIndex = annotCommand.PageIndex; PDFViewer.CreatePageAnnot(annotCommand.PageIndex, linkArgs); BtnLinkIsChecked = true; List lists = new List(); lists.Add(linkArgs); AnnotHandlerEventArgs annotArgs = GetLink(lists); PDFViewer.SetMouseMode(MouseModes.AnnotCreate); PDFViewer.SetToolParam(annotArgs); viewContentViewModel.IsPropertyOpen = true; break; case "OutLine": bool isTabItemAnnotation = IsBOTATabItemShow(out BOTAContentViewModel bOTAContentViewModel, out BOTAContent bOTAContent, "TabItemOutLine"); if (isTabItemAnnotation == false) { bOTAContent.TabItemOutLine.IsSelected = true; } OutLineControlViewModel outLineControlViewModel = GetOutLineControlViewModel(bOTAContentViewModel, out OutLineControl outLineControl); if (outLineControlViewModel != null && outLineControl != null) { string str = null; if (string.IsNullOrEmpty(annotCommand.Text)) { str = (annotCommand.PageIndex + 1).ToString(); } else { str = annotCommand.Text; } OutlineNode outline = outLineControl.AddOutlineNode(str); CPDFOutline result = outline.Outline; if (result != null) { outLineControlViewModel.SetTitle(result, str); outLineControlViewModel.Updata(false); //outLineControl.IsReName = true; //if (outLineControl.OutlineView.SelectedItem is OutlineNode selectOutLine) //{ // outLineControl.ReNameOutlineNode = outline; //} } } break; case "ExportPicture": ExportPicture_MenuItemClick(); break; } //ShowPropertyPanel(false); } } private void ExportPicture_MenuItemClick() { //图片提取 try { List imageList = new List(); Dictionary> imageDict = PDFViewer?.GetSelectedImages(); foreach (int pageIndex in imageDict.Keys) { imageList = imageDict[pageIndex]; } string path = PDFViewer.Document.FileName; System.Windows.Forms.FolderBrowserDialog folderDialog = new FolderBrowserDialog(); if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { int i = 1; int pagenum = 1; string choosePath = folderDialog.SelectedPath; string sPath = choosePath + "\\" + path + "_Extract Image"; sPath = GetExportPathName(sPath); if (!Directory.Exists(sPath)) { Directory.CreateDirectory(sPath); } if (Directory.Exists(sPath)) { foreach (System.Drawing.Bitmap image in imageList) { foreach (var item in imageDict.Keys) { pagenum = item; } string filename = path + "_" + "Page" + (pagenum + 1).ToString() + "_" + GetNum(i); string savePath = System.IO.Path.Combine(sPath, filename + ".jpg"); image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg); i++; } System.Diagnostics.Process.Start("explorer", "/select,\"" + sPath + "\""); } } } catch (Exception ex) { } } public string GetExportPathName(string path) { int i = 1; string outpath = path; while (Directory.Exists(outpath)) { outpath = path + $"({i.ToString()})"; i++; } return outpath; } private string GetNum(int num) { if (num % 10 < 1) { return "00" + num.ToString(); } if (num % 10 >= 1 && num % 10 < 10) { return "0" + num.ToString(); } else { return num.ToString(); } } #endregion 菜单 } }