using Microsoft.Win32; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Threading.Tasks; using ComPDFKitViewer.PdfViewer; using Prism.Regions; using Prism.Services.Dialogs; using PDF_Office.CustomControl; using PDF_Office.Model; using System.Windows; using System.Windows.Controls; using System.IO; using ComPDFKitViewer.AnnotEvent; using PDF_Office.ViewModels.Tools; using Prism.Events; using PDF_Office.EventAggregators; using PDF_Office.Helper; using ComPDFKit.PDFDocument; using PDFSettings.Settings; using PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs; using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.SetPasswordDialogModel; using PDF_Office.Model.Dialog.ToolsDialogs; using DryIoc; using PDF_Office.Model.Dialog.ConverterDialogs; using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.DeleteSafetySettintgsModel; using PDF_Office.Views.PropertyPanel.AnnotPanel; using System.Linq; using System.Text; using PDF_Office.Views.Tools; using System.Windows.Input; using PDF_Office.ViewModels.PropertyPanel.AnnotPanel; using ImTools; using PDF_Office.Properties; using PDF_Office.ViewModels.BOTA; using PDF_Office.Views.BOTA; using System.Drawing; using PDF_Office.ViewModels.Tools.AnnotManager; namespace PDF_Office.ViewModels { public class ViewContentViewModel : BindableBase, INavigationAware { #region 文案 private string T_file; public string T_File { get { return T_file; } set { SetProperty(ref T_file, value); } } private string T_save; public string T_Save { get { return T_save; } set { SetProperty(ref T_save, value); } } private string T_undo; public string T_Undo { get { return T_undo; } set { SetProperty(ref T_undo, value); } } private string T_redo; public string T_Redo { get { return T_redo; } set { SetProperty(ref T_redo, value); } } private string T_annotation; public string T_Annotation { get { return T_annotation; } set { SetProperty(ref T_annotation, value); } } private string T_pageEdit; public string T_PageEdit { get { return T_pageEdit; } set { SetProperty(ref T_pageEdit, value); } } private string T_converter; public string T_Converter { get { return T_converter; } set { SetProperty(ref T_converter, value); } } private string T_fillSign; public string T_FillSign { get { return T_fillSign; } set { SetProperty(ref T_fillSign, value); } } private string T_tools; public string T_Tools { get { return T_tools; } set { SetProperty(ref T_tools, value); } } private string T_print; public string T_Print { get { return T_print; } set { SetProperty(ref T_print, value); } } private string T_share; public string T_Share { get { return T_share; } set { SetProperty(ref T_share, value); } } private string T_properties; public string T_Properties { get { return T_properties; } set { SetProperty(ref T_properties, value); } } private void InitStirng() { T_File = App.MainPageLoader.GetString("ViewTopToolbar_File"); T_Save = App.MainPageLoader.GetString("ViewTopToolbar_Save"); T_Undo = App.MainPageLoader.GetString("ViewTopToolbar_Undo"); T_Redo = App.MainPageLoader.GetString("ViewTopToolbar_Redo"); T_Annotation = App.MainPageLoader.GetString("ViewTopToolbar_Annotation"); T_PageEdit = App.MainPageLoader.GetString("ViewTopToolbar_PageEdit"); T_Converter = App.MainPageLoader.GetString("ViewTopToolbar_Converter"); T_FillSign = App.MainPageLoader.GetString("ViewTopToolbar_Fill&Sign"); T_Tools = App.MainPageLoader.GetString("ViewTopToolbar_Tools"); T_Print = App.MainPageLoader.GetString("ViewTopToolbar_Print"); T_Share = App.MainPageLoader.GetString("ViewTopToolbar_Share"); T_Properties = App.MainPageLoader.GetString("ViewTopToolbar_Properties"); } #endregion 文案 #region 属性、变量 public OpenFileInfo OpenFileInfo = null; public CPDFViewer PDFViewer { get; set; } public MainContentViewModel mainViewModel { get; set; } public IRegionManager region; public IDialogService dialogs; public IEventAggregator events; public bool IsRightMenuCreateLink { get => isCreateLink; set => isCreateLink = value; } public string ViwerRegionName { get; set; } /// /// 分屏视图的region名称 /// public string SplitViewerRegionName { get; set; } /// /// OCR视图名称 /// public string OCRViewerRegionName { get; set; } public string BOTARegionName { get; set; } public string PropertyRegionName { get; set; } public string ToolContentRegionName { get; set; } public string ToolsBarContentRegionName { get; set; } /// /// 顶部提示的Content /// public string TipContentRegionName { get; set; } public string LeftTipContentRegionName { get; set; } //便签弹窗 public string NotePopupRegionName { get; set; } public string ReadModeRegionName { get; set; } public string ConverterBarContentRegionName { get; set; } public string TextEditContentRegionName { get; set; } public string BackgroundContentRegionName { get; set; } //若point不赋值或从列表中找不到point,系统会提供默认值为(0,0)的新point,所以改用Tuple public List> FillAndSign = new List>(); /// /// 文档的密码 /// public string PassWord { get; set; } private Visibility tipVisible = Visibility.Collapsed; /// /// 顶部提示栏的显示状态 /// public Visibility TipVisible { get { return tipVisible; } set { SetProperty(ref tipVisible, value); } } private Visibility leftTipVisible = Visibility.Collapsed; public Visibility LeftTipVisible { get { return leftTipVisible; } set { SetProperty(ref leftTipVisible, value); } } private Visibility notePopupVisible = Visibility.Collapsed; public Visibility NotePopupVisible { get { return notePopupVisible; } set { SetProperty(ref notePopupVisible, value); } } public bool IsNoteAdd = false; private double canvasNoteLeft; public double CanvasNoteLeft { get { return canvasNoteLeft; } set { SetProperty(ref canvasNoteLeft, value); } } private double canvasNoteBottom; public double CanvasNoteBottom { get { return canvasNoteBottom; } set { SetProperty(ref canvasNoteBottom, value); } } /// /// 底部工具栏 RegionName /// public string BottomToolRegionName { get; set; } private bool _isInPageEdit = false; /// /// 是否处于页面编辑模式,用于执行undo redo 的具体操作 /// public bool isInPageEdit { get { return _isInPageEdit; } set { SetProperty(ref _isInPageEdit, value); if (!value) { CanRedo = PDFViewer.UndoManager.CanRedo; CanUndo = PDFViewer.UndoManager.CanUndo; } } } public Action PageEditUndo { get; set; } public Action PageEditRedo { get; set; } /// ///工具条 ///0:收起 ///40:显示 /// private int toolRowHeight = 40; public int ToolRowHeight { get { return toolRowHeight; } set { SetProperty(ref toolRowHeight, value); } } /// /// 水印,背景侧边栏宽度 /// 0:收起 /// 260:显示 /// private int propertyColumnWidth = 0; public int PropertyColumnWidth { get { return propertyColumnWidth; } set { SetProperty(ref propertyColumnWidth, value); } } private int gridToolRow = 1; /// /// 控制ToolContent的Row /// public int GridToolRow { get { return gridToolRow; } set { SetProperty(ref gridToolRow, value); } } private int gridToolRowSpan = 3; /// /// 控制ToolContent的RowSpan /// public int GridToolRowSpan { get { return gridToolRowSpan; } set { SetProperty(ref gridToolRowSpan, value); } } private Visibility toolContentVisible = Visibility.Collapsed; /// /// 控制Content的显示 用于显示水印、贝茨码、密文等功能模块 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility ToolContentVisible { get { return toolContentVisible; } set { SetProperty(ref toolContentVisible, value); } } private Visibility gridVisibility = Visibility.Visible; /// /// 是否正在加载中 /// public Visibility GridVisibility { get { return gridVisibility; } set { SetProperty(ref gridVisibility, value); } } private Visibility isLoading = Visibility.Collapsed; private Visibility ocrContentVisible = Visibility.Collapsed; public Visibility OCRContentVisible { get { return ocrContentVisible; } set { SetProperty(ref ocrContentVisible, value); } } /// /// 是否正在加载中 /// public Visibility IsLoading { get { return isLoading; } set { SetProperty(ref isLoading, value); } } private Visibility converterBarContentVisible = Visibility.Collapsed; private Visibility toolsbarContentVisible = Visibility.Collapsed; /// /// 控制ToolsBarContent的显示 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility ConverterBarContentVisible { get { return converterBarContentVisible; } set { SetProperty(ref converterBarContentVisible, value); } } private Visibility toolsBarContentVisible = Visibility.Collapsed; /// /// 控制ToolsBarContent的显示 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility ToolsBarContentVisible { get { return toolsBarContentVisible; } set { SetProperty(ref toolsBarContentVisible, value); } } private Visibility textEditToolContentVisible = Visibility.Collapsed; /// /// 控制ToolsBarContent的显示 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility TextEditToolContentVisible { get { return textEditToolContentVisible; } set { SetProperty(ref textEditToolContentVisible, value); } } private bool isPorpertyOpen = false; /// /// 属性栏是否展开 /// public bool IsPropertyOpen { get { return isPorpertyOpen; } set { //如果设置为手动展开属性面板时,则不响应代码控制的展开 if (Settings.Default.AppProperties.InitialVIew.AutoExpandProperty) { SetProperty(ref isPorpertyOpen, value); } } } private Visibility isReadMode = Visibility.Visible; /// ///是否为阅读模式 /// public Visibility IsReadMode { get { return isReadMode; } set { SetProperty(ref isReadMode, value); } } private bool canSave; /// /// 是否可以保存 /// public bool CanSave { get { return canSave; } set { if (events != null && canSave == false) this.events.GetEvent().Publish(new FillAndSigntEventArgs { Unicode = "Clear", AppUnicode = unicode }); SetProperty(ref canSave, value); } } private bool canUndo; /// /// 是否可以进行Undo /// public bool CanUndo { get { return canUndo; } set { SetProperty(ref canUndo, value); } } private bool canRedo; /// /// 是否可以进行Redo /// public bool CanRedo { get { return canRedo; } set { SetProperty(ref canRedo, value); } } private GridLength botaWidth = new GridLength(48); /// /// BOTA栏的宽度 /// public GridLength BOTAWidth { get { return botaWidth; } set { SetProperty(ref botaWidth, value); if (botaWidth.Value <= 48) { OpenBOTA = false; } } } private int selectedIndex; /// /// 工具栏选中项的索引 /// public int TabSelectedIndex { get { return selectedIndex; } set { SetProperty(ref selectedIndex, value); } } private bool openBOTA = false; /// /// 是否展开BOTA /// public bool OpenBOTA { get { return openBOTA; } set { SetProperty(ref openBOTA, value); if (openBOTA && BOTAWidth.Value <= 48) { BOTAWidth = new GridLength(260); } //关闭BOTA的逻辑在xaml.cs代码里控制,无法绑定后台 } } public SecurityInfo SecurityInfo = new SecurityInfo(); private Dictionary regionNameByTabItem; private Dictionary barContentByTabItem; private string previousBar = ""; public string CurrentBar = ""; public string unicode = null; /// /// 用来避免重复触发导航事件的标志符 /// private bool isOpenFile = false; /// /// 鼠标滚轮缩放的缩放值 /// private double[] zoomLevel = { 1.00f, 10, 25, 50, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 }; /// /// 注释-链接,提示语 /// private Visibility linkAnnotTipVisibility = Visibility.Collapsed; public Visibility LinkAnnotTipVisibility { get { return linkAnnotTipVisibility; } set { SetProperty(ref linkAnnotTipVisibility, value); } } private string linkAnnotTipText = "Please use the scroll bar, thumbnail tool to locate the target page, click or box the area to select the target range"; private bool isCreateLink = false; public string LinkAnnotTipText { get { return linkAnnotTipText; } set { SetProperty(ref linkAnnotTipText, value); } } #endregion 属性、变量 #region 命令 public DelegateCommand LoadFile { get; set; } public DelegateCommand Load { get; set; } public DelegateCommand MouseDown { get; set; } public DelegateCommand TabControlSelectionChangedCommand { get; set; } public DelegateCommand SaveFile { get; set; } public DelegateCommand SaveAsFile { get; set; } public DelegateCommand SaveAsFlattenCommand { get; set; } public DelegateCommand UndoCommand { get; set; } public DelegateCommand RedoCommand { get; set; } public DelegateCommand MenuEnterReadMode { get; set; } public DelegateCommand PrintCommand { get; set; } public DelegateCommand SelectCommand { get; set; } public DelegateCommand SettingsCommand { get; set; } public DelegateCommand ShareCommand { get; set; } public DelegateCommand CreateLinkCommand { get; set; } public DelegateCommand PropertyCommand { get; set; } public DelegateCommand ShowInFolderCommand { get; set; } public DelegateCommand CompressCommand { get; set; } public DelegateCommand MergeFileCommand { get; set; } public DelegateCommand EncryptCommand { get; set; } public DelegateCommand DecryptCommand { get; set; } public DelegateCommand ConvertCommand { get; set; } public DelegateCommand CloseWindowCommand { get; set; } public DelegateCommand OpenFileCommand { get; set; } public DelegateCommand HelpCommand { get; set; } public DelegateCommand CreateBlankFileCommand { get; set; } public DelegateCommand ClosePropertyCommand { get; set; } #endregion 命令 public ViewContentViewModel(IRegionManager regionManager, IDialogService dialogService, IEventAggregator eventAggregator) { InitStirng(); region = regionManager; dialogs = dialogService; events = eventAggregator; unicode = App.mainWindowViewModel.SelectedItem.Unicode; LoadFile = new DelegateCommand(loadFile); Load = new DelegateCommand(LoadControl); MouseDown = new DelegateCommand(MouseDownEvent); SaveFile = new DelegateCommand(() => { saveFile(); }, CanSaveExcute).ObservesProperty(() => CanSave); SaveAsFlattenCommand = new DelegateCommand(saveAsFlatten); SaveAsFile = new DelegateCommand(() => { saveAsFile(); }); UndoCommand = new DelegateCommand(Undo); RedoCommand = new DelegateCommand(Redo); ShareCommand = new DelegateCommand(share); PropertyCommand = new DelegateCommand(property); ShowInFolderCommand = new DelegateCommand(ShowInFolder); TabControlSelectionChangedCommand = new DelegateCommand(TabControlSelectonChangedEvent); CompressCommand = new DelegateCommand(compress); MergeFileCommand = new DelegateCommand(mergeFile); EncryptCommand = new DelegateCommand(encrypt); DecryptCommand = new DelegateCommand(decrypt); ConvertCommand = new DelegateCommand(convert); CloseWindowCommand = new DelegateCommand(closeWindow); OpenFileCommand = new DelegateCommand(openfile); HelpCommand = new DelegateCommand(help); CreateBlankFileCommand = new DelegateCommand(createBlankFile); ViwerRegionName = RegionNames.ViwerRegionName; SplitViewerRegionName = RegionNames.Viewer_SplitRegionName; BOTARegionName = RegionNames.BOTARegionName; PropertyRegionName = RegionNames.PropertyRegionName; BottomToolRegionName = RegionNames.BottomToolRegionName; ReadModeRegionName = RegionNames.ReadModeRegionName; MenuEnterReadMode = new DelegateCommand(MenuEnterReadModeEvent); PrintCommand = new DelegateCommand(ShowPrintDialog); SelectCommand = new DelegateCommand(SelectClick); SettingsCommand = new DelegateCommand(SettingsEvent); CreateLinkCommand = new DelegateCommand(CreateLinkEvent); ClosePropertyCommand = new DelegateCommand(CloseProperty); //未显示时无法注册上Region名称 ToolContentVisible = Visibility.Visible; ToolsBarContentVisible = Visibility.Visible; OCRContentVisible = Visibility.Visible; TipVisible = Visibility.Visible; TipContentRegionName = RegionNames.TipContentRegionName; LeftTipContentRegionName = RegionNames.LeftTipContentRegionName; NotePopupRegionName = RegionNames.NotePopupRegionName; OCRViewerRegionName = RegionNames.OCRViewerRegionName; ToolContentRegionName = Guid.NewGuid().ToString(); ToolsBarContentRegionName = Guid.NewGuid().ToString(); ConverterBarContentRegionName = Guid.NewGuid().ToString(); TextEditContentRegionName = Guid.NewGuid().ToString(); ToolContentVisible = Visibility.Collapsed; ToolsBarContentVisible = Visibility.Collapsed; OCRContentVisible = Visibility.Collapsed; TipVisible = Visibility.Collapsed; regionNameByTabItem = new Dictionary(); barContentByTabItem = new Dictionary(); InitialregionNameByTabItem(ref regionNameByTabItem); InitialbarContentByTabItem(ref barContentByTabItem); eventAggregator.GetEvent().Subscribe(EnterEditTools, e => e.Unicode == unicode); eventAggregator.GetEvent().Subscribe(CloseEditTool, e => e.Unicode == unicode); eventAggregator.GetEvent().Subscribe(ShowSelectedTipAsync, e => e.Unicode == unicode); //TODO:根据缓存 选择用户上次选择的菜单 EnterSelectedBar("TabItemAnnotation"); } private void MouseDownEvent() { if (NotePopupVisible == Visibility.Visible && IsNoteAdd == false) { NotePopupVisible = Visibility.Collapsed; if (region.Regions.ContainsRegionWithName(NotePopupRegionName)) { var views = region.Regions[NotePopupRegionName].Views; foreach (var item in views) { if (item is StickyNotePopup sticky) { var contentRegion = region.Regions[NotePopupRegionName]; contentRegion.Remove(sticky); break; } } } } } /// ///创建空白文档 /// private async void createBlankFile() { App.mainWindowViewModel.AddTab.Execute(); await Task.Delay(30); (App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel).CreateFile(); } private void help(string args) { string url = ""; switch (args) { case "Guid": //打开内嵌文档 if (File.Exists(App.GuidPDFPath)) { App.mainWindowViewModel.AddTabItem(App.GuidPDFPath); } break; case "Online": url = @"https://www.pdfreaderpro.com/windows/help"; break; case "More": url = @"https://www.pdfreaderpro.com/product?utm_source=MacApp&utm_campaign=ProductLink&utm_medium=PdfProduct"; break; case "Template": url = @"https://www.pdfreaderpro.com/templates?utm_source=MacApp&utm_campaign=TemplatesLink&utm_medium=PdfTemplates"; break; case "Blog": //TODO:显示订阅电子报弹窗 break; case "ComPDF": url = @"https://www.compdf.com/?utm_source=macapp&utm_medium=pdfmac&utm_campaign=compdfkit-promp"; break; case "FeedBack": //调用邮箱 发送邮件 StringBuilder sr = new StringBuilder(); sr.AppendFormat("{0} - {1};{2};{3} - {4}", App.Name, App.Version, "Propose a New Feature", ServiceHelper.ComputerInfo, ServiceHelper.SystemInfo); System.Diagnostics.Process.Start(string.Format("mailto:support@pdfreaderpro.com?subject={0}", sr)); break; default: break; } if (!string.IsNullOrEmpty(url)) { //需要跳转网页的情况 System.Diagnostics.Process.Start(url); } } /// /// 打开文件,跟首页的打开文件有区别,需要新开一个页签 /// private void openfile() { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = Properties.Resources.OpenDialogFilter; openFileDialog.Multiselect = true; if ((bool)openFileDialog.ShowDialog()) { if (openFileDialog.FileNames.Count() == 1) { if (App.OpenedFileList.Contains(openFileDialog.FileName)) { App.mainWindowViewModel.SelectItem(openFileDialog.FileName); } else { App.mainWindowViewModel.AddTabItem(openFileDialog.FileName); } ToolMethod.SetFileThumbImg(openFileDialog.FileName); } else { var fileList = openFileDialog.FileNames.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList(); if (fileList.Count <= 0) { App.mainWindowViewModel.SelectItem(openFileDialog.FileName); return; } mainViewModel.OpenFile(fileList[0]); for (int i = 1; i < fileList.Count(); i++) { if (!App.OpenedFileList.Contains(fileList[i])) { App.mainWindowViewModel.AddTabItem(fileList[i]); } ToolMethod.SetFileThumbImg(fileList[i]); } } } } /// /// 关闭当前窗体 /// private void closeWindow() { App.Current.MainWindow.Close(); } /// /// 转档 /// /// private void convert(string obj) { if (!string.IsNullOrEmpty(obj)) { DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFViewer, PDFViewer); switch (obj) { case "Word": dialogs.ShowDialog(DialogNames.ConverterWordDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "Excel": dialogs.ShowDialog(DialogNames.ConverterExcelDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "PPT": dialogs.ShowDialog(DialogNames.ConverterPPTDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "RTF": dialogs.ShowDialog(DialogNames.ConverterRTFDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "CSV": dialogs.ShowDialog(DialogNames.ConverterCSVDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "HTML": dialogs.ShowDialog(DialogNames.ConverterHTMLDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "Text": dialogs.ShowDialog(DialogNames.ConverterTextDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; case "Image": dialogs.ShowDialog(DialogNames.ConverterImgDialog, value, e => { ConverterDialogsModel converterDialogsModel = new ConverterDialogsModel(); converterDialogsModel.OnOpened((DialogResult)e); }); break; default: break; } } } /// /// 解密 /// private void decrypt() { if (!PDFViewer.Document.IsEncrypted) { MessageBoxEx.Show("No security settings available "); } else { VerifyPasswordResult result = SecurityHelper.VerifyPasswordByPasswordKind(PDFViewer.Document, EnumPasswordKind.StatusPermissionsPassword, dialogs); if (result.IsDiscryptied) { if (result.Password != null) { string filePath = PDFViewer.Document.FilePath; PDFViewer.Document.Release(); PDFViewer.InitDocument(filePath); PDFViewer.Document.UnlockWithPassword(result.Password); } DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFDocument, PDFViewer.Document); dialogs.ShowDialog(DialogNames.DeleteSafetySettingsDialog, value, e => { }); } } } /// /// 加密 /// private void encrypt() { if (!this.SecurityInfo.IsPasswordChanged) { VerifyPasswordResult result = SecurityHelper.VerifyPasswordByPasswordKind(PDFViewer.Document, EnumPasswordKind.StatusPermissionsPassword, dialogs); if (result.IsDiscryptied) { if (result.Password != null) { string filePath = PDFViewer.Document.FilePath; PDFViewer.Document.Release(); PDFViewer.InitDocument(filePath); PDFViewer.Document.UnlockWithPassword(result.Password); } } } DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFViewer, this.PDFViewer); value.Add(ParameterNames.ViewContentViewModel, this); dialogs.ShowDialog(DialogNames.SetPasswordDialog, value, e => { if (e.Result == ButtonResult.OK) { SecurityHelper.IsPasswordChanged = true; if (this.SecurityInfo.IsPasswordChanged) { this.PDFViewer.UndoManager.CanSave = true; } this.events.GetEvent().Publish(new ShowTipEventArgs() { enumTipKind = EnumTipKind.StatusSetPasswordSuccessfully, Unicode = unicode }); } }); } /// /// 合并 /// private void mergeFile() { DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFViewer, PDFViewer); dialogs.ShowDialog(DialogNames.MergeDialog, value, e => { }); } /// /// 压缩 /// private void compress() { DialogParameters value = new DialogParameters(); value.Add(ParameterNames.PDFViewer, PDFViewer); dialogs.ShowDialog(DialogNames.CompressDialog, value, e => { CompressDialogModel compressDialogModel = new CompressDialogModel(); compressDialogModel.OnOpened((Prism.Services.Dialogs.DialogResult)e); }); } /// /// 设置Tip状态栏的显示状态 /// /// 是否显示 public void ShowTip(bool show) { if (show) { TipVisible = Visibility.Visible; } else { TipVisible = Visibility.Collapsed; } } /// /// 设置LeftTip状态栏的显示状态 /// /// 是否显示 public void ShowLeftTip(bool show) { if (show) { LeftTipVisible = Visibility.Visible; } else { LeftTipVisible = Visibility.Collapsed; } } public void CheckHaveAllPermission() { if (!SecurityHelper.CheckHaveAllPermissions(PDFViewer.Document)) { ShowLeftTip(true); NavigationParameters param = new NavigationParameters(); param.Add(ParameterNames.PDFViewer, PDFViewer); region.RequestNavigate(LeftTipContentRegionName, "FileRestrictedTip", param); } } public async void ShowSelectedTipAsync(ShowTipEventArgs showTipEventArgs) { switch (showTipEventArgs.enumTipKind) { case EnumTipKind.StatusNone: ShowLeftTip(false); break; case EnumTipKind.StatusSetPasswordSuccessfully: ShowLeftTip(true); region.RequestNavigate(LeftTipContentRegionName, "SetPasswordSuccessfullyTip"); break; case EnumTipKind.StatusRemoveSecuritySuccessfully: ShowLeftTip(false); region.RequestNavigate(TipContentRegionName, "RemoveSecuritySuccessTip"); IsLoading = Visibility.Collapsed; ShowTip(true); await Task.Delay(3000); //ReadModelTip = Visibility.Collapsed; TipVisible = Visibility.Collapsed; break; default: break; } } /// /// 右键菜单创建链接 /// /// private void CreateLinkEvent(object obj) { if (obj is object[] objArry) { if (objArry[0] is AnnotToolContentViewModel toolContentViewModel && objArry[1] is AnnotCommandArgs annotCommand) { LinkAnnotArgs linkArgs = new LinkAnnotArgs(); linkArgs.URI = string.Empty; linkArgs.LinkType = LINK_TYPE.GOTO; linkArgs.PageIndex = annotCommand.PageIndex; //linkArgs.InvokeLinkSaveCalled(this, EventArgs.Empty); this.IsRightMenuCreateLink = true; List lists = new List(); lists.Add(linkArgs); AnnotHandlerEventArgs annotArgs = toolContentViewModel.GetLink(lists); PDFViewer.SetMouseMode(MouseModes.AnnotCreate); PDFViewer.SetToolParam(annotArgs); this.IsPropertyOpen = true; } } } private void CloseProperty() { IsPropertyOpen = false; } /// /// 在文件资源管理器中显示 /// private void ShowInFolder() { CommonHelper.ShowFileBrowser(PDFViewer.Document.FilePath); } private void property() { DialogParameters valuePairs = new DialogParameters(); valuePairs.Add(ParameterNames.PDFDocument, PDFViewer.Document); dialogs.ShowDialog(DialogNames.PropertyDialog, valuePairs, null); } private void share() { try { var path = PDFViewer.Document.FilePath; string subject = "分享至" + " " + PDFViewer.Document.FileName; System.Diagnostics.Process.Start("outlook", "/a,\"" + path + "\"" + "/m \"" + "&subject=" + subject + "\""); } catch { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "未检测到Ooutlook软件,请先安装Outlook", "OK"); } } private void SettingsEvent() { dialogs.ShowDialog(DialogNames.SettingsDialog, null, null); if (PDFViewer != null) { PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); } } private bool CanSaveExcute() { return CanSave; } private void MenuEnterReadModeEvent(object obj) { } public void ShowPrintDialog() { DialogParameters printValue = new DialogParameters(); printValue.Add(ParameterNames.PDFViewer, PDFViewer); printValue.Add(ParameterNames.FilePath, PDFViewer.Document.FileName); printValue.Add(ParameterNames.PrintCurrentPage, PDFViewer.CurrentIndex); dialogs.ShowDialog(DialogNames.HomePagePrinterDialog, printValue, e => { }); } public void SelectClick() { if (OpenBOTA == false) { OpenBOTA = true; } bool isBook = IsBOTATabItemShow(out BOTAContentViewModel bOTAContentViewModel, out BOTAContent bOTAContent, "TabItemSearch"); if (isBook == false) { bOTAContent.TabItemSearch.IsSelected = true; } } private bool IsBOTATabItemShow(out BOTAContentViewModel bOTAContentViewModel, out BOTAContent bOTAContent, string tabItemText) { bool isTabItem = false; bOTAContentViewModel = null; bOTAContent = null; if (region.Regions.ContainsRegionWithName(this.BOTARegionName)) { var views = region.Regions[this.BOTARegionName].Views; var model = views.FirstOrDefault(q => q is BOTAContent); if (model is BOTAContent bOTAContent1) { bOTAContent = bOTAContent1; bOTAContentViewModel = bOTAContent.DataContext as BOTAContentViewModel; if (bOTAContentViewModel.CurrentBar == tabItemText) { isTabItem = true; } } } return isTabItem; } private void InitialregionNameByTabItem(ref Dictionary dictionary) { dictionary.Add("TabItemPageEdit", ToolContentRegionName); dictionary.Add("TabItemTool", ToolsBarContentRegionName); //其他工具菜单栏共用一个ToolsBarContentRegionName dictionary.Add("TabItemAnnotation", ToolsBarContentRegionName); dictionary.Add("TabItemConvert", ConverterBarContentRegionName); dictionary.Add("TabItemScan", ToolsBarContentRegionName); dictionary.Add("TabItemEdit", TextEditContentRegionName); dictionary.Add("TabItemForm", ToolsBarContentRegionName); dictionary.Add("TabItemFill", ToolsBarContentRegionName); } private void InitialbarContentByTabItem(ref Dictionary dictionary) { dictionary.Add("TabItemPageEdit", "PageEditContent"); dictionary.Add("TabItemTool", "ToolsBarContent"); dictionary.Add("TabItemAnnotation", "AnnotToolContent"); dictionary.Add("TabItemConvert", "ConverterBarContent"); dictionary.Add("TabItemScan", "ScanContent"); dictionary.Add("TabItemEdit", "TextEditToolContent"); dictionary.Add("TabItemForm", "FormsToolContent"); dictionary.Add("TabItemFill", "FillAndSignContent"); } private void UpdateShowContent(string currentBar) { ToolContentVisible = Visibility.Collapsed; ToolsBarContentVisible = Visibility.Collapsed; ConverterBarContentVisible = Visibility.Collapsed; TextEditToolContentVisible = Visibility.Collapsed; OCRContentVisible = Visibility.Collapsed; switch (currentBar) { case "TabItemAnnotation": case "TabItemTool": case "TabItemForm": case "TabItemFill": ToolsBarContentVisible = Visibility.Visible; break; case "TabItemScan": ToolsBarContentVisible = Visibility.Visible; OCRContentVisible = Visibility.Visible; break; case "TabItemEdit": TextEditToolContentVisible = Visibility.Visible; break; case "TabItemConvert": ConverterBarContentVisible = Visibility.Visible; break; case "TabItemPageEdit": case "HeaderFooterContent": case "BatesContent": case "WatermarkContent": case "BackgroundContent": case "RedactionContent": ToolContentVisible = Visibility.Visible; break; default: break; } PDFEditMode(currentBar); FormMode(currentBar); } private void PDFEditMode(string currentBar) { if (currentBar == "TabItemEdit") { if (PDFViewer != null) { PDFViewer.SetMouseMode(MouseModes.PDFEdit); //SelectedPrpoertyPanel("TextEditProperty", null); //IsPropertyOpen = true; } } else { if (PDFViewer != null && PDFViewer.MouseMode == MouseModes.PDFEdit) { IsPropertyOpen = false; PDFViewer.SetMouseMode(MouseModes.PanTool); } } } private void FormMode(string currentBar) { if (currentBar == "TabItemForm") { if (PDFViewer != null) { PDFViewer.SetMouseMode(MouseModes.FormEditTool); } } else { if (PDFViewer != null && PDFViewer.MouseMode == MouseModes.FormEditTool) { PDFViewer.SetMouseMode(MouseModes.PanTool); } } } private void UndoManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (!isInPageEdit) { //不处于页面编辑模式下时,根据PDFVIewer的undo redo状态来更新按钮状态 //页面编辑模式下,按钮状态根据页面编辑的undo redo来显示 if (e.PropertyName == "CanUndo") { CanUndo = PDFViewer.UndoManager.CanUndo; } if (e.PropertyName == "CanRedo") { CanRedo = PDFViewer.UndoManager.CanRedo; } } if (e.PropertyName == "CanSave") { CanSave = PDFViewer.UndoManager.CanSave; } } /// /// 选项卡切换事件 /// /// private void TabControlSelectonChangedEvent(object e) { var args = e as SelectionChangedEventArgs; if (args != null) { var item = args.AddedItems[0] as TabItem; CurrentBar = item.Name; if (previousBar != CurrentBar) { if (CurrentBar == "TabItemPageEdit")//如果是页面编辑则进入页面编辑模式 { EnterToolMode(barContentByTabItem[CurrentBar]); isInPageEdit = true; } else//其余情况直接导航至对应的工具栏即可,不需要清空之前的content,region里是单例模式 { EnterSelectedBar(CurrentBar); isInPageEdit = false; } previousBar = CurrentBar; } } } /// /// 阅读模式 /// /// public async void RbtnReadMode() { App.mainWindowViewModel.SelectedItem.IsInReadctonMode = true; mainViewModel.IsBookMode = true; IsLoading = Visibility.Visible; await Task.Delay(1); PDFViewer.SetMouseMode(MouseModes.PanTool); #region 旧版本 //NavigationParameters param = new NavigationParameters(); //param.Add(ParameterNames.PDFViewer, PDFViewer); //param.Add(ParameterNames.ViewContentViewModel, this); //region.RequestNavigate(ToolContentRegionName, "ReadViewContent", param); ////ShowContent(CurrentBar, true); //if (GridToolRow != 0) //{ // GridToolRow = 0; //} //if (GridToolRowSpan != 4) //{ // GridToolRowSpan = 4; //} ////isInPageEdit = true; //UpdateShowContent("TabItemPageEdit"); #endregion 旧版本 this.events.GetEvent().Publish(new ReadModeArgs() { Unicode = unicode, IsReadMode = true }); IsLoading = Visibility.Collapsed; } /// /// 退出阅读模式 /// public async void UnReadModel() { App.mainWindowViewModel.SelectedItem.IsInReadctonMode = false; mainViewModel.IsBookMode = false; IsLoading = Visibility.Visible; await Task.Delay(1); //PDFViewer.MouseMode = MouseModes.None; #region 旧版本 //if (region.Regions.ContainsRegionWithName(ViwerRegionName)) //{ // if (region.Regions[ViwerRegionName].Views.Contains(PDFViewer)) // { // var contentRegion = region.Regions[ViwerRegionName]; // contentRegion.Remove(PDFViewer); // } // //还原背景色 // PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); // region.AddToRegion(ViwerRegionName, PDFViewer); //} //if (string.IsNullOrEmpty(CurrentBar) || CurrentBar.Equals("TabItemPageEdit", StringComparison.OrdinalIgnoreCase)) //{ // EnterSelectedBar("TabItemAnnotation"); //} //else //{ // EnterSelectedBar(CurrentBar); //} #endregion //还原背景色 PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); this.events.GetEvent().Publish(new ReadModeArgs() { Unicode = unicode, IsReadMode = false }); bool isExist = false; if (region.Regions.ContainsRegionWithName(TipContentRegionName)) { var views = region.Regions[TipContentRegionName].Views; foreach (var item in views) { if (item is Views.TipContent.ReadModelTip readModelTip) { isExist = true; break; } } } if (isExist == false) { region.RequestNavigate(TipContentRegionName, "ReadModelTip"); } IsLoading = Visibility.Collapsed; ShowTip(true); await Task.Delay(3000); //ReadModelTip = Visibility.Collapsed; TipVisible = Visibility.Collapsed; } #region PDFViewer鼠标滚轮缩放事件 public void PdfViewer_MouseWheelZoomHandler(object sender, bool e) { double newZoom = CheckZoomLevel(PDFViewer.ZoomFactor + (e ? 0.01 : -0.01), e); PDFViewer.Zoom(newZoom); } public double CheckZoomLevel(double zoom, bool IsGrowth) { double standardZoom = 100; if (zoom <= 0.01) { return 0.01; } if (zoom >= 10) { return 10; } zoom *= 100; for (int i = 0; i < zoomLevel.Length - 1; i++) { if (zoom > zoomLevel[i] && zoom <= zoomLevel[i + 1] && IsGrowth) { standardZoom = zoomLevel[i + 1]; break; } if (zoom >= zoomLevel[i] && zoom < zoomLevel[i + 1] && !IsGrowth) { standardZoom = zoomLevel[i]; break; } } return standardZoom / 100; } #endregion PDFViewer鼠标滚轮缩放事件 #region Navigate public void OnNavigatedTo(NavigationContext navigationContext) { if (isOpenFile) return; App.mainWindowViewModel.OphVis = Visibility.Collapsed; var mainVM = navigationContext.Parameters[ParameterNames.MainViewModel] as MainContentViewModel; if (mainVM != null) { mainViewModel = mainVM; mainViewModel.viewContentViewModel = this; } var pdfview = navigationContext.Parameters[ParameterNames.PDFViewer] as CPDFViewer; if (pdfview != null) { PDFViewer = pdfview; if (pdfview.Tag != null) { //保存密码 PassWord = pdfview.Tag.ToString(); } loadFile(); CheckHaveAllPermission(); } isOpenFile = true; //快捷键 KeyEventsHelper.KeyDown -= ShortCut_KeyDown; KeyEventsHelper.KeyDown += ShortCut_KeyDown; } public bool IsNavigationTarget(NavigationContext navigationContext) { if (navigationContext != null) { //另存为打开导航进来时 不能新建一个实例 return true; } else { //一次性打开多个文件时,需要新建实例 return false; } } public void OnNavigatedFrom(NavigationContext navigationContext) { KeyEventsHelper.KeyDown -= ShortCut_KeyDown; } #endregion Navigate #region 方法 /// /// 快捷键 /// /// /// /// private void ShortCut_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (KeyEventsHelper.IsSingleKey(System.Windows.Input.Key.Escape)) { if (mainViewModel.IsBookMode == true) { UnReadModel(); } //内容选择 退出 if (PDFViewer.MouseMode != MouseModes.PanTool) { AnnotToolContent annotToolContent = GetAnnotToolContent(out AnnotToolContentViewModel toolContentViewModel); if (annotToolContent != null && toolContentViewModel != null) { if (annotToolContent.BtnSelecttool.IsChecked == true) { if (toolContentViewModel.SnapshotEditMenuViewModel.SnapToolArgs != null) { toolContentViewModel.SnapshotEditMenuViewModel.SnapToolArgs.ReSnapshot(); annotToolContent.BtnSelecttool.IsChecked = false; } } } } } if (KeyEventsHelper.IsModifierKey(ModifierKeys.Control, Key.C)) { //内容选择 复制 快捷键 AnnotToolContent annotToolContent = GetAnnotToolContent(out AnnotToolContentViewModel toolContentViewModel); if (annotToolContent != null && toolContentViewModel != null) { if (annotToolContent.BtnSelecttool.IsChecked == true) { toolContentViewModel.SnapshotEditMenuViewModel.SnapCopyCommand.Execute(); } } } if (KeyEventsHelper.IsModifierKey(ModifierKeys.Control, Key.P)) { AnnotToolContent annotToolContent = GetAnnotToolContent(out AnnotToolContentViewModel toolContentViewModel); if (annotToolContent != null && toolContentViewModel != null) { if (annotToolContent.BtnSelecttool.IsChecked == true) { toolContentViewModel.SnapshotEditMenuViewModel.PrintCommand.Execute(); } } } } private AnnotToolContent GetAnnotToolContent(out AnnotToolContentViewModel toolContentViewModel) { AnnotToolContent toolContent = null; toolContentViewModel = null; if (region.Regions.ContainsRegionWithName(ToolsBarContentRegionName)) { var views = region.Regions[ToolsBarContentRegionName].Views; var model = views.FirstOrDefault(q => q is AnnotToolContent); if (model is AnnotToolContent annotToolContent) { toolContent = annotToolContent; toolContentViewModel = annotToolContent.DataContext as AnnotToolContentViewModel; } } return toolContent; } /// /// 视图面板 切换分屏模式 /// /// public void EnterSplitMode(SplitMode mode) { ///通知UI层更改布局 this.events.GetEvent().Publish(new SplitEventArgs() { Unicode = unicode, Mode = mode }); } private void Undo() { if (isInPageEdit) { //执行页面编辑的Undo PageEditUndo?.Invoke(); } else { PDFViewer.UndoManager.Undo(); } } private void Redo() { if (isInPageEdit) { //执行页面编辑的Redo PageEditRedo?.Invoke(); } else { PDFViewer.UndoManager.Redo(); } } private void LoadControl() { //在构造函数中使用Region需要借助Dispatcher 确保UI已经加载完成,加载BOTA区域 // 非必要情况不要使用该异步方法,可能会导致一次性加载多个文件时出现因异步引起的regionname 错乱问题 //System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => // { NavigationParameters parameters = new NavigationParameters(); parameters.Add(ParameterNames.PDFViewer, PDFViewer); parameters.Add(ParameterNames.ViewContentViewModel, this); region.RequestNavigate(BOTARegionName, "BOTAContent", parameters); region.RequestNavigate(BottomToolRegionName, "BottomToolContent", parameters); region.RequestNavigate(ReadModeRegionName, "ReadModeContent", parameters); region.RequestNavigate(SplitViewerRegionName, "SplitScreenContent", parameters); //TODO 根据上一次关闭记录的菜单,选中TabItem EnterSelectedBar("TabItemAnnotation"); //} //)); //if (App.IsBookMode) //{ // RbtnReadMode(); //} //else //{ // UnReadModel(); //} } /// /// 各个注释(选中和创建注释)导航到对应注释的属性面板 /// /// /// public void SelectedPrpoertyPanel(string Content, AnnotTransfer annotPropertyPanel) { NavigationParameters parameters = new NavigationParameters(); //传其他参数:文档类,空注释面板; parameters.Add(ParameterNames.PDFViewer, PDFViewer); parameters.Add(ParameterNames.PropertyPanelContentViewModel, annotPropertyPanel); parameters.Add(ParameterNames.ViewContentViewModel, this); region.RequestNavigate(PropertyRegionName, Content, parameters); } /// /// 将PDFViwer添加到Region /// private void loadFile() { PDFViewer.MouseWheelZoomHandler += PdfViewer_MouseWheelZoomHandler; PDFViewer.UndoManager.PropertyChanged += UndoManager_PropertyChanged; CanSave = PDFViewer.UndoManager.CanSave; CanUndo = PDFViewer.UndoManager.CanUndo; CanRedo = PDFViewer.UndoManager.CanRedo; //OpenFileInfo 内容赋值给PDFViewer GetOpenFileInfo(); region.AddToRegion(ViwerRegionName, PDFViewer); } /// /// 还原上一次浏览的视图相关设置 /// private void GetOpenFileInfo() { OpenFileInfo = SettingHelper.GetFileInfo(PDFViewer.Document.FilePath); //偏好设置里设置了记录上次视图设置时 if (OpenFileInfo != null && Settings.Default.AppProperties.Description.RecoveryViewWhenOpen) { if (OpenFileInfo.LastViewMode != PDFViewer.ModeView) { PDFViewer.ChangeViewMode(OpenFileInfo.LastViewMode); } if (OpenFileInfo.LastFitMode != PDFViewer.ModeFit) { PDFViewer.ChangeFitMode(OpenFileInfo.LastFitMode); } if (OpenFileInfo.LastFitMode == ComPDFKitViewer.FitMode.FitFree) { PDFViewer.Zoom(OpenFileInfo.LastZoom); } if (OpenFileInfo.LastPageIndex != PDFViewer.CurrentIndex) { PDFViewer.GoToPage(OpenFileInfo.LastPageIndex); } PDFViewer.SetSplitMode(OpenFileInfo.LastSplitMode); PDFViewer.SetShowLink(OpenFileInfo.ShowHighLightLink); if (OpenFileInfo.LastPageSpace) { PDFViewer.SetPageSpacing(8); } else { PDFViewer.SetPageSpacing(0); } if (OpenFileInfo.LastDrawMode == ComPDFKitViewer.DrawModes.Draw_Mode_Custom && OpenFileInfo.LastFillColor != 0) { PDFViewer.SetDrawMode(OpenFileInfo.LastDrawMode, OpenFileInfo.LastFillColor); } else { PDFViewer.SetDrawMode(OpenFileInfo.LastDrawMode); } } else { //新文档应用默认设置 PDFViewer.ChangeViewMode(Settings.Default.AppProperties.InitialVIew.PageView); PDFViewer.ChangeFitMode(Settings.Default.AppProperties.InitialVIew.ZoomMode); PDFViewer.SetShowLink(Settings.Default.AppProperties.InitialVIew.HighlightLink); } } /// /// 已有路径文档的保存逻辑 /// public bool saveFile() { try { if (string.IsNullOrEmpty(PDFViewer.Document.FilePath)) return saveAsFile(); //文档已被修复时 提示另存为 if (PDFViewer.Document.HasRepaired) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "文件已被修复,建议另存为", "Cancel", "OK"); if (alertsMessage.result == ContentResult.Ok) return saveAsFile(); else return false; } //文件路径无法存在时 if (!File.Exists(PDFViewer.Document.FilePath)) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "文件路径不存在,需要另存为", "Cancel", "OK"); if (alertsMessage.result == ContentResult.Ok) return saveAsFile(); else return false; } //只读文件无法写入时,提示另存为 FileInfo fileInfo = new FileInfo(PDFViewer.Document.FilePath); if (fileInfo.IsReadOnly) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "文件为只读文件,需要另存为", "Cancel", "OK"); if (alertsMessage.result == ContentResult.Ok) return saveAsFile(); else return false; } //Security Fixed: //修改密码后原文档保存的步骤: //在设置密码窗口传出“已修改”信号,并允许延迟保存 // if (SecurityInfo.IsPasswordChanged) { string currentFilePath = PDFViewer.Document.FilePath; string tempFilePath = PDFViewer.Document.FilePath + ".temp.pdf"; string openPassword = null; string permissionsPassword = null; CPDFPermissionsInfo cPDFPermissionsInfo = CreateDefaultPermissionsInfo(); if (SecurityInfo.NeedOpenPassword) { openPassword = SecurityInfo.OpenPassword; } if (SecurityInfo.NeedPermissionsPassword) { permissionsPassword = SecurityInfo.PermissionsPassword; cPDFPermissionsInfo = SecurityInfo.CPDFPermissionsInfo; } try { string currentPath = PDFViewer.Document.FilePath; string tempPath = PDFViewer.Document.FilePath + ".temp.pdf"; PDFViewer.Document.Encrypt(openPassword, permissionsPassword, cPDFPermissionsInfo); PDFViewer.Document.WriteToFilePath(tempPath); PDFViewer.CloseDocument(); PDFViewer.InitDocument(tempPath); if (!string.IsNullOrEmpty(permissionsPassword)) { PDFViewer.Document.UnlockWithPassword(permissionsPassword); } else if (!string.IsNullOrEmpty(openPassword)) { PDFViewer.Document.UnlockWithPassword(openPassword); } PDFViewer.Document.Encrypt(openPassword, permissionsPassword, cPDFPermissionsInfo); PDFViewer.Document.WriteToFilePath(currentPath); PDFViewer.CloseDocument(); PDFViewer.InitDocument(currentPath); System.IO.File.Delete(tempPath); if (!string.IsNullOrEmpty(permissionsPassword)) { PDFViewer.Document.UnlockWithPassword(permissionsPassword); } else if (!string.IsNullOrEmpty(openPassword)) { PDFViewer.Document.UnlockWithPassword(openPassword); } try { PDFViewer.Load(); } catch { } PDFViewer.UndoManager.CanSave = false; SecurityInfo.IsPasswordChanged = false; return true; } catch { return false; } } else if (SecurityInfo.IsPasswordRemoved) { try { string currentPath = PDFViewer.Document.FilePath; string tempPath = PDFViewer.Document.FilePath + ".temp.pdf"; PDFViewer.Document.Descrypt(tempPath); PDFViewer.CloseDocument(); PDFViewer.InitDocument(tempPath); PDFViewer.Document.WriteToFilePath(currentPath); PDFViewer.CloseDocument(); PDFViewer.InitDocument(currentPath); PDFViewer.Load(); System.IO.File.Delete(tempPath); } catch { return false; } } bool result = PDFViewer.Document.WriteToLoadedPath(); if (result) { PDFViewer.UndoManager.CanSave = false; App.Current.Dispatcher.Invoke(() => { //保存时更新缩略图 OpenFileInfo info = SettingHelper.GetFileInfo(PDFViewer.Document.FilePath); try { if (!string.IsNullOrEmpty(info.ThumbImgPath) && !PDFViewer.Document.IsEncrypted)//加密的文档不获取缩略图 { var size = PDFViewer.Document.GetPageSize(0); System.Drawing.Bitmap bitmap = ToolMethod.RenderPageBitmapNoWait(PDFViewer.Document, (int)size.Width, (int)size.Height, 0, true, true); string folderPath = System.IO.Path.Combine(App.CurrentPath, "CoverImage"); if (File.Exists(folderPath)) File.Delete(folderPath); DirectoryInfo folder = new DirectoryInfo(folderPath); if (!folder.Exists) folder.Create(); string imagePath = info.ThumbImgPath; if (!File.Exists(imagePath))//由加密文档变为非加密文档时 新建一个路径 { string imageName = Guid.NewGuid().ToString(); imagePath = System.IO.Path.Combine(folderPath, imageName); using (FileStream stream = new FileStream(imagePath, FileMode.Create)) { bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); } } else { using (FileStream stream = new FileStream(imagePath, FileMode.Open)) { bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); } } info.ThumbImgPath = imagePath; SettingHelper.SetFileInfo(info); } } catch { info.ThumbImgPath = null; SettingHelper.SetFileInfo(info); } }); PDFViewer.ReloadDocument(); } else { //文件被占用 保存失败时 AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "文件被占用,需要另存为", "Cancel", "OK"); if (alertsMessage.result == ContentResult.Ok) return saveAsFile(); else return false; } return result; } catch { return false; } } /// /// 另存为或新文档保存逻辑 /// public bool saveAsFile(Action RedactionAction = null) { var dlg = new Microsoft.Win32.SaveFileDialog(); dlg.Filter = Properties.Resources.OpenDialogFilter; dlg.FileName = PDFViewer.Document.FileName; if (dlg.ShowDialog() == true && !string.IsNullOrEmpty(dlg.FileName)) { bool result = false; if (RedactionAction != null) { //保存前进行标记密文处理应用或擦除 RedactionAction.Invoke(); } if (App.OpenedFileList.Contains(dlg.FileName)) { //提示文件已经被打开 } else { result = PDFViewer.Document.WriteToFilePath(dlg.FileName); if (result) { DoAfterSaveAs(dlg.FileName); } else { //提示文件被其他软件占用 无法保存 //MessageBoxEx.Show(App.MainPageLoader.GetString("Main_TheFileOccupiedWarning"), "", Winform.MessageBoxButtons.OKCancel, new string[] { App.MainPageLoader.GetString("Main_SaveAs"), App.MainPageLoader.GetString("Main_Cancel") }) } ; } return result; } else return false; } /// /// 另存为Flatten /// private void saveAsFlatten() { var dlg = new SaveFileDialog(); dlg.Filter = Properties.Resources.OpenDialogFilter; dlg.FileName = PDFViewer.Document.FileName.Substring(0, PDFViewer.Document.FileName.LastIndexOf(".")) + "_Flatten.pdf"; if (dlg.ShowDialog() == true && !string.IsNullOrEmpty(dlg.FileName)) { saveFile(); CPDFDocument kmdoc = CPDFDocument.InitWithFilePath(PDFViewer.Document.FileName); if (kmdoc == null) return; bool result = kmdoc.WriteFlattenToFilePath(dlg.FileName); if (result) System.Diagnostics.Process.Start("explorer", "/select,\"" + dlg.FileName + "\""); kmdoc.Release(); } } /// /// 另存为后进行的操作 /// 重新打开新文档 /// /// public void DoAfterSaveAs(string targetPath) { App.OpenedFileList.Remove(targetPath); string oldFilePath = targetPath; PDFViewer.UndoManager.CanSave = false; mainViewModel.OpenFile(targetPath); //TODO:通知各模块更新PDFview对象 //var result = OpenFile(targetPath, true); //if (result) //{ // FileChanged.Invoke(this, null); // Zoomer.PdfViewer = PdfViewer; // PageSelector.PdfViewer = PdfViewer; // ViewModeSelector.PdfViewer = PdfViewer; // OpenFileInfo fileInfo = SettingHelper.GetFileInfo(oldFilePath); // if (fileInfo != null) // { // PdfViewer.ChangeViewMode(fileInfo.LastViewMode); // PdfViewer.ChangeFitMode(fileInfo.LastFitMode); // if (fileInfo.LastFitMode == FitMode.FitFree) // PdfViewer.Zoom(fileInfo.LastZoom); // PdfViewer.GoToPage(fileInfo.LastPageIndex); // if (fileInfo.LastDrawMode == DrawModes.Draw_Mode_Custom && fileInfo.LastFillColor != 0) // PdfViewer.SetDrawMode(fileInfo.LastDrawMode, fileInfo.LastFillColor); // else // PdfViewer.SetDrawMode(fileInfo.LastDrawMode); // } //} } /// /// 显示前添加内容到Region /// /// private void ShowContent(string currentBar, bool isToolMode = false) { GridVisibility = Visibility.Visible; //显示页面编辑或其他工具 if (currentBar == "TabItemPageEdit" || isToolMode) { if (currentBar == "TabItemPageEdit")//进入页面编辑 { if (GridToolRow != 1) { GridToolRow = 1; } if (GridToolRowSpan != 3) { GridToolRowSpan = 3; } } else//进入水印等其他工具模式 { GridVisibility = Visibility.Collapsed; if (GridToolRow != 0) { GridToolRow = 0; } if (GridToolRowSpan != 4) { GridToolRowSpan = 4; } } //ToolContent的visible跟toolsbarContent 的visible是互斥的 UpdateShowContent(currentBar); } else { if (GridToolRow != 1) { GridToolRow = 1; } UpdateShowContent(currentBar); } } /// /// 从二级工具栏进入需要修改界面布局的场景 /// /// private void EnterEditTools(StringWithUnicode EditToolName) { EnterSelectedEditTool(EditToolName); } private void CloseEditTool(EnumCloseModeUnicode enumCloseModeunicode) { EnumCloseMode enumCloseMode = enumCloseModeunicode.Status; if (enumCloseMode == EnumCloseMode.StatusConfirm) { PDFViewer.Document.ReleasePages(); PDFViewer.ReloadDocument(); } //如果是其他工具共用一个PDFview,退出工具模式后,需要重新添加到Region,否则不会显示 if (!region.Regions[ViwerRegionName].Views.Contains(PDFViewer)) { region.AddToRegion(ViwerRegionName, PDFViewer); } CurrentBar = "TabItemTool"; EnterSelectedBar(CurrentBar); } /// /// 二级菜单指定目标处理 /// /// private void EnterSelectedEditTool(StringWithUnicode EditToolName) { CurrentBar = EditToolName.EditToolsContentName; EnterToolMode(CurrentBar); } /// /// 进入工具编辑(如页面编辑、水印、密文等)模式 /// /// 要导航过去的控件名称 /// 导航需要传送的参数,为空时,默认传送PDFView和ViewContentViewModel private async void EnterToolMode(string targetToolMode, NavigationParameters valuePairs = null) { IsLoading = Visibility.Visible; await Task.Delay(3); NavigationParameters param = new NavigationParameters(); if (valuePairs == null) { param.Add(ParameterNames.PDFViewer, PDFViewer); param.Add(ParameterNames.ViewContentViewModel, this); } else//有传入其他内容的参数时 { param = valuePairs; } region.RequestNavigate(ToolContentRegionName, targetToolMode, param); ShowContent(CurrentBar, true); IsLoading = Visibility.Collapsed; } private void EnterSelectedBar(string currentBar) { NavigationParameters param = new NavigationParameters(); param.Add(ParameterNames.PDFViewer, PDFViewer); param.Add(ParameterNames.ViewContentViewModel, this); region.RequestNavigate(regionNameByTabItem[currentBar], barContentByTabItem[currentBar], param); if (currentBar == "TabItemScan") { region.RequestNavigate(RegionNames.OCRViewerRegionName, "ScanViwer", param); } ShowContent(currentBar); } /// /// 退出工具(水印、密文等)编辑模式,隐藏ToolContent /// public void ExitToolMode() { ToolContentVisible = Visibility.Collapsed; if (isInPageEdit) { TabSelectedIndex = 0; isInPageEdit = false; } } #endregion 方法 } }