WatermarkTemplateListFileContentViewModel.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. using ComPDFKit.PDFDocument;
  2. using ComPDFKit.PDFPage;
  3. using ComPDFKitViewer.PdfViewer;
  4. using PDF_Office.CustomControl;
  5. using PDF_Office.EventAggregators;
  6. using PDF_Office.Helper;
  7. using PDF_Office.Model;
  8. using PDF_Office.Model.EditTools.Background;
  9. using PDF_Office.Model.EditTools.Watermark;
  10. using PDF_Office.Properties;
  11. using PDFSettings;
  12. using Prism.Commands;
  13. using Prism.Events;
  14. using Prism.Mvvm;
  15. using Prism.Regions;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.IO;
  20. using System.Linq;
  21. using System.Threading.Tasks;
  22. using System.Windows;
  23. using System.Windows.Controls;
  24. namespace PDF_Office.ViewModels.EditTools.Watermark
  25. {
  26. public class WatermarkTemplateListFileContentViewModel : BindableBase, INavigationAware
  27. {
  28. private readonly IEventAggregator eventAggregator;
  29. private CPDFViewer CurrentPDFViewer;
  30. public WatermarkInfo WatermarkInfo = new WatermarkInfo();
  31. public WatermarkItem WatermarkItem = new WatermarkItem();
  32. public int TemplateIndex = 0;
  33. public ObservableCollection<WatermarkItem> watermarkModFileCollection = new ObservableCollection<WatermarkItem>();
  34. public ObservableCollection<WatermarkItem> WatermarkModFileCollection
  35. {
  36. get { return watermarkModFileCollection; }
  37. set
  38. {
  39. watermarkModFileCollection = value;
  40. RaisePropertyChanged();
  41. }
  42. }
  43. private Visibility _createTemplateVisible;
  44. public Visibility CreateTemplateVisible
  45. {
  46. get { return _createTemplateVisible; }
  47. set { SetProperty(ref _createTemplateVisible, value); }
  48. }
  49. public DelegateCommand AddTemplateCommand { get; set; }
  50. public DelegateCommand<object> DeleteTemplateItemCommand { get; set; }
  51. public DelegateCommand<object> EditTemplateItemCommand { get; set; }
  52. public DelegateCommand DeleteAllTemplateItemCommand { get; set; }
  53. public DelegateCommand<object> SelectTemplateItemCommand { get; set; }
  54. public WatermarkTemplateListFileContentViewModel(IEventAggregator eventAggregator)
  55. {
  56. this.eventAggregator = eventAggregator;
  57. AddTemplateCommand = new DelegateCommand(AddTemplate);
  58. DeleteTemplateItemCommand = new DelegateCommand<object>(DeleteTemplateItem);
  59. EditTemplateItemCommand = new DelegateCommand<object>(RequestEditTemplateItem);
  60. DeleteAllTemplateItemCommand = new DelegateCommand(DeleteAllTemplateItem);
  61. SelectTemplateItemCommand = new DelegateCommand<object>(SelectTemplateItem);
  62. eventAggregator.GetEvent<CurrentWatermarkPDFViewerEvent>().Subscribe(CurrentWatermarkPDFViewer);
  63. eventAggregator.GetEvent<SaveEditedWatermarkTemplateItemEvent>().Subscribe(SaveEditedWatermarkTemplateItem);
  64. }
  65. public void CurrentWatermarkPDFViewer(CPDFViewer cPDFViewer)
  66. {
  67. CurrentPDFViewer = cPDFViewer;
  68. }
  69. private void CheckTemplateListIsEmpty(List<WatermarkItem> watermarkTemplateList)
  70. {
  71. if (watermarkTemplateList.Count() == 0)
  72. {
  73. CreateTemplateVisible = Visibility.Visible;
  74. }
  75. else
  76. {
  77. CreateTemplateVisible = Visibility.Collapsed;
  78. }
  79. }
  80. private void GetWatermarkSource()
  81. {
  82. List<WatermarkItem> watermarkModTextTemplateList = new List<WatermarkItem>();
  83. for (int temp = 0; temp < Settings.Default.WatermarkTemplateList.Count; temp++)
  84. {
  85. if (Settings.Default.WatermarkTemplateList[temp].type == ComPDFKit.PDFWatermark.C_Watermark_Type.WATERMARK_TYPE_IMG)
  86. {
  87. watermarkModTextTemplateList.Add(Settings.Default.WatermarkTemplateList[temp]);
  88. }
  89. }
  90. WatermarkModFileCollection = new ObservableCollection<WatermarkItem>(watermarkModTextTemplateList);
  91. CheckTemplateListIsEmpty(watermarkModTextTemplateList);
  92. }
  93. private void InitWatermarkTemplateList()
  94. {
  95. if (Settings.Default.WatermarkTemplateList == null)
  96. {
  97. Settings.Default.WatermarkTemplateList = new WatermarkTemplateList();
  98. }
  99. GetWatermarkSource();
  100. }
  101. public void AddTemplate()
  102. {
  103. this.eventAggregator.GetEvent<EnterTemplateListOrCreateEvent>().Publish(EnumTemplateListOrCreate.StatusCreate);
  104. }
  105. public void DeleteTemplateItem(object e)
  106. {
  107. var btn = e as System.Windows.Controls.Control;
  108. if (btn == null)
  109. {
  110. return;
  111. }
  112. var template = btn.DataContext as WatermarkItem;
  113. if (template == null)
  114. {
  115. return;
  116. }
  117. Settings.Default.WatermarkTemplateList.Remove(template);
  118. Settings.Default.Save();
  119. WatermarkModFileCollection.Remove(template);
  120. GetWatermarkSource();
  121. }
  122. public void DeleteAllTemplateItem()
  123. {
  124. while (Settings.Default.WatermarkTemplateList.Count != 0)
  125. {
  126. int temp = 0;
  127. var template = Settings.Default.WatermarkTemplateList[temp];
  128. Settings.Default.WatermarkTemplateList.Remove(template);
  129. Settings.Default.Save();
  130. WatermarkModFileCollection.Remove(template);
  131. }
  132. GetWatermarkSource();
  133. }
  134. public void SaveEditedWatermarkTemplateItem(WatermarkItem watermarkItem)
  135. {
  136. Settings.Default.WatermarkTemplateList[TemplateIndex] = watermarkItem;
  137. Settings.Default.Save();
  138. GetWatermarkSource();
  139. }
  140. public void RequestEditTemplateItem(object e)
  141. {
  142. var control = e as Control;
  143. if (control == null)
  144. {
  145. return;
  146. }
  147. var template = control.DataContext as WatermarkItem;
  148. if (template == null)
  149. {
  150. return;
  151. }
  152. TemplateIndex = Settings.Default.WatermarkTemplateList.IndexOf(template);
  153. ConvertItemToInfo(template, ref WatermarkInfo);
  154. this.eventAggregator.GetEvent<EditWatermarkTemplateItemEvent>().Publish(WatermarkInfo);
  155. }
  156. public void SelectTemplateItem(object e)
  157. {
  158. AlertsMessage alertsMessage = new AlertsMessage();
  159. if (CurrentPDFViewer.Document.GetWatermarkCount() > 0)
  160. {
  161. alertsMessage.ShowDialog("文件中已添加水印,您要替换现有的水印吗?", "", "取消", "确定");
  162. if (alertsMessage.result == ContentResult.Ok)
  163. {
  164. this.eventAggregator.GetEvent<DeleteWatermarkEvent>().Publish(EnumDelete.StatusDeleteInitial);
  165. }
  166. else
  167. {
  168. this.eventAggregator.GetEvent<DeleteWatermarkEvent>().Publish(EnumDelete.StatusCreate);
  169. }
  170. }
  171. var listBox = e as ListBox;
  172. WatermarkItem WatermarkItem = listBox.SelectedItem as WatermarkItem;
  173. SendTemplateItemToDocument(WatermarkItem);
  174. }
  175. public void ConvertItemToInfo(WatermarkItem watermarkItem, ref WatermarkInfo watermarkInfo)
  176. {
  177. if (watermarkItem != null)
  178. {
  179. watermarkInfo.WatermarkType = watermarkItem.type;
  180. FileInfo file = new FileInfo(watermarkItem.imagepath);
  181. if (file.Exists)
  182. {
  183. if (file.Extension == ".pdf")
  184. {
  185. GetBitmapFromDocment(watermarkItem.imagepath);
  186. }
  187. else
  188. {
  189. EditToolsHelper.ChooseFile(watermarkItem.imagepath, ref WatermarkInfo);
  190. }
  191. }
  192. else {
  193. watermarkInfo.WatermarkType = ComPDFKit.PDFWatermark.C_Watermark_Type.WATERMARK_TYPE_UNKWON;
  194. MessageBoxEx.Show("原路径为:"+ watermarkItem.imagepath+",该文件不存在");
  195. }
  196. watermarkInfo.WatermarkHorizalign = watermarkItem.horizalign;
  197. watermarkInfo.WatermarkVertalign = watermarkItem.vertalign;
  198. watermarkInfo.Isfull = watermarkItem.isFullScreen;
  199. watermarkInfo.IsFront = watermarkItem.isfront;
  200. watermarkInfo.ImageSize = watermarkItem.imageSize;
  201. watermarkInfo.Opacity = watermarkItem.opacity;
  202. watermarkInfo.Rotation = watermarkItem.rotation;
  203. watermarkInfo.VertOffset = watermarkItem.vertOffset;
  204. watermarkInfo.HorizOffset = watermarkItem.horizOffset;
  205. watermarkInfo.VerticalSpacing = watermarkItem.verticalSpacing;
  206. watermarkInfo.HorizontalSpacing = watermarkItem.horizontalSpacing;
  207. EditToolsHelper.GetPageRange(watermarkItem.pageRangeIndex, CurrentPDFViewer.Document, ref WatermarkInfo.PageRange, watermarkItem.pageRange);
  208. }
  209. }
  210. public async void GetBitmapFromDocment(string filePath)
  211. {
  212. CPDFDocument document = CPDFDocument.InitWithFilePath(filePath);
  213. CPDFPage page = document.PageAtIndex(0);
  214. byte[] bmp_data = new byte[(int)page.PageSize.Width * (int)page.PageSize.Height * 4];
  215. await Task.Run(delegate
  216. {
  217. page.RenderPageBitmap(0, 0, (int)page.PageSize.Width, (int)page.PageSize.Height, 0xffffffff, bmp_data, 1);
  218. });
  219. WatermarkInfo.ImageArray = bmp_data;
  220. WatermarkInfo.ImageWidth = (int)page.PageSize.Width;
  221. WatermarkInfo.ImageHeight = (int)page.PageSize.Height;
  222. document.ReleasePages();
  223. document.Release();
  224. }
  225. public void SendTemplateItemToDocument(WatermarkItem WatermarkItem)
  226. {
  227. ConvertItemToInfo(WatermarkItem, ref WatermarkInfo);
  228. eventAggregator.GetEvent<SetWatermarkEvent>().Publish(WatermarkInfo);
  229. }
  230. public bool IsNavigationTarget(NavigationContext navigationContext)
  231. {
  232. return true;
  233. }
  234. public void OnNavigatedFrom(NavigationContext navigationContext)
  235. {
  236. }
  237. public void OnNavigatedTo(NavigationContext navigationContext)
  238. {
  239. InitWatermarkTemplateList();
  240. }
  241. }
  242. }