using ComPDFKitViewer.PdfViewer; using Microsoft.Win32; using PDF_Office.CustomControl; using PDF_Office.EventAggregators; using PDF_Office.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_Office.Model; using System.ComponentModel; using PDF_Office.Helper; using PDFSettings.Settings; using System.Drawing; using System.IO; using System.Drawing.Imaging; using ComPDFKit.PDFDocument; using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.DeleteSafetySettintgsModel; using PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs; using PDF_Office.Properties; namespace PDF_Office.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 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); } } private bool isNewDocument = false; 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); } } 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(); } //关闭页签 private void unload() { if (PDFViewer != null) { 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); } } /// /// 打开指定路径的PDF文件 /// /// public void OpenFile(string filePath) { var result = LoadFileFormPath(filePath); if (!result) { return; } FilePath = filePath; NavigateToViewContent(); //检查是否是新文档 OpenFileInfo isnew = SettingHelper.GetFileInfo(filePath); if (isnew == null) { isNewDocument = true; if (App.OpenedFileList.Contains(filePath) == false) { App.OpenedFileList.Add(filePath); } } //打开文件后,不管是新文件还是旧文件都需要更新排序 SettingHelper.SortRecentOpenFiles(filePath); } /// /// 创建PDFviewer对象后导航到ViewContent /// private void NavigateToViewContent() { NavigationParameters parameters = new NavigationParameters { { ParameterNames.MainViewModel, this }, { ParameterNames.PDFViewer,PDFViewer} }; toolregion.RequestNavigate(MainContentRegionName, "ViewContent", parameters); IsReNameEnable = true; if (!string.IsNullOrEmpty(PDFViewer.Document.FilePath)) { 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; } if (!App.OpenedFileList.Contains(path)) { App.OpenedFileList.Add(path); } 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("", "创建文件失败.", "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("", "创建文件失败.", "OK"); return false; } } //设置背景色 PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); PDFViewer.Load(); PDFViewer.UndoManager.CanSave = true; FileChanged = Visibility.Visible; PDFViewer.SetFormFieldHighlight(Settings.Default.AppProperties.InitialVIew.HighlightLink); NavigateToViewContent(); return true; } /// /// 从office文件转换成PDF /// /// /// public async Task CreateFileFromOffice(string sourcepath, Microsoft.Office.Interop.Word.WdPaperSize paperSize = Microsoft.Office.Interop.Word.WdPaperSize.wdPaperA4, double margin = 0) { try { //生成存放临时pdf的临时文件夹 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() + ".pdf"); string ex = System.IO.Path.GetExtension(sourcepath).ToLower(); await Task.Delay(10); switch (ex) { case ".doc": case ".docx": case "docm": case ".dot": case ".dotx": case ".dotm": case ".txt": case ".html": await Task.Run(() => { Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document document = null; word.Visible = false; word.ShowWindowsInTaskbar = true; document = word.Documents.Open(sourcepath); var page = document.PageSetup; page.PaperSize = paperSize; if (margin > 0) { page.LeftMargin = page.TopMargin = page.RightMargin = page.BottomMargin = (float)margin; } document?.ExportAsFixedFormat(targetPath, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF); document?.Close(false); if (word != null) { word.NormalTemplate.Saved = true; word.Quit(); } }); break; case ".xls": case ".xlsx": case ".xlsm": case ".xlsb": case ".xlam": case ".xltx": case ".xlt": await Task.Run(() => { Microsoft.Office.Interop.Excel.Application excele = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workbook = null; excele.Visible = false; try { workbook = excele.Workbooks.Open(sourcepath); } catch (Exception e) { workbook = excele.Workbooks.Open(sourcepath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile); } workbook?.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, targetPath); workbook?.Close(); excele?.Quit(); }); break; case ".ppt": case ".pptx": case ".pptm": case ".pptsx": case ".pps": case ".pptsm": case ".pot": case ".potm": await Task.Run(() => { Microsoft.Office.Interop.PowerPoint.Application ppt = new Microsoft.Office.Interop.PowerPoint.Application(); Microsoft.Office.Interop.PowerPoint.Presentation presentation = null; ppt.Visible = Microsoft.Office.Core.MsoTriState.msoCTrue; presentation = ppt.Presentations.Open(sourcepath); presentation.ExportAsFixedFormat(targetPath, Microsoft.Office.Interop.PowerPoint.PpFixedFormatType.ppFixedFormatTypePDF); presentation?.Close(); ppt?.Quit(); }); break; } PDFViewer = new CPDFViewer(); PDFViewer.CreateDocument(); if (PDFViewer.Document == null) { AlertsMessage alertsMessage = new AlertsMessage(); alertsMessage.ShowDialog("", "创建PDF失败", "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("", "创建PDF失败", "OK"); return false; } PDFViewer.Document.ImportPages(tempdoc, ""); PDFViewer.SetBackgroundBrush(new System.Windows.Media.SolidColorBrush(Settings.Default.AppProperties.InitialVIew.BackGround)); PDFViewer.Load(); PDFViewer.UndoManager.CanSave = true; FileChanged = Visibility.Visible; PDFViewer.SetFormFieldHighlight(Settings.Default.AppProperties.InitialVIew.HighlightLink); await System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => { NavigateToViewContent(); })); return true; } catch (Exception ex) { 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("", "没有安装Office", "OK"); } else { alertsMessage.ShowDialog("", "创建PDF失败", "OK"); } return false; } } private void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "CanSave") { if (PDFViewer.UndoManager.CanSave) { FileChanged = Visibility.Visible; } else { FileChanged = Visibility.Collapsed; } if (!string.IsNullOrEmpty(PDFViewer.Document.FileName)) { FileName = PDFViewer.Document.FileName; } } } #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) { 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 = await CreateFileFromOffice(filepath); } 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 } }