using ComPDFKitViewer.PdfViewer; using Microsoft.Win32; using PDF_Master.CustomControl; using PDF_Master.EventAggregators; using PDF_Master.Views; using Prism.Commands; using Prism.Events; using Prism.Ioc; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using PDF_Master.Model; using System.ComponentModel; using PDF_Master.Helper; using PDFSettings; using System.Drawing; using System.IO; using System.Drawing.Imaging; using ComPDFKit.PDFDocument; using static PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs.DeleteSafetySettintgsModel; using PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs; using PDF_Master.Properties; using WIA; namespace PDF_Master.ViewModels { public class MainContentViewModel : BindableBase, INavigationAware { #region 文案 private string T_rename; public string T_Rename { get { return T_rename; } set { SetProperty(ref T_rename, value); } } private string T_floder; public string T_Floder { get { return T_floder; } set { SetProperty(ref T_floder, value); } } private string T_close; public string T_Close { get { return T_close; } set { SetProperty(ref T_close, value); } } private string T_closeAll; public string T_CloseAll { get { return T_closeAll; } set { SetProperty(ref T_closeAll, value); } } private void InitString() { FileName = App.MainPageLoader.GetString("MultipleTabs_Default"); T_Rename = App.MainPageLoader.GetString("MultipleTabs_Rename"); T_Floder = App.MainPageLoader.GetString("MultipleTabs_ Folder"); T_Close = App.MainPageLoader.GetString("MultipleTabs_ Close"); T_CloseAll = App.MainPageLoader.GetString("MultipleTabs_ CloseAll"); } #endregion 文案 /// /// 是否是注释列表点击 /// public bool AnnotMouseLeftButtonDown { get; set; } = false; /// /// 是否使用了高级功能 /// public bool IsUsedVIP = false; /// /// 是否处于阅读模式 /// public bool IsBookMode = false; private string fileName = "Home"; public string FileName { get { return fileName; } set { SetProperty(ref fileName, value); if (IsReNameTextShow == Visibility.Visible) { dorenameFile(); } } } private string filePath; public string FilePath { get { return filePath; } set { SetProperty(ref filePath, value); if (!string.IsNullOrEmpty(filePath)) { FileName = System.IO.Path.GetFileName(filePath); } } } private Visibility fileChanged = Visibility.Collapsed; public Visibility FileChanged { get { return fileChanged; } set { SetProperty(ref fileChanged, value); } } public CPDFViewer PDFViewer { get; set; } public DelegateCommand CloseTab { get; set; } public DelegateCommand UnLoaded { get; set; } public DelegateCommand ShowInFolderCommand { get; set; } public DelegateCommand RenameCommand { get; set; } public ViewContentViewModel viewContentViewModel { get; set; } public MainWindowViewModel mainWindowViewModel { get; set; } public HomeContentViewModel homeContentViewModel { get; set; } private string regionName; public string MainContentRegionName { get { return regionName; } set { SetProperty(ref regionName, value); } } private bool isReNameEnable = false; /// /// 是否能够重命名 /// public bool IsReNameEnable { get { return isReNameEnable; } set { SetProperty(ref isReNameEnable, value); } } private bool isShowInFolderEnable = false; /// /// 是否能够显示文件浏览器 /// public bool IsShowInFolderEnable { get { return isShowInFolderEnable; } set { SetProperty(ref isShowInFolderEnable, value); } } private Visibility isRenameTextShow = Visibility.Collapsed; public Visibility IsReNameTextShow { get { return isRenameTextShow; } set { SetProperty(ref isRenameTextShow, value); } } private bool newFile = false; /// /// 是否是新建的文档 /// public bool NewFile { get { return newFile; } set { SetProperty(ref newFile, value); if (!value) { IsShowInFolderEnable = true; } } } public IRegionManager toolregion; public IEventAggregator eventer; public IContainerProvider container; public IDialogService dialogs; public MainContentViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, IContainerProvider containerProvider, IDialogService dialogService) { toolregion = regionManager; eventer = eventAggregator; container = containerProvider; dialogs = dialogService; CloseTab = new DelegateCommand(CloseTabItem); ShowInFolderCommand = new DelegateCommand(showInFolder); RenameCommand = new DelegateCommand(rename); UnLoaded = new DelegateCommand(unload); MainContentRegionName = Guid.NewGuid().ToString(); InitString(); } //关闭页签 //清除文件记录,释放Document对象 private void unload() { if (PDFViewer != null) { App.OpenedFileList.Remove(PDFViewer.Document?.FilePath); PDFViewer.CloseDocument(); } } /// /// 执行重命名操作 /// private void dorenameFile() { var folder = PDFViewer.Document.FilePath.Substring(0, PDFViewer.Document.FilePath.LastIndexOf("\\")); ////File.Replace(PDFViewer.Document.FilePath,Path.Combine(folder,FileName),Path.Combine(folder,"back.bak"),true); ///TODO:会被占用 无法操作 IsReNameTextShow = Visibility.Collapsed; } /// /// 显示重命名文本框 /// private void rename() { IsReNameTextShow = Visibility.Visible; } private void showInFolder() { if (!string.IsNullOrEmpty(PDFViewer.Document.FilePath)) { CommonHelper.ShowFileBrowser(PDFViewer.Document.FilePath); } } private void CloseTabItem(object item) { if (item == null) { App.mainWindowViewModel?.CloseTabItem(mainWindowViewModel.SelectedItem); } else { App.mainWindowViewModel?.CloseTabItem(item); App.OpenedFileList.Remove(FilePath); if (NewFile) { //新文档 关闭文档后 及时清空临时缓存 DirectoryInfo directory = new DirectoryInfo(CacheFilePath.Instance.CreatedFilePath); FileInfo fileInfo = new FileInfo(FilePath); if (directory.GetFiles().ToList().Contains(fileInfo)) { File.Delete(FilePath); } } } } /// /// 打开指定路径的PDF文件 /// /// public void OpenFile(string filePath, PasswordInfo passwordInfo = null) { var result = LoadFileFormPath(filePath); if (!result) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Main_OpenFileFailedWarning"), App.ServiceLoader.GetString("Text_ok")); return; } FilePath = filePath; NavigateToViewContent(); if (App.OpenedFileList.Contains(filePath) == false) { App.OpenedFileList.Add(filePath); } //打开文件后,不管是新文件还是旧文件都需要更新排序 SettingHelper.SortRecentOpenFiles(filePath); } /// /// 创建PDFviewer对象后导航到ViewContent /// private void NavigateToViewContent(PasswordInfo passwordInfo = null) { NavigationParameters parameters = new NavigationParameters { { ParameterNames.MainViewModel, this }, { ParameterNames.PDFViewer,PDFViewer}, { ParameterNames.PasswordInfo, passwordInfo} }; toolregion.RequestNavigate(MainContentRegionName, "ViewContent", parameters); IsReNameEnable = true; if (!string.IsNullOrEmpty(PDFViewer.Document.FilePath) && !NewFile) { IsShowInFolderEnable = true; } } /// /// 从文件路径创建PDFViewer对象,已包含文档解密逻辑 /// /// /// private bool LoadFileFormPath(string path) { PDFViewer = new CPDFViewer(); PDFViewer.InitDocument(path); PDFViewer.UndoManager.PropertyChanged += UndoManager_PropertyChanged; if (PDFViewer.Document == null) { //MessageBoxEx.Show(App.MainPageLoader.GetString("Main_OpenFileFailedWarning")); return false; } else { //解密逻辑调整到显示阅读页后,测试确认没问题后,删除下面的注释部分代码 //VerifyPasswordResult result = SecurityHelper.VerifyPasswordByPasswordKind(PDFViewer.Document, EnumPasswordKind.StatusOpenPassword, dialogs); //if (result.IsDiscryptied) //{ // if (result.Password != null) // { // string filePath = PDFViewer.Document.FilePath; // PDFViewer.Document.UnlockWithPassword(result.Password); // PDFViewer.Tag = result.Password; // } // ///TODO: // ///此处填入需要执行的代码 //} //if (result.IsDiscryptied == false) //{ // //未成功解密文档时,释放Document对象,返回 // PDFViewer.Document.Release(); // return false; //} } //PDFViewer.Load(); //PDFViewer.SetFormFieldHighlight(Settings.Default.AppProperties.InitialVIew.HighlightLink); //PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); if (App.mainWindowViewModel != null) { App.mainWindowViewModel.CurrentPDFViewer = PDFViewer; } return true; } /// /// 创建文件,路径为空时表示创建空白文档 /// 否则表示从图片路径创建PDf /// /// /// public bool CreateFile(string imagePath = null) { PDFViewer = new CPDFViewer(); PDFViewer.CreateDocument(); PDFViewer.UndoManager.PropertyChanged += UndoManager_PropertyChanged; if (PDFViewer.Document == null) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok")); return false; } if (string.IsNullOrEmpty(imagePath)) { FileName = "Blank Page.pdf"; //默认插入595*842 大小的页面 PDFViewer.Document.InsertPage(0, 595, 842, null); } else { FileName = imagePath.Substring(imagePath.LastIndexOf("\\") + 1, imagePath.LastIndexOf(".") - imagePath.LastIndexOf("\\") - 1) + ".pdf"; Bitmap pic = new Bitmap(imagePath); int width = pic.Size.Width; int height = pic.Size.Height; string ex = System.IO.Path.GetExtension(imagePath); //其他格式或者名称中含空格的图片 在本地先转存一下 if ((ex != ".jpg" && ex != ".jpeg") || !Uri.IsWellFormedUriString(imagePath, UriKind.Absolute)) { //将其他格式图片转换成jpg string folderPath = Path.GetTempPath(); if (File.Exists(folderPath)) { File.Delete(folderPath); } DirectoryInfo tempfolder = new DirectoryInfo(folderPath); if (!tempfolder.Exists) { tempfolder.Create(); } string targetPath = System.IO.Path.Combine(folderPath, Guid.NewGuid().ToString()); imagePath = targetPath; pic.Save(targetPath, ImageFormat.Jpeg); } pic.Dispose(); var result = PDFViewer.Document.InsertPage(0, width, height, imagePath); if (!result) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok")); return false; } } SaveToTempFile(); PDFViewer.UndoManager.CanSave = true; FileChanged = Visibility.Visible; NavigateToViewContent(); return true; } /// /// 从office文件转换成PDF /// /// /// public bool CreateFileFromOffice(string sourcepath, Microsoft.Office.Interop.Word.WdPaperSize paperSize = Microsoft.Office.Interop.Word.WdPaperSize.wdPaperA4, double margin = 0) { try { string targetPath = ""; targetPath = ConverterHelper.ConvertOfficeToPDF(sourcepath, paperSize, margin); PDFViewer = new CPDFViewer(); PDFViewer.CreateDocument(); if (PDFViewer.Document == null) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok")); return false; } FileName = sourcepath.Substring(sourcepath.LastIndexOf("\\") + 1, sourcepath.LastIndexOf(".") - sourcepath.LastIndexOf("\\") - 1) + ".pdf"; var tempdoc = CPDFDocument.InitWithFilePath(targetPath); if (tempdoc == null) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", App.MainPageLoader.GetString("Create PDF failed"), App.ServiceLoader.GetString("Text_ok")); return false; } PDFViewer.Document.ImportPages(tempdoc, ""); SaveToTempFile(); PDFViewer.UndoManager.CanSave = true; FileChanged = Visibility.Visible; //await System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => //{ NavigateToViewContent(); //})); return true; } catch (Exception) { string str = "没有安装"; //判断是否有安装office软件 var officeType = Type.GetTypeFromProgID("Word.Application"); if (officeType == null) { str += "Word;"; } officeType = Type.GetTypeFromProgID("Excel.Application"); if (officeType == null) { str += "Excel;"; } officeType = Type.GetTypeFromProgID("Powerpoint.Application"); if (officeType == null) { str += "Excel;"; } AlertsMessage alertsMessage = new AlertsMessage(); if (str != "没有安装") { alertsMessage.ShowDialog("", App.MainPageLoader.GetString("NoOffice_Warning"), App.ServiceLoader.GetString("Text_ok")); } else { alertsMessage.ShowDialog("", App.MainPageLoader.GetString("CreateFileFailedWarning"), App.ServiceLoader.GetString("Text_ok")); } return false; } } /// /// 新建的文档 保存至临时文件 解决新建文档没有路径的问题 /// private void SaveToTempFile() { if (PDFViewer != null) { string tempfile = CacheFilePath.Instance.CreatedFilePath; string file = CommonHelper.CreateFilePath(Path.Combine(tempfile, App.UntitledFileNmae)); PDFViewer.Document.WriteToFilePath(file); PDFViewer.CloseDocument(); PDFViewer.InitDocument(file); FilePath = file; //在viewcontent里打开是 会重新load 因此这里不需要load 避免重复 NewFile = true; } } private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "CanSave") { if (PDFViewer.UndoManager.CanSave) { FileChanged = Visibility.Visible; } else { FileChanged = Visibility.Collapsed; } //保存完后,需要更新产品名字 if (!PDFViewer.UndoManager.CanSave && !string.IsNullOrEmpty(PDFViewer.Document.FileName)) { FileName = System.IO.Path.GetFileName(PDFViewer.Document.FilePath); } } } #region Navigation public async void OnNavigatedTo(NavigationContext navigationContext) { mainWindowViewModel = App.mainWindowViewModel; //因为是异步打开多个文件,需要先显示Home界面 NavigationParameters parameters = new NavigationParameters(); parameters.Add(ParameterNames.MainViewModel, this); if (toolregion.Regions.ContainsRegionWithName(MainContentRegionName)) { toolregion.RequestNavigate(MainContentRegionName, "HomeContent", parameters); } //常规加载首页的情况 if (navigationContext.Parameters.Count <= 0) { return; } //一次打开多个文件的情况 var filepath = navigationContext.Parameters[ParameterNames.FilePath].ToString(); if (filepath != null) { homeContentViewModel.IsLoading = Visibility.Visible; await Task.Delay(3); bool result = true; if (System.IO.Path.GetExtension(filepath.ToString()).ToLower() == ".pdf") { OpenFile(filepath.ToString()); } else if (Properties.Resources.imageex.Contains(System.IO.Path.GetExtension(filepath).ToLower())) { //图片转PDF result = CreateFile(filepath); } else { result = CreateFileFromOffice(filepath); } homeContentViewModel.IsLoading = Visibility.Collapsed; if (!result) { mainWindowViewModel.CloseTabItem(mainWindowViewModel.SelectedItem); return; } if (!App.OpenedFileList.Contains(filepath)) { //更新已打开的文件记录 App.OpenedFileList.Add(filepath); } } } public bool IsNavigationTarget(NavigationContext navigationContext) { return false; } public void OnNavigatedFrom(NavigationContext navigationContext) { } #endregion Navigation } }