WatermarkDocumentContentViewModel.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using ComPDFKitViewer.PdfViewer;
  2. using PDF_Office.EventAggregators;
  3. using PDF_Office.Model.EditTools.Background;
  4. using PDF_Office.Model;
  5. using Prism.Commands;
  6. using Prism.Events;
  7. using Prism.Mvvm;
  8. using Prism.Regions;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using PDF_Office.Model.EditTools.Watermark;
  13. using ComPDFKit.PDFDocument;
  14. using ComPDFKit.PDFPage;
  15. using System.Windows.Media.Imaging;
  16. using System.Windows.Media;
  17. using System.Threading.Tasks;
  18. using ComPDFKit.PDFWatermark;
  19. using PDF_Office.Helper;
  20. using PDF_Office.Model.Dialog.HomePageToolsDialogs.HomePagePrinter;
  21. using System.Drawing;
  22. using System.Windows;
  23. using ComPDFKitViewer;
  24. using Size = System.Windows.Size;
  25. namespace PDF_Office.ViewModels.EditTools.Watermark
  26. {
  27. public class WatermarkDocumentContentViewModel : BindableBase, INavigationAware
  28. {
  29. public IEventAggregator eventAggregator;
  30. public IRegionManager regionManager;
  31. public CPDFViewer PDFViewer;
  32. public CPDFDocument Document;
  33. private CPDFWatermark watermark;
  34. private WatermarkInfo watermarkInfo;
  35. public bool firstin = true;
  36. public string ViwerRegionName { get; set; }
  37. private ImageSource _imageSource = null;
  38. public ImageSource ImageSource
  39. {
  40. get { return _imageSource; }
  41. set
  42. {
  43. SetProperty(ref _imageSource, value);
  44. }
  45. }
  46. public WatermarkDocumentContentViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
  47. {
  48. this.regionManager = regionManager;
  49. this.eventAggregator = eventAggregator;
  50. eventAggregator.GetEvent<SetWatermarkEvent>().Subscribe(SetWatermark);
  51. ViwerRegionName = RegionNames.WatermarkViwerRegionName;
  52. }
  53. public void SetWatermark(WatermarkInfo watermarkInfo)
  54. {
  55. this.watermarkInfo = watermarkInfo;
  56. //document.PdfToImage("0-1", "D:\\");
  57. //document.WriteToFilePath("D:\\sb22222.pdf");
  58. PDFViewer.InvalidateVisual();
  59. }
  60. public void CreateWatermark(CPDFDocument document)
  61. {
  62. if (watermarkInfo != null)
  63. {
  64. document.DeleteWatermarks();
  65. if (watermarkInfo.WatermarkType == C_Watermark_Type.WATERMARK_TYPE_TEXT)
  66. {
  67. watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_TEXT);
  68. watermark.SetText(watermarkInfo.Text);
  69. if (watermarkInfo.TextSize == null)
  70. {
  71. watermarkInfo.TextSize = "6";
  72. }
  73. watermark.SetFontName(watermarkInfo.FontName);
  74. watermark.SetScale(float.Parse(watermarkInfo.TextSize));
  75. watermark.SetTextRGBColor(watermarkInfo.TextColor);
  76. }
  77. else
  78. {
  79. watermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_IMG);
  80. watermark.SetImage(watermarkInfo.ImageArray, watermarkInfo.ImageWidth, watermarkInfo.ImageHeight);
  81. watermark.SetScale(0.1f);
  82. }
  83. watermark.SetRotation(watermarkInfo.Rotation);
  84. watermark.SetOpacity(watermarkInfo.Opacity);
  85. watermark.SetFront(watermarkInfo.IsFront);
  86. watermark.SetVertalign(watermarkInfo.WatermarkVertalign);
  87. watermark.SetHorizalign(watermarkInfo.WatermarkHorizalign);
  88. watermark.SetFullScreen(watermarkInfo.Isfull);
  89. watermark.SetVertOffset(watermarkInfo.VertOffset);
  90. watermark.SetHorizOffset(watermarkInfo.HorizOffset);
  91. watermark.SetHorizontalSpacing(watermarkInfo.HorizontalSpacing);
  92. watermark.SetVerticalSpacing(watermarkInfo.VerticalSpacing);
  93. watermark.SetPages(watermarkInfo.PageRange);
  94. watermark.CreateWatermark();
  95. watermark.UpdateWatermark();
  96. }
  97. }
  98. public BitmapSource ToBitmapSource(System.Drawing.Bitmap image)
  99. {
  100. IntPtr ptr = image.GetHbitmap();//obtain the Hbitmap
  101. BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap
  102. (
  103. ptr,
  104. IntPtr.Zero,
  105. Int32Rect.Empty,
  106. System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()
  107. );
  108. return bs;
  109. }
  110. public async Task RenderBitmap(CPDFDocument doc)
  111. {
  112. CPDFPage page = doc.PageAtIndex(0, true);
  113. byte[] bmp_data = new byte[(int)page.PageSize.Width * (int)page.PageSize.Height * 4];
  114. Bitmap bitmap = await ToolMethod.RenderPageBitmap(Document, (int)(page.PageSize.Width * 1 * 1.4), (int)(page.PageSize.Height * 1 * 1.4), 0, true, true);
  115. ImageSource = ToBitmapSource(bitmap);
  116. doc.ReleasePages();
  117. }
  118. private void UndoManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  119. {
  120. }
  121. private void CurrentViewer_CustomDrawHandler(object sender, CustomDrawData e)
  122. {
  123. if (e.DrawPages.Count > 0 && e.DrawContext != null)
  124. {
  125. foreach (DrawPageData drawPageData in e.DrawPages)
  126. {
  127. WriteableBitmap waterMarkBitmap = GetWaterMark(PDFViewer.Document, e.Zoom, drawPageData.PageIndex);
  128. e.DrawContext.DrawImage(waterMarkBitmap, drawPageData.PageBound);
  129. }
  130. }
  131. }
  132. private WriteableBitmap GetWaterMark(CPDFDocument oldDoc, double zoom, int pageIndex)
  133. {
  134. Size pageSize = oldDoc.GetPageSize(pageIndex);
  135. CPDFDocument newDoc = CPDFDocument.CreateDocument();
  136. newDoc.InsertPage(0, pageSize.Width, pageSize.Height, null);
  137. CreateWatermark(newDoc);
  138. CPDFPage newPage = newDoc.PageAtIndex(0);
  139. double scale = 96.0 / 72.0;
  140. zoom = zoom * scale;
  141. Rect renderRect = new Rect(0, 0, (int)(pageSize.Width * scale), (int)(pageSize.Height * scale));
  142. byte[] imageArray = new byte[(int)(renderRect.Width * renderRect.Height * 4)];
  143. newPage.RenderPageBitmapWithMatrix((float)zoom, renderRect, 0x00FFFFFF, imageArray, 1, true);
  144. WriteableBitmap WirteBitmap = new WriteableBitmap((int)renderRect.Width, (int)renderRect.Height, 96, 96, PixelFormats.Bgra32, null);
  145. WirteBitmap.WritePixels(new Int32Rect(0, 0, (int)renderRect.Width, (int)renderRect.Height), imageArray, WirteBitmap.BackBufferStride, 0);
  146. return WirteBitmap;
  147. }
  148. public bool IsNavigationTarget(NavigationContext navigationContext)
  149. {
  150. return true;
  151. }
  152. public void OnNavigatedFrom(NavigationContext navigationContext)
  153. {
  154. }
  155. public void OnNavigatedTo(NavigationContext navigationContext)
  156. {
  157. navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
  158. if (PDFViewer != null)
  159. {
  160. Document = PDFViewer.Document;
  161. if (!regionManager.Regions[ViwerRegionName].Views.Contains(PDFViewer))
  162. {
  163. PDFViewer.CustomDrawHandler += CurrentViewer_CustomDrawHandler;
  164. PDFViewer.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
  165. regionManager.AddToRegion(ViwerRegionName, PDFViewer);
  166. PDFViewer.SetAnnotInteraction(!PDFViewer.GetAnnotInteraction());
  167. }
  168. }
  169. }
  170. }
  171. }