using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; using ComPDFKitViewer.PdfViewer; using PDF_Master.Model; using System.Collections.ObjectModel; using PDF_Master.Model.PageEdit; using Prism.Commands; using System.Windows; using System.Windows.Media.Imaging; using System.Windows.Controls.Primitives; using System.Diagnostics; using System.Windows.Controls; using System.Windows.Threading; using Prism.Events; using PDF_Master.EventAggregators; using System.Windows.Input; using PDF_Master.Helper; using Microsoft.Win32; using ComPDFKit.PDFDocument; using PDF_Master.CustomControl; using PDF_Master.Model.HomePageToolsDialogs; using System.IO; using System.Text.RegularExpressions; namespace PDF_Master.ViewModels.PageEdit { public class PageEditContentViewModel : BindableBase, INavigationAware { #region 文案 private string T_title; public string T_Title { get { return T_title; } set { SetProperty(ref T_title, value); } } private void InitString() { T_Title = App.MainPageLoader.GetString("Thumbnails_Title"); } #endregion private CPDFViewer PDFViewer; private ViewContentViewModel viewContentViewModel; private IDialogService dialogs; private IEventAggregator eventor; /// /// 用于筛选多窗体时间的唯一识别码 /// private string unicode = null; /// /// Undo操作记录栈 /// 只有插入、移位、旋转,倒序需要记录 /// private Stack UndoStack = new Stack(); /// /// Redo操作记录栈 /// private Stack RedoStack = new Stack(); /// /// 项数据集合 /// public ObservableCollection PageEditItems { get; set; } /// /// 页面范围的项集合 /// public ObservableCollection PageRangeItems { get; set; } #region 属性 /// /// 是否是第一次加载 /// private bool isFirstLoad = true; /// /// 记录多选项中最后一项的索引 /// private int maxSelectedIndex = 0; private Visibility showTip = Visibility.Collapsed; /// /// 是否显示渐隐提示 /// public Visibility ShowTip { get { return showTip; } set { SetProperty(ref showTip, value); } } private Visibility isLoading = Visibility.Collapsed; /// /// 是否正在处理中 /// public Visibility IsLoading { get { return isLoading; } set { SetProperty(ref isLoading, value); } } private int listSelecedIndex; /// /// 缩略图选中项的索引 /// public int ListSelectedIndex { get { return listSelecedIndex; } set { SetProperty(ref listSelecedIndex, value); //显示页面范围选择控件 TbPageRangeVisibility = Visibility.Visible; TbPageRange = (ListSelectedIndex + 1).ToString(); TxtPageInputVisibility = Visibility.Collapsed; if(IsBOTAThumb==Visibility.Visible&&PDFViewer!=null) { PDFViewer.GoToPage(listSelecedIndex); } } } private bool isMultiSelected; /// /// 是否有多选 用于判断倒序和替换功能 /// public bool IsMultiSelected { get { return isMultiSelected; } set { SetProperty(ref isMultiSelected, value); } } private int comboxSelectIndex; /// /// 下拉框选项集合 /// public int ComboxSelectIndex { get { return comboxSelectIndex; } set { SetProperty(ref comboxSelectIndex, value); //选中指定的页面范围 SuitPageRange(comboxSelectIndex); //隐藏tb页面范围显示控件 TbPageRangeVisibility = Visibility.Collapsed; } } private Visibility tbPageRangeVisibility = Visibility.Visible; /// /// 页面范围的文本显示 /// public Visibility TbPageRangeVisibility { get { return tbPageRangeVisibility; } set { SetProperty(ref tbPageRangeVisibility, value); if (value == Visibility.Visible) { comboxSelectIndex = -1; } } } private string tbPageRange; /// /// 页面范围显示的内容 /// public string TbPageRange { get { return tbPageRange; } set { SetProperty(ref tbPageRange, value); if(string.IsNullOrEmpty(TbPageRange)) { TbPageRange = "请输入范围"; } } } private Visibility txtPageInputVisibility = Visibility.Collapsed; /// /// 页面自定义输入框的显示 /// public Visibility TxtPageInputVisibility { get { return txtPageInputVisibility; } set { SetProperty(ref txtPageInputVisibility, value); } } /// /// 页面缩放状态,-1 为最小值,1为最大值 /// private int zoomIndex = 0; public int ZoomIndex { get { return zoomIndex; } set { SetProperty(ref zoomIndex, value); } } private string toastText = App.MainPageLoader.GetString("PageEdit_Failed"); /// /// Toast提示 /// public string ToastText { get { return toastText; } set { SetProperty(ref toastText, value); } } private Visibility isBOTAThumb = Visibility.Collapsed; /// /// 是否是BOTA侧边栏的缩略图 /// public Visibility IsBOTAThumb { get { return isBOTAThumb; } set { SetProperty(ref isBOTAThumb, value); } } private Visibility hasShowPageSize = Visibility.Collapsed; /// /// 是否显示页面尺寸 /// public Visibility HasShowPageSize { get { return hasShowPageSize; } set { SetProperty(ref hasShowPageSize, value); } } private bool canUndo; /// /// 是否可以进行Undo操作 /// public bool CanUndo { get { return canUndo; } set { SetProperty(ref canUndo, value); if (viewContentViewModel != null) { viewContentViewModel.CanUndo = this.CanUndo; } } } private bool canRedo; /// /// 是否可以进行Redo操作 /// public bool CanRedo { get { return canRedo; } set { SetProperty(ref canRedo, value); if(viewContentViewModel!=null) { viewContentViewModel.CanRedo = this.CanRedo; } } } private bool canPaste = false; /// /// 是否可以粘贴 /// public bool CanPaste { get { return canPaste; } set { SetProperty(ref canPaste, value); } } /// /// 页面缩放的范围 /// private List ItemSizes = new List() { new Size(104,142), new Size(208, 294), new Size(312,441) }; //选中的页面集合 private List selectedPageList = new List(); #endregion #region 命令 public DelegateCommand SelectionChangedCommand { get; set; } /// /// 拦截键盘输入的事件 /// public DelegateCommand PreviewKeyDown { get; set; } /// /// 响应键盘回车事件 /// public DelegateCommand KeyDown { get; set; } /// ///文本框失去焦点事件 /// public DelegateCommand LostFocusCommand { get; set; } /// /// 粘贴 /// public DelegateCommand PasteCommand { get; set; } /// /// 复制 /// public DelegateCommand CopyCommand { get; set; } /// /// 剪切 /// public DelegateCommand CutCommand { get; set; } /// /// 替换文件 /// public DelegateCommand ReplaceCommand { get; set; } /// /// 插入文件命令 /// public DelegateCommand InsertCommand { get; set; } /// /// 拆分文件 /// public DelegateCommand SplitCommand { get; set; } /// /// 提取文件 /// public DelegateCommand ExtractCommand { get; set; } /// /// 逆时针旋转 /// public DelegateCommand LeftRotateCommand { get; set; } /// /// 顺时针旋转 /// public DelegateCommand RightRotateCommand { get; set; } /// /// 删除 /// public DelegateCommand DeleteCommand { get; set; } /// /// 倒序 /// public DelegateCommand ReverseCommand { get; set; } /// /// 打印 /// public DelegateCommand PrintCommand { get; set; } /// /// 放大 /// public DelegateCommand ZoomInCommand { get; set; } /// /// 缩小 /// public DelegateCommand ZoomOutCommand { get; set; } /// /// 显示页面大小 /// public DelegateCommand ShowPageSizeCommand { get; set; } public DelegateCommand ClearSelectedCommand { get; set; } #endregion public PageEditContentViewModel(IDialogService dialogService, IEventAggregator eventAggregator) { //变量初始化 dialogs = dialogService; eventor = eventAggregator; unicode = App.mainWindowViewModel.SelectedItem.Unicode; PageEditItems = new ObservableCollection(); PageRangeItems = new ObservableCollection(); //绑定命令 SelectionChangedCommand = new DelegateCommand(SelectionChangedEvent); PreviewKeyDown = new DelegateCommand(PreviewKeyDownEvent); KeyDown = new DelegateCommand(KeyDownEvent); LostFocusCommand = new DelegateCommand(lostfocus); SplitCommand = new DelegateCommand(SplitCommandEvent); InsertCommand = new DelegateCommand(InsertCommandEvent); ReplaceCommand = new DelegateCommand(ReplaceCommandEvent, CanReplaceCommandExcute).ObservesProperty(() => IsMultiSelected); ExtractCommand = new DelegateCommand(ExtractCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex); DeleteCommand = new DelegateCommand(DeleteCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex); LeftRotateCommand = new DelegateCommand(LeftRotateCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex); RightRotateCommand = new DelegateCommand(RightRotateCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex); ReverseCommand = new DelegateCommand(ReverseCommandEvent, CanFileCommandExcute).ObservesProperty(() => ListSelectedIndex); ZoomInCommand = new DelegateCommand(ZoomInCommandEvent, CanZoomIn).ObservesProperty(() => ZoomIndex); ZoomOutCommand = new DelegateCommand(ZoomOutCommandEvent, CanZoomOut).ObservesProperty(() => ZoomIndex); ShowPageSizeCommand = new DelegateCommand(ShowPageSize); CopyCommand = new DelegateCommand(copy); PasteCommand = new DelegateCommand(paste,CanPasteExcute).ObservesProperty(() => CanPaste); CutCommand = new DelegateCommand(cut); PrintCommand = new DelegateCommand(print); ClearSelectedCommand = new DelegateCommand(clearSelected); //订阅页面刷新事件 eventAggregator.GetEvent().Subscribe(OnPageEditRefreshEvent, e => e.Unicode == unicode); CacheFilePath.Instance.PropertyChanged += Instance_PropertyChanged; RefreshPageRangeItem(); InitString(); } #region 事件 private void Instance_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if(e.PropertyName=="CopyDoc") { if(CacheFilePath.Instance.CopyDoc!=null) { CanPaste = true; } } } /// /// 替换功能的逻辑 /// private async void ReplaceCommandEvent() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = false; dialog.Filter = PDF_Master.Properties.Resources.OpenDialogFilter; if ((bool)dialog.ShowDialog()) { IsLoading = Visibility.Visible; await Task.Delay(200); int pageCount = PDFViewer.Document.PageCount; int insertIndex = listSelecedIndex; //从文件插入到指定位置 var result = await InsertFromFile(listSelecedIndex+1,dialog.FileName); if(result) { //插入成功后再删除原有页面 DoRemoveSelectedPages(new List() { listSelecedIndex }); } ReloadAfterOption(true, true, Tuple.Create(insertIndex-1, insertIndex + pageCount)); IsLoading = Visibility.Collapsed; } } /// /// 拆分功能的逻辑 /// private void SplitCommandEvent() { DialogParameters valuePairs = new DialogParameters(); valuePairs.Add(ParameterNames.PDFViewer, PDFViewer); dialogs.ShowDialog(DialogNames.SplitDialog, valuePairs,e=> { if(e.Result==ButtonResult.OK&&e.Parameters!=null) { var model = e.Parameters.GetValue(ParameterNames.DataModel); DoSplitPages(model); } }); } /// /// 提取功能的逻辑 /// private void ExtractCommandEvent() { dialogs.ShowDialog(DialogNames.ExtractDialog,null,e=> { if(e.Result==ButtonResult.OK&&e.Parameters!=null) { var model = e.Parameters.GetValue(ParameterNames.DataModel); DoExtractPages(model.IsEveryPageToFile,model.IsDeleteAfterExtract); } }); } /// /// 插入功能的逻辑 /// private async void InsertCommandEvent(object type) { if((string)type==null) { return; } //获取插入位置 int insertIndex = 0; if(listSelecedIndex<0) { insertIndex = 0; } else { insertIndex = listSelecedIndex+1; if(isMultiSelected) { insertIndex = maxSelectedIndex+1; } } IsLoading = Visibility.Visible; await Task.Delay(3); PageEditHistory history = new PageEditHistory(); history.InsertIndex = insertIndex; if((string)type==ParameterNames.InsertType_Blank) { history.Type = ActionType.InsertCustomPages; history.InsertFilePath = ""; //插入空白页面 bool result; if (insertIndex == 0) { result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex].Size.Width, PageEditItems[insertIndex].Size.Height, null); history.PageSize = PageEditItems[insertIndex].Size; } else { result = PDFViewer.Document.InsertPage(insertIndex, PageEditItems[insertIndex-1].Size.Width, PageEditItems[insertIndex-1].Size.Height, null); history.PageSize = PageEditItems[insertIndex - 1].Size; } if(!result) { IsLoading = Visibility.Collapsed; ShowToast(); return; } //UI层插入Item var item = GetNewPageEditItem(insertIndex); PageEditItems.Insert(insertIndex,item); ReloadAfterOption(true,true,Tuple.Create(insertIndex,insertIndex+1)); await Task.Delay(10); //选中插入的页面 ListSelectedIndex = insertIndex; } else if((string)type == ParameterNames.InsertType_File) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = false; dialog.Filter = PDF_Master.Properties.Resources.OpenDialogFilter; if ((bool)dialog.ShowDialog()) { //插入文件 var result = await InsertFromFile(insertIndex,dialog.FileName); if(!result) { IsLoading = Visibility.Collapsed; ShowToast(); return; } ReloadAfterOption(true,true,Tuple.Create(0,PDFViewer.Document.PageCount)); } IsLoading = Visibility.Collapsed; //里面附带了Undo栈记录,需要提前返回,避免重复记录 return; } else { DialogParameters keyValuePairs = new DialogParameters(); Size size = new Size(); size.Width =CommonHelper.GetUnitsFromPageSize(PDFViewer.Document.GetPageSize(listSelecedIndex).Width); size.Height = CommonHelper.GetUnitsFromPageSize(PDFViewer.Document.GetPageSize(listSelecedIndex).Height); keyValuePairs.Add("CurrentPageSize", size); //插入自定义页面 dialogs.ShowDialog(DialogNames.InsertDialog, keyValuePairs,e=> { if(e.Result == ButtonResult.OK&&e.Parameters!=null) { var model = e.Parameters.GetValue(ParameterNames.DataModel); var result = InsertFromCustomPage(insertIndex, model.width, model.height, model.filepath); if(!result) { return; } history.Type = ActionType.InsertCustomPages; history.InsertFilePath = model.filepath; history.PageSize = new Size(model.width,model.height); } }); } IsLoading = Visibility.Collapsed; //添加记录到Undo栈,清除Redo栈 AddToUndoStack(history); } /// /// 删除选中页面 /// private async void DeleteCommandEvent() { IsLoading = Visibility.Visible; await Task.Delay(3); DoRemoveSelectedPages(); ReloadAfterOption(true, true, Tuple.Create(0,PDFViewer.Document.PageCount)); IsLoading = Visibility.Collapsed; } /// /// 左旋转页面的逻辑 /// private void LeftRotateCommandEvent() { RotateSelectedPages(false); } /// /// 右旋转页面的逻辑 /// private void RightRotateCommandEvent() { RotateSelectedPages(); } /// /// 页面倒序的逻辑 /// private async void ReverseCommandEvent() { IsLoading = Visibility.Visible; await Task.Delay(3); List pages = new List(); for (int i = 0; i /// 将指定页面结合进行倒序 /// private async void DoReverse(List pages, bool isFromUndoRedo = false) { if (pages.Count <= 1) { ShowToast("请至少选择两个图片进行倒序操作。"); return; } pages.Sort(); //记录原位置和目标位置 用于undo,redo Dictionary sourceTarget = new Dictionary(); for (int i = 0; i < pages.Count; i++) { int preindex = pages[i]; int laterIndex = pages[pages.Count - i - 1];//尾部的索引 if (laterIndex <= preindex)//交换完成 { //用于记录选中集合为奇数时,最中间Item的还原 sourceTarget.Add(preindex, preindex); break; } var result = ExchangeItem(preindex,laterIndex); if(!result) { ShowToast(); IsLoading = Visibility.Collapsed; return; } sourceTarget.Add(preindex, laterIndex); } await Task.Delay(20); //转换成页码数据集合,传递给UI,选中目标页面 //因虚拟化加载的问题,通过Selected来控制Item选中效果会有问题 List pageRange = new List(); for (int i = 0; i < pages.Count; i++) { pageRange.Add(pages[i] + 1); } NotifyUIToRefresh(pageRange); ReloadAfterOption(true, true, null); if(!isFromUndoRedo) { PageEditHistory history = new PageEditHistory(); history.Type = ActionType.Reverse; history.SourceTargetValue = sourceTarget; AddToUndoStack(history); } } /// /// 交换两个Item顺序 /// /// /// /// private bool ExchangeItem(int preiIndex,int laterIndex) { if (preiIndex == laterIndex) { return true; } var sourceitem = PageEditItems[preiIndex]; var targetitem = PageEditItems[laterIndex]; var result = PDFViewer.Document.ExchangePage(preiIndex, laterIndex); if (!result) { return false; } PageEditItems.Remove(sourceitem); PageEditItems.Remove(targetitem); PageEditItems.Insert(preiIndex, targetitem); PageEditItems.Insert(laterIndex, sourceitem); //PageEditItems.Remove(targetitem); //PageEditItems.Insert(laterIndex, sourceitem); //PageEditItems.Remove(sourceitem); //PageEditItems.Insert(preiIndex, targetitem); return true; } /// /// 是否可以执行文件操作命令 除插入、拆分外 /// /// private bool CanFileCommandExcute() { if (ListSelectedIndex < 0) { return false; } else { return true; } } /// /// 校验是否可以替换 /// /// private bool CanReplaceCommandExcute() { return !IsMultiSelected; } /// /// 放大页面 /// private void ZoomInCommandEvent() { ZoomIndex++; ChangeItemSize(ItemSizes[ZoomIndex+1]); NotifyUIToRefresh(); } /// /// 缩小页面 /// private void ZoomOutCommandEvent() { ZoomIndex--; ChangeItemSize(ItemSizes[ZoomIndex+1]); NotifyUIToRefresh(); } /// /// /// /// public void ChangeItemSize(Size newsize) { for (int i = 0; i < PageEditItems.Count; i++) { PageEditItems[i].ItemSize = newsize; } //缩略图模式 调整item大小的时候,更新选中项 NotifyUIToRefresh(new List() { PDFViewer.CurrentIndex + 1 }); } private bool CanZoomIn() { if (ZoomIndex >= 1) { return false; } else { return true; } } private bool CanZoomOut() { if (ZoomIndex <= -1) { return false; } else { return true; } } /// /// 响应UI发送刷新图片的事件 /// /// private void OnPageEditRefreshEvent(PageEditRefreshEventArgs e) { //UI发送事件过来通知刷新图片时 //调整逻辑,前后预加载5页 RefreshItemImage(e.PageRange.Item1 - 2, e.PageRange.Item2 + 2); } /// /// 选项改变事件 /// 虚拟化的时候不会触发选中事件 /// /// private void SelectionChangedEvent(object e) { var args = e as SelectionChangedEventArgs; //下下策 从UI控件获取所有选项的集合 var listbox = args.OriginalSource as ListBox; if (TbPageRangeVisibility == Visibility.Visible && args != null) { selectedPageList = new List(); for (int i = 0; i < listbox.SelectedItems.Count; i++) { if (!selectedPageList.Contains((listbox.SelectedItems[i] as PageEditItem).PageNumber)) { selectedPageList.Add((listbox.SelectedItems[i] as PageEditItem).PageNumber); } } ////根据选中的范围 适配全部页面范围、奇数页面范围等 //if (pagelist.Count == PageEditItems.Count) //{ // ComboxSelectIndex = 0; // return; //} //只选中单个页面是,listselectedIndex 更准确 if (selectedPageList.Count == 1) { TbPageRange = (listSelecedIndex + 1).ToString(); } else { string pageparm = CommonHelper.GetPageParmFromList(selectedPageList); TbPageRange = pageparm; } } //Ctrl+A时让所有item选中 var isCtrlorShiftDown =( (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.A))|| (Keyboard.IsKeyDown(Key.RightCtrl) && Keyboard.IsKeyDown(Key.A))); if (isCtrlorShiftDown) { for (int i = 0; i < PageEditItems.Count; i++) { PageEditItems[i].Selected = true; } } //判断是否有选中多项 if (listbox.SelectedItems.Count > 1) { IsMultiSelected = true; maxSelectedIndex = listbox.Items.IndexOf(listbox.SelectedItems[listbox.SelectedItems.Count - 1]); } else { IsMultiSelected = false; } } /// /// 限制文本框输入内容 /// /// private void PreviewKeyDownEvent(object e) { var args = e as KeyEventArgs; if (args == null) { return; } if (args.Key != Key.Enter && args.Key != Key.Back && args.Key != Key.OemComma && args.Key!=Key.OemMinus && args.Key != Key.Subtract && !((args.Key >= Key.D0 && args.Key <= Key.D9) || (args.Key >= Key.NumPad0 && args.Key <= Key.NumPad9))) { args.Handled = true; } } /// /// 响应回车确认事件 /// /// private void KeyDownEvent(object e) { var args = e as KeyEventArgs; if (args == null) { return; } if (args.Key == Key.Enter) { List TargetPageIndexs = new List(); var result = CommonHelper.GetPagesInRange(ref TargetPageIndexs, (args.OriginalSource as TextBox).Text, PDFViewer.Document.PageCount, new char[] { ',', ',' }, new char[] { '-' }); if (!result&&ComboxSelectIndex==5) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("","请输入有效范围","OK"); return; } //选中输入的页面范围 List pageRange = new List(); for (int i = 0; i < PageEditItems.Count; i++) { if (TargetPageIndexs.Contains(PageEditItems[i].PageNumber - 1)) { pageRange.Add(i+1); } } NotifyUIToRefresh(pageRange); } } /// /// 失去焦点后选中页面 /// /// private void lostfocus(object obj) { var args = obj as RoutedEventArgs; if (args == null||(args.OriginalSource as TextBox)==null) { return; } List TargetPageIndexs = new List(); if(PageRangeItems.Contains((args.OriginalSource as TextBox).Text)&&ComboxSelectIndex!=5) { //选中其他项,失去焦点时不报错 return; } var result = CommonHelper.GetPagesInRange(ref TargetPageIndexs, (args.OriginalSource as TextBox).Text, PDFViewer.Document.PageCount, new char[] { ',', ',' }, new char[] { '-' }); if (!result) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "请输入有效范围", "OK"); return; } //选中输入的页面范围 List pageRange = new List(); for (int i = 0; i < PageEditItems.Count; i++) { if (TargetPageIndexs.Contains(PageEditItems[i].PageNumber - 1)) { pageRange.Add(i + 1); } } NotifyUIToRefresh(pageRange); } #endregion #region 方法 /// /// Esc退出多选 /// private void clearSelected() { ListSelectedIndex = -1; } /// /// 调用打印机 /// private void print() { PDFViewer.GoToPage(listSelecedIndex); DialogParameters printValue = new DialogParameters(); printValue.Add(ParameterNames.PDFViewer, PDFViewer); printValue.Add(ParameterNames.FilePath, PDFViewer.Document.FileName); printValue.Add(ParameterNames.PrintCurrentPage, PDFViewer.CurrentIndex); printValue.Add(ParameterNames.PageList,selectedPageList); dialogs.ShowDialog(DialogNames.HomePagePrinterDialog, printValue, e => { }); } /// /// 剪切 /// private void cut() { CacheFilePath.Instance.CopyDoc = null; CacheFilePath.Instance.CopyDoc = CPDFDocument.CreateDocument(); List pages = new List(); for (int i = 0; i < PageEditItems.Count; i++) { if (PageEditItems[i].Selected) { pages.Add(i + 1); } } bool result = CacheFilePath.Instance.CopyDoc.ImportPages(PDFViewer.Document, String.Join(",", pages)); if (!result) { ShowToast("复制失败"); return; } DoRemoveSelectedPages(); ReloadAfterOption(true, true, Tuple.Create(0, PDFViewer.Document.PageCount)); } /// /// 复制 /// private void copy() { //付费锁 if (!App.IsLogin) { dialogs.ShowDialog(DialogNames.IAPCompareDialog); return; } CacheFilePath.Instance.CopyDoc = null; CacheFilePath.Instance.CopyDoc = CPDFDocument.CreateDocument(); List pages = new List(); for(int i=0;i /// 是否可以粘贴 /// /// private bool CanPasteExcute() { return this.CanPaste; } /// /// 粘贴 /// private async void paste() { //付费锁 if (!App.IsLogin) { dialogs.ShowDialog(DialogNames.IAPCompareDialog); return; } IsLoading = Visibility.Visible; int insertindex = maxSelectedIndex > listSelecedIndex ? maxSelectedIndex : listSelecedIndex; insertindex++; int pagecount = CacheFilePath.Instance.CopyDoc.PageCount; bool result = PDFViewer.Document.ImportPagesAtIndex(CacheFilePath.Instance.CopyDoc, "1-" + pagecount, insertindex); if (!result) { IsLoading = Visibility.Collapsed; ShowToast("粘贴失败"); return; } //UI层插入 for (int i = 0; i < pagecount; i++) { var item = GetNewPageEditItem(i); PageEditItems.Insert(insertindex + i, item); } //加一点延时才能显示选中效果 await Task.Delay(200); List pageRange = new List(); for (int i = 0; i < pagecount; i++) { pageRange.Add(insertindex + i + 1); } NotifyUIToRefresh(pageRange); //刷新页码等 ReloadAfterOption(true, true, new Tuple(0, PDFViewer.Document.PageCount)); NotifyUIToRefresh(pageRange); IsLoading = Visibility.Collapsed; } /// /// 页面编辑执行Undo操作的方法 /// private async void Undo() { var history = UndoStack.Pop(); PageEditHistory redoHistory = new PageEditHistory(); switch (history.Type) { case ActionType.RightRotate: var rightlist = history.SourceTargetValue.Keys.ToList(); RotateSelectedPages(false, rightlist,true); redoHistory.SourceTargetValue = history.SourceTargetValue; redoHistory.Type = ActionType.LeftRotate; break; case ActionType.LeftRotate: var leftlist = history.SourceTargetValue.Keys.ToList(); RotateSelectedPages(true, leftlist,true); redoHistory.SourceTargetValue = history.SourceTargetValue; redoHistory.Type = ActionType.RightRotate; break; case ActionType.InsertFromFile: List pageList = new List(); for(int i=0;i {history.InsertIndex},true); redoHistory = history; break; case ActionType.DragSort: //将字典倒序后,将每个Source的值恢复到Key的位置 var SourceTargets = history.SourceTargetValue; var keys = SourceTargets.Keys.ToArray(); Array.Reverse(keys); foreach(var key in keys) { MoveItemToIndex(SourceTargets[key], key); } //刷新页码等 ReloadAfterOption(true,true,new Tuple(0,PDFViewer.Document.PageCount)); List selectedPages = new List(); //将索引集合转换成页码集合 foreach(var key in SourceTargets.Keys) { selectedPages.Add(key+1); } //通知UI选中Item NotifyUIToRefresh(selectedPages); redoHistory = history; break; case ActionType.Reverse: //将字典倒序后,将每个Source的值恢复到Key的位置 var SourceTarget = history.SourceTargetValue; var pres = SourceTarget.Keys.ToArray(); foreach (var key in pres) { if (key != SourceTarget[key]) { ExchangeItem(key, SourceTarget[key]); } } await Task.Delay(20); //刷新页码等 ReloadAfterOption(true, true, null); List Pages = new List(); //将索引集合转换成页码集合 foreach (var key in SourceTarget.Keys) { Pages.Add(key + 1); } foreach(var key in SourceTarget.Values) { Pages.Add(key + 1); } //通知UI选中Item NotifyUIToRefresh(Pages); redoHistory = history; break; default: break; } RedoStack.Push(redoHistory); CanRedo = true; //检查是否可以再进行Undo if(UndoStack.Count<=0) { this.CanUndo = false; } } /// /// 页面编辑执行Redo操作的方法 /// private async void Redo() { var history = RedoStack.Pop(); PageEditHistory undoHistory = new PageEditHistory(); switch (history.Type) { case ActionType.RightRotate: var rightlist = history.SourceTargetValue.Keys.ToList(); RotateSelectedPages(false, rightlist,true); undoHistory.SourceTargetValue = history.SourceTargetValue; undoHistory.Type = ActionType.LeftRotate; break; case ActionType.LeftRotate: var leftlist = history.SourceTargetValue.Keys.ToList(); RotateSelectedPages(true, leftlist,true); undoHistory.SourceTargetValue = history.SourceTargetValue; undoHistory.Type = ActionType.RightRotate; break; case ActionType.InsertFromFile: await InsertFromFile(history.InsertIndex,history.InsertFilePath,history.InsertFilePassWord,true); ReloadAfterOption(true, true, Tuple.Create(history.InsertIndex-1, history.InsertIndex+history.InsertPageCount)); undoHistory = history; break; case ActionType.InsertCustomPages: InsertFromCustomPage(history.InsertIndex, history.PageSize.Width, history.PageSize.Height, history.InsertFilePath); ListSelectedIndex = history.InsertIndex; undoHistory = history; break; case ActionType.DragSort: DragToSort(history.InsertIndex,history.SourceTargetValue.Keys.ToList(),true); undoHistory = history; break; case ActionType.Reverse: var list = history.SourceTargetValue.Keys.ToList().Union(history.SourceTargetValue.Values.ToList()).ToList(); DoReverse(list, true); undoHistory = history; break; default: break; } UndoStack.Push(undoHistory); CanUndo = true; if (RedoStack.Count <= 0) { this.CanRedo = false; } } /// /// 退出页面编辑面试,回到阅读页 /// public void BackToPDFViewer(int PageIndex) { PDFViewer.GoToPage(PageIndex); viewContentViewModel.ExitToolMode(); } /// /// 显示Toast提示 /// private void ShowToast(string content="") { if (!string.IsNullOrEmpty(content)) { ToastText = content; } else { ToastText = "操作失败"; } ShowTip = Visibility.Visible; } /// /// 通知UI刷新页面范围 /// 或通过xaml来设置选中项 /// vb nmjvcx private void NotifyUIToRefresh(List pageRange=null) { if (pageRange == null || pageRange.Count <= 0) { //通知UI刷新页面范围 eventor.GetEvent().Publish(new PageEditNotifyEventArgs(unicode)); } else { //通知UI刷新页面范围 eventor.GetEvent().Publish(new PageEditNotifyEventArgs(unicode,NotifyType.SelectItems,pageRange)); } } /// /// 获取已选中的页面集合 /// /// private List getSelectedPage() { List pages = new List(); for (int i = 0; i < PageEditItems.Count; i++) { if (PageEditItems[i].Selected) { pages.Add(i); } } return pages; } /// /// 删除选中项的方法 不带Reload操作 /// 方便其他逻辑中调用 /// private void DoRemoveSelectedPages(List pageList = null, bool isFromUndoRedo = false) { //付费锁 if (!App.IsLogin) { dialogs.ShowDialog(DialogNames.IAPCompareDialog); return; } List indexList = new List(); if (pageList == null || pageList.Count < 0) { for (int i = 0; i < PageEditItems.Count; i++) { if (PageEditItems[i].Selected) { indexList.Add(i); } } } else { indexList = pageList; } if(indexList.Count>0&& indexList.Count==PDFViewer.Document.PageCount) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("","不能删除所有页面","OK"); return; } var result = PDFViewer.Document.RemovePages(indexList.ToArray()); if (!result) { ShowToast(); return; } //文档层操作成功后再删除UI层 for (int i = indexList.Count - 1; i >= 0; i--) { PageEditItems.RemoveAt(indexList[i]); } if (!isFromUndoRedo) { //清除页面编辑Undo,Redo栈 UndoStack.Clear(); RedoStack.Clear(); this.CanUndo = false; this.CanRedo = false; } } /// /// 提取选中页面的方法 /// /// 是否每页生成一个文件 /// 是否提取后删除页面 private async void DoExtractPages(bool isEveryPageToFile,bool isDeleteAfterExtract) { System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog(); if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if (string.IsNullOrEmpty(dialog.SelectedPath)) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("","","OK");//补充提示文案 return; } } else return; string selectedfile = ""; IsLoading = Visibility.Visible; await Task.Delay(3); List pagenums = new List(); for(int i=0;i pageList1 = new List(); //如果是自定义输入页面范围的话,直接解析 CommonHelper.GetPagesInRange(ref pageList1, pageRange, PageCount, new char[] { ',' }, new char[] { '-' }); //part1 selectedfile = ""; CPDFDocument saveDoc1 = CPDFDocument.CreateDocument(); string filepath = data.FileName + " " + "1.pdf"; string path1 = Path.Combine(dialog.SelectedPath, filepath); path1 = CommonHelper.CreateFilePath(path1); bool result = saveDoc1.ImportPages(pdfViewer.Document, pageRange); if (!result) { saveDoc1.Release(); ShowToast(); return; } result = saveDoc1.WriteToFilePath(path1); if (!result) { saveDoc1.Release(); ShowToast(); return; } saveDoc1.Release(); //Part2 List pageList2 = new List(); for (int i = 1; i <= pdfViewer.Document.PageCount; i++) { if (!pageList1.Contains(i - 1))//pagelist1 存放的是index pageList2.Add(i); } string pageRange2 = string.Join(",", pageList2); CPDFDocument saveDoc2 = CPDFDocument.CreateDocument(); string filepath2 = data.FileName + " " + "2.pdf"; string path2 = Path.Combine(dialog.SelectedPath, filepath2); path2 = CommonHelper.CreateFilePath(path2); result = saveDoc2.ImportPages(pdfViewer.Document, pageRange2); if (!result) { saveDoc2.Release(); ShowToast(); return; } result = saveDoc2.WriteToFilePath(path2); if (!result) { saveDoc2.Release(); ShowToast(); return; } selectedfile = path1; saveDoc2.Release(); } //显示文件夹,并选中一个文件 Process.Start("explorer", "/select,\"" + selectedfile + "\""); } catch (Exception ex) { } } /// /// 将文件插入到指定位置 /// /// public async Task InsertFromFile(int insertIndex, string filePath, string oldPassWord = null, bool isFromUndoRedo = false) { CPDFDocument doc = CPDFDocument.InitWithFilePath(filePath); if (doc == null) { ShowToast(); return false; } string password = ""; if (doc.IsLocked) { if(!string.IsNullOrEmpty(oldPassWord)) { var result = doc.UnlockWithPassword(oldPassWord); if(result) { password = oldPassWord; } } //没有传入密码,或者用传入密码解密失败是,需要弹出界面弹窗 if (doc.IsLocked) { DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFDocument, doc); bool result = true; dialogs.ShowDialog(DialogNames.VerifyPassWordDialog, value, e => { if (e.Result != ButtonResult.OK) { result = false; } password = e.Parameters.GetValue(ParameterNames.PassWord); }); if (!result) { return false; } } } int pageCount = doc.PageCount; //插入整个新文档 //文档层插入 var insertresult = PDFViewer.Document.ImportPagesAtIndex(doc, "1-" + pageCount, insertIndex); if (!insertresult) { ShowToast(); return false; } //插入成功后释放临时Document对象 doc.Release(); //UI层插入 for (int i = 0; i < pageCount; i++) { var item = GetNewPageEditItem(i); PageEditItems.Insert(insertIndex + i, item); } //加一点延时才能显示选中效果 await Task.Delay(200); List pageRange = new List(); for (int i = 0; i < pageCount; i++) { pageRange.Add(insertIndex+i+1); } NotifyUIToRefresh(pageRange); //如果是undo redo里调用本方法,则不需要添加到Undo栈 if (!isFromUndoRedo) { //添加记录到Undo栈,清空Redo栈 PageEditHistory history = new PageEditHistory(); history.Type = ActionType.InsertFromFile; history.InsertIndex = insertIndex; history.InsertFilePath = filePath; history.InsertFilePassWord = password; history.InsertPageCount = pageCount; AddToUndoStack(history); } return true; } /// /// 添加记录到Undo栈 /// /// private void AddToUndoStack(PageEditHistory history) { UndoStack.Push(history); CanUndo = true; RedoStack.Clear(); CanRedo = false; } /// /// 插入自定义页面 /// /// /// /// /// /// private bool InsertFromCustomPage(int insertIndex,double width,double height,string filePath) { try { bool result = false; //文档层插入 if (!string.IsNullOrEmpty(filePath)) { BitmapFrame frame = BitmapFrame.Create(new Uri(filePath)); byte[] imageData = new byte[frame.PixelWidth * frame.PixelHeight * 4]; frame.CopyPixels(imageData, frame.PixelWidth * 4, 0); result = PDFViewer.Document.InsertPage(insertIndex, frame.Width, frame.Height, imageData, CPDFDocumentImageMode.CPDFDocumentImageModeScaleToFill); } else { result = PDFViewer.Document.InsertPage(insertIndex, width, height, null); } if (!result) { ShowToast(); return false; } PageEditItem item = new PageEditItem(); item.Size = PDFViewer.Document.GetPageSize(insertIndex); PageEditItems.Insert(insertIndex, item); ReloadAfterOption(true, true, Tuple.Create(insertIndex - 1, insertIndex + 1)); return true; } catch { return false; } } /// /// 根据索引创建新的Item /// /// /// private PageEditItem GetNewPageEditItem(int index) { PageEditItem item = new PageEditItem(); if (PDFViewer.Document.PageAtIndex(index).Rotation % 2 != 0) { ///标记为横向页面 item.isVertical = false; } item.PageNumber = index + 1; var pagesize = PDFViewer.Document.GetPageSize(index); item.Size = pagesize; //double width = CommonHelper.GetUnitsFromPageSize(pagesize.Width); //double height = CommonHelper.GetUnitsFromPageSize(pagesize.Height); //item.PageSize = $"{width.ToString("F0")}mm*{height.ToString("F0")} mm"; return item; } /// /// 进行文件操作后刷新PDFView /// 清除undo 栈 /// 重加载Document /// 设置保存状态 /// /// 是否需要刷新页码 /// 是否需要清空注释Undo栈 /// 需要刷新的页面范围图片 public void ReloadAfterOption(bool needRefreshPageNum = false, bool needClearUndoHistory = true, Tuple pageRange = null) { if (needRefreshPageNum) { RefreshPageNum(); } if (needClearUndoHistory) { PDFViewer.UndoManager.ClearHistory(); } if (pageRange != null) { if (pageRange.Item2 - pageRange.Item1 > 30) { //范围较大时,通知UI获取更准确的刷新范围 NotifyUIToRefresh(); } else { RefreshItemImage(pageRange.Item1, pageRange.Item2); } } PDFViewer.UndoManager.CanSave = true; PDFViewer.ReloadDocument(); } /// /// 旋转所有选中页面 /// /// private async void RotateSelectedPages(bool rightRotate = true,List pageitems=null,bool isFromUndoRedo = false) { //付费锁 if (!App.IsLogin) { dialogs.ShowDialog(DialogNames.IAPCompareDialog); return; } IsLoading = Visibility.Visible; await Task.Delay(2); Dictionary items = new Dictionary(); if (pageitems == null) { //旋转选中页面 for (int i = 0; i < PageEditItems.Count; i++) { if (PageEditItems[i].Selected) { //逆时针旋转传 - 1 顺时针旋转传1 PDFViewer.Document.RotatePage(i, rightRotate ? 1 : -1); PDFViewer.Document.ReleasePages(i); items.Add(i, i); PageEditItems[i].Size = PDFViewer.Document.GetPageSize(i); //重新拿图 PageEditItems[i].IsGetImage = false; } } } else { //旋转对应Items集合 for (int i = 0; i < pageitems.Count; i++) { PDFViewer.Document.RotatePage(pageitems[i], rightRotate ? 1 : -1); PDFViewer.Document.ReleasePages(pageitems[i]); items.Add(pageitems[i], pageitems[i]); //重新拿图 PageEditItems[pageitems[i]].IsGetImage = false; PageEditItems[i].Size = PDFViewer.Document.GetPageSize(i); } } //旋转页面后取消选中 PDFViewer.ClearSelectPDFEdit(true); //如果是undo,Redo里调用的方法,则不记录到栈里 if (!isFromUndoRedo) { //记录进Undo栈 PageEditHistory history = new PageEditHistory(); history.Type = rightRotate ? ActionType.RightRotate : ActionType.LeftRotate; history.SourceTargetValue = items; AddToUndoStack(history); } ReloadAfterOption(false, true, Tuple.Create(0, PageEditItems.Count)); IsLoading = Visibility.Collapsed; } /// /// 刷新页码 /// private void RefreshPageNum() { for (int i = 0; i < PageEditItems.Count; i++) { PageEditItems[i].PageNumber = i + 1; PageEditItems[i].ShowPageSize = HasShowPageSize == Visibility.Visible ? true : false; } } /// /// 刷新页面范围下拉框 /// private void RefreshPageRangeItem() { PageRangeItems.Clear(); PageRangeItems.Add("所有页面"); PageRangeItems.Add("奇数页"); PageRangeItems.Add("偶数页"); PageRangeItems.Add("横向页面"); PageRangeItems.Add("纵向页面"); PageRangeItems.Add("自定义"); } /// /// 选中目标页面范围的页面 /// /// 页面范围选中项索引 private void SuitPageRange(int index) { List pageRange = new List(); switch (index) { case 0: for (int i = 0; i < PageEditItems.Count; i++) { pageRange.Add(i+1); } break; case 1: //奇数页 for (int i = 0; i < PageEditItems.Count; i++) { if (i % 2 == 0) { pageRange.Add(i + 1); } } break; case 2: //偶数页 for (int i = 0; i < PageEditItems.Count; i++) { if (i % 2 != 0) { pageRange.Add(i + 1); } } break; case 3://横向页面 ListSelectedIndex = -1; for (int i = 0; i < PageEditItems.Count; i++) { if (!PageEditItems[i].isVertical) { pageRange.Add(i + 1); } } break; case 4://纵向页面 for (int i = 0; i < PageEditItems.Count; i++) { if (PageEditItems[i].isVertical) { pageRange.Add(i + 1); } } break; case 5://自定义 //await Task.Delay(20); //TbPageRange = "1,3"; break; default: break; } if(pageRange.Count>0) { NotifyUIToRefresh(pageRange); } else { if (index != 5) { //没有符合条件时 清空选中项 ListSelectedIndex = -1; } } } /// /// 是否显示页面尺寸 /// /// 是或否 private void ShowPageSize() { bool show = true; if(HasShowPageSize== Visibility.Visible) { show = false; HasShowPageSize = Visibility.Collapsed; } else { show = true; HasShowPageSize = Visibility.Visible; } for (int i = 0; i < PageEditItems.Count; i++) { PageEditItems[i].ShowPageSize = show; } } /// /// 从PDFView获取所有Items集合 /// private void GetSourceItems(bool isFirstLoad) { if (isFirstLoad||IsBOTAThumb==Visibility.Visible) { PageEditItems.Clear(); for (int i = 0; i < PDFViewer.Document.PageCount; i++) { var item = GetNewPageEditItem(i); PageEditItems.Add(item); } } //else //{ // //后续进来仅刷新图片即可 // for (int i = 0; i < PageEditItems.Count; i++) // { // PageEditItems[i].IsGetImage = false; // } //} } /// /// 刷新书签列表 /// public void RefreshBookMarkList() { if (PDFViewer != null) { var booklist = PDFViewer.Document.GetBookmarkList(); if (booklist == null) { return; } //获取所有书签的Index集合 List marks = new List(); for (int i = 0; i < booklist.Count; i++) { marks.Add(booklist[i].PageIndex); } //不能只遍历marks集合,考虑书签集合元素删除的情况 for (int k = 0; k < PageEditItems.Count; k++) { if (marks.Contains(k)) PageEditItems[k].HaveBookMark = true; else PageEditItems[k].HaveBookMark = false; } } } /// /// 刷新指定范围的图片 /// /// /// private async void RefreshItemImage(int startIndex, int endIndex) { for (int i = startIndex; i <= endIndex; i++) { if (i <= PageEditItems.Count- 1 && i >= 0 && PageEditItems.Count > 0) { //宽高为样式中图片控件宽高 if (PageEditItems[i].isVertical) { //等比例缩放 if (PageEditItems[i].Size.Height > 300) { await PDFViewer.GetThumbnail(i, (int)(PageEditItems[i].Size.Width / (PageEditItems[i].Size.Height / 300)), 300); } else { await PDFViewer.GetThumbnail(i, (int)PageEditItems[i].Size.Width, (int)PageEditItems[i].Size.Height); } } else { if (PageEditItems[i].Size.Width > 300) { await PDFViewer.GetThumbnail(i, 300, (int)(PageEditItems[i].Size.Height / (PageEditItems[i].Size.Width / 300))); } else { //获取横图 await PDFViewer.GetThumbnail(i, (int)PageEditItems[i].Size.Width, (int)PageEditItems[i].Size.Height); } } } } } /// /// 拖拽排序功能 /// /// /// public void DragToSort(int targetIndex,List pageIndexs,bool IsFromUndoRedo =false) { //拖拽排序后需要重新选中项的集合 List selectedPages = new List(); //记录原位置和目标位置的字典,用于Undo,Redo恢复 Dictionary SourceTargetValue = new Dictionary(); bool result = false; //排序前,先对所有页码排序 pageIndexs.Sort(); //要考虑每一次交换都会导致局部页码发生改变 //每次整体往后移动时,先移动大页码;整体往前移动时,先移动小页码;往中间移动时,再按上述两种情况分别移动 if (targetIndex <= pageIndexs[0]) { for (int i = 0; i < pageIndexs.Count; i++) { // list.Add(PageEditListBox.Items[pageIndexs[i]] as ListBoxItem); //sourceindex.Add(pageIndexs[i]); result = MoveItemToIndex(pageIndexs[i], targetIndex + i); if(!result) { return; } SourceTargetValue.Add(pageIndexs[i], targetIndex + i); selectedPages.Add(targetIndex + i+1); } } else if (targetIndex > pageIndexs[pageIndexs.Count - 1]) { //目标位置在所有选中内容右边 整体后移 for (int i = 0; i < pageIndexs.Count; i++) { result = MoveItemToIndex(pageIndexs[pageIndexs.Count - 1 - i], targetIndex - 1 - i); if (!result) { return; } SourceTargetValue.Add(pageIndexs[pageIndexs.Count - 1 - i], targetIndex - 1 - i); selectedPages.Add(targetIndex - i); } } else//目标位置在所有选中项中间 { int i, j, k; //找出PageEditListBox.Items中页码等于destpage的下标 for (k = 0; k < pageIndexs.Count - 1; k++) { //这里要算入K---即前面部分的页面个数 if (pageIndexs[k] < targetIndex && pageIndexs[k + 1] >= targetIndex) { break; } } //局部往后移动 for (i = 0; i <= k; i++) { result = MoveItemToIndex(pageIndexs[k - i], targetIndex - 1 - i); if (!result) { return; } SourceTargetValue.Add(pageIndexs[k - i], targetIndex - 1 - i); selectedPages.Add(targetIndex - i); } int newIndex = targetIndex; //局部往前移动 for (j = i; j < pageIndexs.Count; j++) { result = MoveItemToIndex(pageIndexs[j], newIndex); if (!result) { return; } SourceTargetValue.Add(pageIndexs[j], newIndex); selectedPages.Add(newIndex + 1); newIndex++; } } //通知UI选中Items //NotifyUIToRefresh(selectedPages); //刷新页码和图片 ReloadAfterOption(true,true,new Tuple(0,PDFViewer.Document.PageCount)); if (!IsFromUndoRedo) { //存入Undo栈 PageEditHistory history = new PageEditHistory(); history.Type = ActionType.DragSort; history.SourceTargetValue = SourceTargetValue; //用于Redo恢复 history.InsertIndex = targetIndex; AddToUndoStack(history); } } /// /// 移动某个Item到指定位置 /// private bool MoveItemToIndex(int sourceindex, int targetindex) { if (targetindex == sourceindex || targetindex < 0) { return false; } //文档层移动 var result = PDFViewer.Document.MovePage(sourceindex, targetindex); if (!result) { return false; } //UI层移动 var source = PageEditItems[sourceindex]; PageEditItems.RemoveAt(sourceindex); PageEditItems.Insert(targetindex, source); return true; } /// /// 从底层库获取对应页面的图片 /// /// /// /// /// private void PDFViewer_OnThumbnailGenerated(int pageIndex, byte[] thumb, int w, int h) { try { if (PageEditItems.Count >= pageIndex + 1) { PixelFormat fmt = PixelFormats.Bgra32; BitmapSource bps = BitmapSource.Create(w, h, 96.0, 96.0, fmt, null, thumb, (w * fmt.BitsPerPixel + 7) / 8); PageEditItems[pageIndex].Image = bps; PageEditItems[pageIndex].IsGetImage = true; } } catch { } } #endregion #region Navigate public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } /// /// 从其他页面导航过来的时候会触发 /// 考虑只有在页面编辑的时候会进行页面的删减,可以尝试逻辑优化:仅第一次进入页面编辑时重新刷新页面 /// /// public void OnNavigatedTo(NavigationContext navigationContext) { navigationContext.Parameters.TryGetValue(ParameterNames.ViewContentViewModel, out viewContentViewModel); navigationContext.Parameters.TryGetValue(ParameterNames.PDFViewer, out PDFViewer); bool isBOTA = false; navigationContext.Parameters.TryGetValue(ParameterNames.BOTAThumb, out isBOTA); if (PDFViewer != null) { if (isFirstLoad) { PDFViewer.OnThumbnailGenerated -= PDFViewer_OnThumbnailGenerated; PDFViewer.OnThumbnailGenerated += PDFViewer_OnThumbnailGenerated; PDFViewer.InfoChanged -= PDFViewer_InfoChanged; PDFViewer.InfoChanged += PDFViewer_InfoChanged; PDFViewer.AnnotEditHandler -= PDFViewer_AnnotEditHandler; PDFViewer.AnnotEditHandler += PDFViewer_AnnotEditHandler; ZoomIndex = 0; if(viewContentViewModel!=null) { viewContentViewModel.PageEditUndo = Undo; viewContentViewModel.PageEditRedo = Redo; } } //BOTA缩略图时,显示不同的菜单栏 if(isBOTA) { IsBOTAThumb = Visibility.Visible; } else { IsBOTAThumb = Visibility.Collapsed; } GetSourceItems(isFirstLoad); ListSelectedIndex = PDFViewer.CurrentIndex; viewContentViewModel.CanUndo = this.CanUndo; viewContentViewModel.CanRedo = this.CanRedo; RefreshBookMarkList(); isFirstLoad = false; } } private void PDFViewer_AnnotEditHandler(object sender, List e) { if (e != null && e.Count > 0) { int pageIndex = e[0].PageIndex; RefreshItemImage(pageIndex, pageIndex); } } private void PDFViewer_InfoChanged(object sender, KeyValuePair e) { if(e.Key== "PageNum") { NotifyUIToRefresh(new List { (e.Value as ComPDFKitViewer.RenderData).PageIndex}); } } #endregion } }