WatermarkDocumentContentViewModel.cs 8.4 KB

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