SetPasswordDialogViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. using ComPDFKit.PDFDocument;
  2. using PDF_Office.CustomControl;
  3. using PDF_Office.Model;
  4. using PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs;
  5. using Prism.Commands;
  6. using Prism.Mvvm;
  7. using Prism.Services.Dialogs;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel;
  11. using System.Runtime.CompilerServices;
  12. using System.Windows;
  13. using System.Windows.Forms;
  14. using System.Windows.Controls;
  15. using CheckBox = System.Windows.Controls.CheckBox;
  16. using System.Drawing.Printing;
  17. using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.SetPasswordDialogModel;
  18. namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
  19. {
  20. public class SetPasswordDialogViewModel : BindableBase, IDialogAware
  21. {
  22. #region 参数和属性
  23. private SetPasswordDialogModel setPasswordDialogModel = new SetPasswordDialogModel();
  24. private CPDFDocument document;
  25. private bool _canOpen;
  26. public bool CanOpen
  27. {
  28. get { return _canOpen; }
  29. set
  30. {
  31. _canOpen = value;
  32. RaisePropertyChanged("isChecked");
  33. }
  34. }
  35. private bool _canEdit;
  36. public bool CanEdit
  37. {
  38. get { return _canEdit; }
  39. set
  40. {
  41. _canEdit = value;
  42. RaisePropertyChanged("isChecked");
  43. }
  44. }
  45. private EnumPermissionsMod enumPermissionsMod = EnumPermissionsMod.StatusUnknown|EnumPermissionsMod.StatusRestrictPrinting|EnumPermissionsMod.StatusRestrictCopying;
  46. private string _changeMod = "0";
  47. ///<value>
  48. ///"0"为ChangeMod.None;
  49. ///"1"为ChangeMod.ChangePage;
  50. ///"2"为ChangeMod.FormAndSignature;
  51. ///"3"为ChangeMod.AnnotAndFormAndSignature;
  52. ///"4"为ChangeMod.ExceptAbstrat;
  53. ///</value>
  54. public string ChangeMod
  55. {
  56. get { return _changeMod; }
  57. set
  58. {
  59. _changeMod = value;
  60. }
  61. }
  62. private string _printMod = "0";
  63. ///<value>
  64. ///"0"为PrintMod.None;
  65. ///"1"为PrintMod.LowDpi;
  66. ///"2"为PrintMod.HighDpi;
  67. ///</value>
  68. public string PrintMod
  69. {
  70. get { return _printMod; }
  71. set
  72. {
  73. _printMod = value;
  74. }
  75. }
  76. private string _isEnableConfirm = "False";
  77. public string IsEnabledConfirm
  78. {
  79. get { return _isEnableConfirm; }
  80. set
  81. {
  82. SetProperty(ref _isEnableConfirm, value);
  83. }
  84. }
  85. private bool _enableConfirm = false;
  86. public bool EnableConfirm
  87. {
  88. get { return _enableConfirm; }
  89. set { SetProperty(ref _enableConfirm, value); }
  90. }
  91. private string _openPassword = "";
  92. public string OpenPassword
  93. {
  94. get { return _openPassword; }
  95. set
  96. {
  97. SetProperty(ref _openPassword, value);
  98. CheckEnableConfirmEncrypt();
  99. }
  100. }
  101. private string _permissionsPassword = "";
  102. public string PermissionsPassword
  103. {
  104. get { return _permissionsPassword; }
  105. set
  106. {
  107. SetProperty(ref _permissionsPassword, value);
  108. CheckEnableConfirmEncrypt();
  109. }
  110. }
  111. private string _openPasswordMsg = "Open Password";
  112. public string OpenPasswordMsg
  113. {
  114. get { return _openPasswordMsg; }
  115. set
  116. {
  117. SetProperty(ref _openPasswordMsg, value);
  118. }
  119. }
  120. private string _permissionsPasswordMsg = "Permission Password";
  121. public string PermissionsPasswordMsg
  122. {
  123. get { return _permissionsPasswordMsg; }
  124. set
  125. {
  126. SetProperty(ref _permissionsPasswordMsg, value);
  127. }
  128. }
  129. private Visibility _openTextVisibility = Visibility.Collapsed;
  130. public Visibility OpenTextVisibility
  131. {
  132. get { return _openTextVisibility; }
  133. set
  134. {
  135. SetProperty(ref _openTextVisibility, value);
  136. }
  137. }
  138. private Visibility _openPasswordVisibility = Visibility.Visible;
  139. public Visibility OpenPasswordVisibility
  140. {
  141. get { return _openPasswordVisibility; }
  142. set
  143. {
  144. if (value == Visibility.Visible)
  145. {
  146. OpenTextVisibility = Visibility.Collapsed;
  147. }
  148. else
  149. {
  150. OpenTextVisibility = Visibility.Visible;
  151. }
  152. SetProperty(ref _openPasswordVisibility, value);
  153. }
  154. }
  155. private Visibility _permissionsPasswordVisibility = Visibility.Visible;
  156. public Visibility PermissionsPasswordVisibility
  157. {
  158. get { return _permissionsPasswordVisibility; }
  159. set
  160. {
  161. if (value == Visibility.Visible)
  162. {
  163. PermissionsTextVisibility = Visibility.Collapsed;
  164. }
  165. else
  166. {
  167. PermissionsTextVisibility = Visibility.Visible;
  168. }
  169. SetProperty(ref _permissionsPasswordVisibility, value);
  170. }
  171. }
  172. private Visibility _permissionsTextVisibility = Visibility.Collapsed;
  173. public Visibility PermissionsTextVisibility
  174. {
  175. get { return _permissionsTextVisibility; }
  176. set { SetProperty(ref _permissionsTextVisibility, value); }
  177. }
  178. private bool? _isRestrictPrinting;
  179. public bool? IsRestrictPrinting
  180. {
  181. get { return _isRestrictPrinting; }
  182. set { SetProperty(ref _isRestrictPrinting, value); }
  183. }
  184. private bool? _isRestrictCopying;
  185. public bool? IsRestrictCopying
  186. {
  187. get { return _isRestrictCopying; }
  188. set { SetProperty(ref _isRestrictCopying, value); }
  189. }
  190. private bool _needOpenPassword;
  191. public bool NeedOpenPassword
  192. {
  193. get { return _needOpenPassword; }
  194. set { SetProperty(ref _needOpenPassword, value); }
  195. }
  196. private bool _needPermissionsPassword;
  197. public bool NeedPermissionsPassword
  198. {
  199. get { return _needPermissionsPassword; }
  200. set { SetProperty(ref _needPermissionsPassword, value); }
  201. }
  202. private bool _isOpenPasswordDisplayed;
  203. public bool IsOpenPasswordDisplayed
  204. {
  205. get { return _isOpenPasswordDisplayed; }
  206. set { SetProperty(ref _isOpenPasswordDisplayed, value); }
  207. }
  208. private bool _isPermissionsPasswordDisplayed;
  209. public bool IsPermissionsPasswordDisplayed
  210. {
  211. get { return _isPermissionsPasswordDisplayed; }
  212. set { SetProperty(ref _isPermissionsPasswordDisplayed, value); }
  213. }
  214. #endregion
  215. #region 委托声明
  216. public DelegateCommand<object> DisplayPasswordCommand { get; set; }
  217. public DelegateCommand<object> SetOpenPasswordCommand { get; set; }
  218. public DelegateCommand<object> SetPermissionsPasswordCommand { get; set; }
  219. public DelegateCommand<object> SetRestrictCommand { get; set; }
  220. public DelegateCommand EncryptCommand { get; set; }
  221. public DelegateCommand DelegateSetOpenCommand { get; set; }
  222. public DelegateCommand DelegateSetEditCommand { get; set; }
  223. public DelegateCommand DelegateCanOpenTextChangedCommand { get; set; }
  224. public DelegateCommand DelegateCanEditTextChangedCommand { get; set; }
  225. public DelegateCommand DelegateConfirmEncryptCommand { get; set; }
  226. public DelegateCommand CancelEncryptCommand { get; set; }
  227. #endregion
  228. public SetPasswordDialogViewModel()
  229. {
  230. SetPasswordDialogModel.PasswordForOpen = "";
  231. SetPasswordDialogModel.PasswordForEdit = "";
  232. DisplayPasswordCommand = new DelegateCommand<object>(DisplayPassword);
  233. SetOpenPasswordCommand = new DelegateCommand<object>(SetOpenPassword);
  234. SetPermissionsPasswordCommand = new DelegateCommand<object>(SetPermissionsPassword);
  235. SetRestrictCommand = new DelegateCommand<object>(SetRestrict);
  236. EncryptCommand = new DelegateCommand(Encrypt);
  237. CancelEncryptCommand = new DelegateCommand(CancelEncrypt);
  238. DelegateConfirmEncryptCommand = new DelegateCommand(ConfirmEncrypt);
  239. DelegateSetOpenCommand = new DelegateCommand(SetCanOpen);
  240. DelegateSetEditCommand = new DelegateCommand(SetCanEdit);
  241. DelegateCanOpenTextChangedCommand = new DelegateCommand(CanOpenTextChanged);
  242. DelegateCanEditTextChangedCommand = new DelegateCommand(CanEditTextChanged);
  243. }
  244. #region 检查和初始化
  245. private void CheckCanConfirmEncrypt()
  246. {
  247. if (setPasswordDialogModel.CanOpen)
  248. {
  249. if (SetPasswordDialogModel.PasswordForOpen.Length > 0)
  250. {
  251. IsEnabledConfirm = "True";
  252. return;
  253. }
  254. }
  255. if (setPasswordDialogModel.CanEdit)
  256. {
  257. if (SetPasswordDialogModel.PasswordForEdit.Length > 0)
  258. {
  259. IsEnabledConfirm = "True";
  260. return;
  261. }
  262. }
  263. IsEnabledConfirm = "False";
  264. }
  265. private void CheckEnableConfirmEncrypt()
  266. {
  267. EnableConfirm = true;
  268. if (!(NeedOpenPassword || NeedPermissionsPassword))
  269. {
  270. EnableConfirm = false;
  271. }
  272. if (NeedOpenPassword && string.IsNullOrEmpty(OpenPassword))
  273. {
  274. EnableConfirm = false;
  275. }
  276. if (NeedPermissionsPassword && string.IsNullOrEmpty(PermissionsPassword))
  277. {
  278. EnableConfirm = false;
  279. }
  280. if (NeedPermissionsPassword && (!((bool)IsRestrictCopying || (bool)IsRestrictPrinting)))
  281. {
  282. EnableConfirm = false;
  283. }
  284. }
  285. private void InitPermissionsDictionary(ref Dictionary<string, SetPasswordDialogModel.PrintMod> GetPrintMod, ref Dictionary<string, SetPasswordDialogModel.ChangeMod> GetChangeMod)
  286. {
  287. GetPrintMod.Add("0", SetPasswordDialogModel.PrintMod.None);
  288. GetPrintMod.Add("1", SetPasswordDialogModel.PrintMod.LowDpi);
  289. GetPrintMod.Add("2", SetPasswordDialogModel.PrintMod.HighDpi);
  290. GetChangeMod.Add("0", SetPasswordDialogModel.ChangeMod.None);
  291. GetChangeMod.Add("1", SetPasswordDialogModel.ChangeMod.ChangePage);
  292. GetChangeMod.Add("2", SetPasswordDialogModel.ChangeMod.FormAndSignature);
  293. GetChangeMod.Add("3", SetPasswordDialogModel.ChangeMod.AnnotAndFormAndSignature);
  294. GetChangeMod.Add("4", SetPasswordDialogModel.ChangeMod.ExceptAbstrat);
  295. }
  296. #endregion
  297. #region 逻辑函数
  298. public void SetCanOpen()
  299. {
  300. setPasswordDialogModel.CanOpen = CanOpen;
  301. CheckCanConfirmEncrypt();
  302. }
  303. public void SetCanEdit()
  304. {
  305. setPasswordDialogModel.CanEdit = CanEdit;
  306. CheckCanConfirmEncrypt();
  307. }
  308. public void CanOpenTextChanged()
  309. {
  310. CheckCanConfirmEncrypt();
  311. }
  312. public void CanEditTextChanged()
  313. {
  314. CheckCanConfirmEncrypt();
  315. }
  316. public void DisplayPassword(object e)
  317. {
  318. var chk = e as CheckBox;
  319. if (chk != null)
  320. {
  321. if (chk.Name == "DisplayOpenPasswordChk")
  322. {
  323. if (chk.IsChecked == true)
  324. {
  325. OpenPasswordVisibility = Visibility.Collapsed;
  326. }
  327. else
  328. {
  329. OpenPasswordVisibility = Visibility.Visible;
  330. }
  331. }
  332. else
  333. {
  334. if (chk.IsChecked == true)
  335. {
  336. PermissionsPasswordVisibility = Visibility.Collapsed;
  337. }
  338. else
  339. {
  340. PermissionsPasswordVisibility = Visibility.Visible;
  341. }
  342. }
  343. }
  344. }
  345. public void SetOpenPassword(object e)
  346. {
  347. var chk = e as CheckBox;
  348. if (chk != null)
  349. {
  350. IsOpenPasswordDisplayed = false;
  351. OpenPasswordVisibility = Visibility.Visible;
  352. }
  353. CheckEnableConfirmEncrypt();
  354. }
  355. public void SetPermissionsPassword(object e)
  356. {
  357. var chk = e as CheckBox;
  358. if (chk != null)
  359. {
  360. IsPermissionsPasswordDisplayed = false;
  361. PermissionsPasswordVisibility = Visibility.Visible;
  362. if (chk.IsChecked == true)
  363. {
  364. IsRestrictPrinting = true;
  365. IsRestrictCopying = true;
  366. }
  367. else
  368. {
  369. IsRestrictPrinting = false;
  370. IsRestrictCopying = false;
  371. }
  372. }
  373. CheckEnableConfirmEncrypt();
  374. }
  375. public void SetRestrict(object e)
  376. {
  377. var chk = e as CheckBox;
  378. if (chk != null)
  379. {
  380. if ((bool)chk.IsChecked)
  381. {
  382. if (chk.Tag.ToString() == "Printing")
  383. {
  384. enumPermissionsMod |= EnumPermissionsMod.StatusRestrictPrinting;
  385. }
  386. else if (chk.Tag.ToString() == "Copying")
  387. {
  388. enumPermissionsMod |= EnumPermissionsMod.StatusRestrictCopying;
  389. }
  390. }
  391. else
  392. {
  393. if (chk.Tag.ToString() == "Printing")
  394. {
  395. enumPermissionsMod -= EnumPermissionsMod.StatusRestrictPrinting;
  396. }
  397. else if (chk.Tag.ToString() == "Copying")
  398. {
  399. enumPermissionsMod -= EnumPermissionsMod.StatusRestrictCopying;
  400. }
  401. }
  402. }
  403. CheckEnableConfirmEncrypt();
  404. }
  405. public void ConfirmEncrypt()
  406. {
  407. string openPassword = "";
  408. string editPassword = "";
  409. FolderBrowserDialog folderDialog = new FolderBrowserDialog();
  410. System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
  411. /*
  412. *设置这个对话框的起始保存路径
  413. */
  414. sfd.InitialDirectory = document.FilePath;
  415. /*
  416. *设置保存的文件的类型,注意过滤器的语法 例子:“文件类型|*.后缀名;*.后缀名;”
  417. */
  418. sfd.Filter = "PDF|*.pdf;";
  419. /*
  420. *调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
  421. **/
  422. sfd.FileName = document.FileName + "_SetPassword.pdf";
  423. if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  424. {
  425. /*
  426. * 做一些工作
  427. */
  428. CPDFPermissionsInfo permissionsInfo = new CPDFPermissionsInfo();
  429. if (setPasswordDialogModel.CanOpen)
  430. {
  431. if (!string.IsNullOrEmpty(SetPasswordDialogModel.PasswordForOpen))
  432. {
  433. openPassword = SetPasswordDialogModel.PasswordForOpen;
  434. }
  435. }
  436. if (setPasswordDialogModel.CanEdit)
  437. {
  438. if (!string.IsNullOrEmpty(SetPasswordDialogModel.PasswordForEdit))
  439. {
  440. editPassword = SetPasswordDialogModel.PasswordForEdit;
  441. Dictionary<string, SetPasswordDialogModel.PrintMod> GetPrintMod = new Dictionary<string, SetPasswordDialogModel.PrintMod>();
  442. Dictionary<string, SetPasswordDialogModel.ChangeMod> GetChangeMod = new Dictionary<string, SetPasswordDialogModel.ChangeMod>(); ;
  443. InitPermissionsDictionary(ref GetPrintMod, ref GetChangeMod);
  444. permissionsInfo = setPasswordDialogModel.CreatePermissionsInfo(GetPrintMod[PrintMod], GetChangeMod[ChangeMod]);
  445. }
  446. }
  447. document.Encrypt(openPassword, editPassword, permissionsInfo);
  448. document.WriteToFilePath(sfd.FileName);
  449. MessageBoxEx.Show(sfd.FileName + " 保存成功");
  450. RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
  451. }
  452. }
  453. public void Encrypt()
  454. {
  455. string openPassword = "";
  456. string permissionsPassword = "";
  457. FolderBrowserDialog folderDialog = new FolderBrowserDialog();
  458. System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
  459. /*
  460. *设置这个对话框的起始保存路径
  461. */
  462. sfd.InitialDirectory = document.FilePath;
  463. /*
  464. *设置保存的文件的类型,注意过滤器的语法 例子:“文件类型|*.后缀名;*.后缀名;”
  465. */
  466. sfd.Filter = "PDF|*.pdf;";
  467. /*
  468. *调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
  469. **/
  470. sfd.FileName = document.FileName + "_SetPassword.pdf";
  471. if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  472. {
  473. CPDFPermissionsInfo permissionsInfo = new CPDFPermissionsInfo();
  474. if (NeedOpenPassword)
  475. {
  476. if (!string.IsNullOrEmpty(OpenPassword))
  477. {
  478. openPassword= OpenPassword;
  479. }
  480. }
  481. if (NeedPermissionsPassword){
  482. if (!string.IsNullOrEmpty(PermissionsPassword))
  483. {
  484. permissionsPassword = PermissionsPassword;
  485. permissionsInfo = CreatePermissionsInfo(enumPermissionsMod);
  486. }
  487. }
  488. document.Encrypt(openPassword, permissionsPassword, permissionsInfo);
  489. document.WriteToFilePath(sfd.FileName);
  490. MessageBoxEx.Show(sfd.FileName + " 保存成功");
  491. RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
  492. }
  493. }
  494. public void CancelEncrypt() =>
  495. RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
  496. #endregion
  497. #region 框架相关
  498. public string Title => "";
  499. public event Action<IDialogResult> RequestClose;
  500. public bool CanCloseDialog()
  501. {
  502. return true;
  503. }
  504. public void OnDialogClosed()
  505. {
  506. }
  507. public void OnDialogOpened(IDialogParameters parameters)
  508. {
  509. CPDFDocument doc = null;
  510. parameters.TryGetValue<CPDFDocument>(ParameterNames.PDFDocument, out doc);
  511. if (doc != null)
  512. {
  513. document = doc;
  514. }
  515. }
  516. #endregion
  517. }
  518. }