CompressDialogModel.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using ComPDFKit.PDFDocument;
  2. using Microsoft.Office.Interop.Word;
  3. using PDF_Master.CustomControl;
  4. using PDF_Master.Helper;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Diagnostics;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using Task = System.Threading.Tasks.Task;
  13. namespace PDF_Master.Model.Dialog.ToolsDialogs
  14. {
  15. public class CompressDialogModel
  16. {
  17. CPDFDocument tempDocument = null;
  18. IntPtr compressingIntpr = IntPtr.Zero;
  19. public enum EnumQualityLevel
  20. {
  21. StatusLarge = 100,
  22. StatusStandard = 80,
  23. StatusDefault = 40,
  24. StatusLittle = 40,
  25. StatusMicro = 10
  26. }
  27. public EnumQualityLevel CompressQuality { get; set; }
  28. public static string PageIndex { get; set; }
  29. public void CompressClear()
  30. {
  31. tempDocument.CompressFile_Cancel(compressingIntpr);
  32. App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed;
  33. }
  34. private int GetIndex(int pageindex)
  35. {
  36. App.mainWindowViewModel.Value = (pageindex + 1);
  37. if (App.mainWindowViewModel.Value == App.mainWindowViewModel.MaxValue) { App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed; }
  38. return 0;
  39. }
  40. public async void OnOpened(Prism.Services.Dialogs.DialogResult e)
  41. {
  42. string filepath = "";
  43. string password = "";
  44. try
  45. {
  46. if (e.Result == Prism.Services.Dialogs.ButtonResult.Cancel || e.Result == Prism.Services.Dialogs.ButtonResult.None) { return; }
  47. CPDFDocument doc = null;
  48. CPDFDocument.GetPageIndexDelegate indexDelegate = null;
  49. int compressquality = 45;
  50. doc = e.Parameters.GetValue<CPDFDocument>(ParameterNames.PDFDocument);
  51. filepath = e.Parameters.GetValue<string>(ParameterNames.FilePath);
  52. try { if (File.Exists(filepath)) File.Delete(filepath); }
  53. catch
  54. {
  55. AlertsMessage alertsMessage = new AlertsMessage();
  56. alertsMessage.ShowDialog("", App.MainPageLoader.GetString("FileNotExistWarning"), App.ServiceLoader.GetString("Text_ok"));
  57. return;
  58. }
  59. password = e.Parameters.GetValue<string>(ParameterNames.PassWord);
  60. compressquality = e.Parameters.GetValue<int>("compressDialogModel.CompressQuality");
  61. if (doc != null)
  62. {
  63. App.mainWindowViewModel.Value = 0;
  64. App.mainWindowViewModel.ProgressTitle = "Compressing";
  65. App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Visible;
  66. App.mainWindowViewModel.MaxValue = doc.PageCount;
  67. CPDFDocument document = CPDFDocument.InitWithFilePath(doc.FilePath);
  68. document.UnlockWithPassword(password);
  69. indexDelegate += GetIndex;
  70. compressingIntpr = document.CompressFile_Init(compressquality, indexDelegate);
  71. GC.KeepAlive(indexDelegate);//关键 防止委托过早回收
  72. tempDocument = document;
  73. Trace.WriteLine("compressDialogModel.CompressQuality" + compressquality);
  74. App.mainWindowViewModel.ProcessCloseAction = CompressClear;
  75. if (await Task.Run<bool>(() => { return document.CompressFile_Start(compressingIntpr, filepath); })) {
  76. CommonHelper.ShowFileBrowser(filepath);
  77. }
  78. document.Release();
  79. }
  80. }
  81. catch {
  82. AlertsMessage alertsMessage = new AlertsMessage();
  83. alertsMessage.ShowDialog("", "Compress file error", App.ServiceLoader.GetString("Text_ok"));
  84. tempDocument.CompressFile_Cancel(compressingIntpr);
  85. App.mainWindowViewModel.IsProcessVisible = System.Windows.Visibility.Collapsed;
  86. }
  87. }
  88. }
  89. }