CPDFCreateSignatureDialog.xaml.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. using ComPDFKit.Controls.Data;
  2. using Microsoft.Win32;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing.Imaging;
  6. using System.Drawing;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Data;
  12. using System.Windows.Media;
  13. using System.Windows.Media.Imaging;
  14. using System.Globalization;
  15. using System.Windows.Ink;
  16. using ComPDFKit.Controls.Common;
  17. using ComPDFKitViewer.Helper;
  18. namespace ComPDFKit.Controls.Annotation.PDFAnnotationPanel.PDFAnnotationUI
  19. {
  20. public partial class CPDFCreateSignatureDialog : Window
  21. {
  22. SolidColorBrush solidColorBrush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0xFF, 0xFF, 0x00, 0x00));
  23. public CPDFSignatureData cPDFSignatureData;
  24. private string SaveToPath;
  25. private string SignaturePath;
  26. private string DrawingSaveToPath;
  27. private double StrokeWidth = 3;
  28. private double StrokeHigh = 3;
  29. private bool IsPageLoaded = false;
  30. private string postScriptName;
  31. public CPDFCreateSignatureDialog()
  32. {
  33. InitializeComponent();
  34. }
  35. private void Window_Loaded(object sender, RoutedEventArgs e)
  36. {
  37. SignaturePath = System.IO.Path.Combine(Environment.CurrentDirectory, "ComPDFKit");
  38. SignaturePath = System.IO.Path.Combine(SignaturePath, "Signature");
  39. System.IO.DirectoryInfo directoryInfo = System.IO.Directory.CreateDirectory(SignaturePath);
  40. IsPageLoaded = true;
  41. DrawinkCanvas.DefaultDrawingAttributes.Width = StrokeWidth;
  42. DrawinkCanvas.DefaultDrawingAttributes.Height = StrokeHigh;
  43. DrawinkCanvas.DefaultDrawingAttributes.Color = solidColorBrush.Color;
  44. InPutTextBox.Foreground = solidColorBrush;
  45. InPutTextBox.FontFamily = new System.Windows.Media.FontFamily("Courier New");
  46. }
  47. private void Cancel_Click(object sender, RoutedEventArgs e)
  48. {
  49. this.Close();
  50. }
  51. private void Save_Click(object sender, RoutedEventArgs e)
  52. {
  53. switch (CreateSignatureControl.SelectedIndex)
  54. {
  55. case 0:
  56. SaveDrawSignature();
  57. break;
  58. case 1:
  59. SaveTextSignature();
  60. break;
  61. case 2:
  62. SaveImageSignature();
  63. break;
  64. default:
  65. break;
  66. }
  67. this.Close();
  68. }
  69. private void Clear_Click(object sender, RoutedEventArgs e)
  70. {
  71. ColorPickerControl.SetIsChecked(1);
  72. TextColorPickerControl.SetIsChecked(1);
  73. DrawinkCanvas.Strokes.Clear();
  74. InPutTextBox.Text = "";
  75. ImageImage.Source = null;
  76. AddImageBackground.Visibility = Visibility.Visible;
  77. SaveBtn.IsEnabled = false;
  78. DrawinkCanvas.DefaultDrawingAttributes.Color = solidColorBrush.Color;
  79. InPutTextBox.Foreground = solidColorBrush;
  80. if (CreateSignatureControl.SelectedIndex == 1)
  81. {
  82. InPutTextBox.Focus();
  83. }
  84. }
  85. private void UpDateToStrokesObject()
  86. {
  87. foreach (var item in DrawinkCanvas.Strokes)
  88. {
  89. item.DrawingAttributes = DrawinkCanvas.DefaultDrawingAttributes.Clone();
  90. }
  91. }
  92. private void SaveToImage(string filePath)
  93. {
  94. string path = SignaturePath;
  95. string name = Guid.NewGuid().ToString();
  96. if (!string.IsNullOrEmpty(path))
  97. {
  98. try
  99. {
  100. BitmapImage image = new BitmapImage(new Uri(filePath));
  101. double scale = Math.Min((double)600 / image.PixelWidth, (double)600 / image.PixelHeight);
  102. scale = Math.Min(scale, 1);
  103. BitmapEncoder encoder = new PngBitmapEncoder();
  104. var targetBitmap = new TransformedBitmap(image, new ScaleTransform(scale, scale));
  105. encoder.Frames.Add(BitmapFrame.Create(targetBitmap));
  106. path = System.IO.Path.Combine(path, name);
  107. using (FileStream stream = new FileStream(path, FileMode.Create))
  108. {
  109. encoder.Save(stream);
  110. }
  111. if (!string.IsNullOrEmpty(SaveToPath))
  112. {
  113. DirectoryInfo CreatedFilePathFolder = new DirectoryInfo(SaveToPath);
  114. if (CreatedFilePathFolder.Exists)
  115. {
  116. Directory.Delete(SaveToPath, true);
  117. }
  118. }
  119. SaveToPath = path;
  120. AddImageBackground.Visibility = Visibility.Collapsed;
  121. ImageImage.Source = targetBitmap;
  122. SaveBtn.IsEnabled = true;
  123. }
  124. catch
  125. {
  126. }
  127. }
  128. else
  129. {
  130. SaveToPath = "";
  131. }
  132. }
  133. private void OpenImage_Click(object sender, RoutedEventArgs e)
  134. {
  135. OpenFileDialog openFile = new OpenFileDialog();
  136. openFile.Filter = "All Image Files(*.bmp;*.gif;*.jpeg;*.jpg;*.png;*.tiff)|*.bmp;*.gif;*.jpeg;*.jpg;*.png;*.tiff|(*.bmp)|*.bmp|" +
  137. "(*.gif)|*.gif|" +
  138. "(*.jpeg)|*.jpeg|" +
  139. "(*.jpg)|*.jpg|" +
  140. "(*.png)|*.png|" +
  141. "(*.tiff)|*.tiff";
  142. if (openFile.ShowDialog() == false)
  143. {
  144. return;
  145. }
  146. SaveToImage(openFile.FileName);
  147. }
  148. private void ColorPickerControl_ColorChanged(object sender, EventArgs e)
  149. {
  150. if (IsPageLoaded)
  151. {
  152. DrawinkCanvas.DefaultDrawingAttributes.Color = ((SolidColorBrush)ColorPickerControl.Brush).Color;
  153. UpDateToStrokesObject();
  154. }
  155. }
  156. private void TextColorPickerControl_ColorChanged(object sender, EventArgs e)
  157. {
  158. if (IsPageLoaded)
  159. {
  160. InPutTextBox.Foreground = TextColorPickerControl.Brush;
  161. }
  162. }
  163. private void SaveTextSignature()
  164. {
  165. if (string.IsNullOrEmpty(InPutTextBox.Text))
  166. {
  167. return;
  168. }
  169. System.Windows.Media.Brush fontcolor = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#252629"));
  170. fontcolor = TextColorPickerControl.Brush;
  171. Bitmap bmp = TextToBitmap(InPutTextBox.Text, TextName.SelectionBoxItem.ToString(), 50, Rectangle.Empty, fontcolor, System.Drawing.Color.Transparent);
  172. string guid = Guid.NewGuid().ToString();
  173. string path = System.IO.Path.Combine(SignaturePath, guid);
  174. bmp.Save(path, ImageFormat.Png);
  175. SaveToPath = path;
  176. cPDFSignatureData = new CPDFSignatureData();
  177. cPDFSignatureData.SourcePath = SaveToPath;
  178. cPDFSignatureData.AnnotationType = CPDFAnnotationType.Signature;
  179. cPDFSignatureData.Type = SignatureType.TextType;
  180. }
  181. private void SaveImageSignature()
  182. {
  183. cPDFSignatureData = new CPDFSignatureData();
  184. cPDFSignatureData.SourcePath = SaveToPath;
  185. cPDFSignatureData.AnnotationType = CPDFAnnotationType.Signature;
  186. cPDFSignatureData.Type = SignatureType.ImageType;
  187. }
  188. private void SaveDrawSignature()
  189. {
  190. var FreeHandpath = SignaturePath;
  191. string name = Guid.NewGuid().ToString();
  192. FreeHandpath = System.IO.Path.Combine(FreeHandpath, name);
  193. using (System.IO.FileStream stream = new System.IO.FileStream(FreeHandpath, System.IO.FileMode.Create))
  194. {
  195. DrawinkCanvas.Strokes.Save(stream);
  196. }
  197. List<List<System.Windows.Point>> RawPointList = new List<List<System.Windows.Point>>();
  198. for (int kk = 0; kk < DrawinkCanvas.Strokes.Count; kk++)
  199. {
  200. List<System.Windows.Point> p = new List<System.Windows.Point>();
  201. RawPointList.Add(p);
  202. for (int gg = 0; gg < DrawinkCanvas.Strokes[kk].StylusPoints.Count; gg++)
  203. {
  204. var point = DrawinkCanvas.Strokes[kk].StylusPoints[gg].ToPoint();
  205. if (point.X >= 0 && point.Y >= 0)
  206. RawPointList[kk].Add(point);
  207. }
  208. }
  209. DrawingSaveToPath = FreeHandpath;
  210. double inkThickness;
  211. inkThickness = StrokeWidth;
  212. WriteableBitmap writeStamp = RawPointListToBitmap(RawPointList, inkThickness, DrawinkCanvas.DefaultDrawingAttributes.Color);
  213. if (writeStamp == null)
  214. {
  215. return;
  216. }
  217. FreeHandpath = SignaturePath;
  218. string thumbnailName = Guid.NewGuid().ToString();
  219. FreeHandpath = System.IO.Path.Combine(FreeHandpath, thumbnailName);
  220. using (FileStream stream5 = new FileStream(FreeHandpath, FileMode.Create))
  221. {
  222. PngBitmapEncoder encoder5 = new PngBitmapEncoder();
  223. encoder5.Frames.Add(BitmapFrame.Create(writeStamp));
  224. encoder5.Save(stream5);
  225. }
  226. SaveToPath = FreeHandpath;
  227. cPDFSignatureData = new CPDFSignatureData();
  228. cPDFSignatureData.AnnotationType = CPDFAnnotationType.Signature;
  229. cPDFSignatureData.SourcePath = SaveToPath;
  230. cPDFSignatureData.DrawingPath = DrawingSaveToPath;
  231. cPDFSignatureData.Type = SignatureType.Drawing;
  232. cPDFSignatureData.inkThickness = inkThickness;
  233. cPDFSignatureData.inkColor = DrawinkCanvas.DefaultDrawingAttributes.Color;
  234. }
  235. private WriteableBitmap RawPointListToBitmap(List<List<System.Windows.Point>> RawPointList, double InkThickness, System.Windows.Media.Color InkColor)
  236. {
  237. if (RawPointList != null && RawPointList.Count > 0)
  238. {
  239. GeometryGroup PaintGeomtry = new GeometryGroup();
  240. int minLeft = -1;
  241. int minTop = -1;
  242. int maxLeft = -1;
  243. int maxTop = -1;
  244. foreach (List<System.Windows.Point> Item in RawPointList)
  245. {
  246. for (int i = 0; i < Item.Count; i++)
  247. {
  248. System.Windows.Point paintPoint = Item[i];
  249. if (minLeft == -1)
  250. {
  251. minLeft = (int)paintPoint.X;
  252. maxLeft = (int)paintPoint.X;
  253. minTop = (int)paintPoint.Y;
  254. maxTop = (int)paintPoint.Y;
  255. }
  256. else
  257. {
  258. minLeft = (int)Math.Min(minLeft, paintPoint.X);
  259. maxLeft = (int)Math.Max(maxLeft, paintPoint.X);
  260. minTop = (int)Math.Min(minTop, paintPoint.Y);
  261. maxTop = (int)Math.Max(maxTop, paintPoint.Y);
  262. }
  263. }
  264. }
  265. if (minLeft >= 0 && maxLeft > minLeft && minTop >= 0 && maxTop > minTop)
  266. {
  267. List<List<System.Windows.Point>> points = new List<List<System.Windows.Point>>();
  268. foreach (List<System.Windows.Point> Item in RawPointList)
  269. {
  270. PathGeometry PaintPath = new PathGeometry();
  271. PathFigureCollection Figures = new PathFigureCollection();
  272. PathFigure AddFigure = new PathFigure();
  273. Figures.Add(AddFigure);
  274. PaintPath.Figures = Figures;
  275. PaintGeomtry.Children.Add(PaintPath);
  276. List<System.Windows.Point> changeList = new List<System.Windows.Point>();
  277. for (int i = 0; i < Item.Count; i++)
  278. {
  279. System.Windows.Point paintPoint = DpiHelper.CurrentPointToStandardPoint(new System.Windows.Point(Item[i].X - minLeft, Item[i].Y - minTop));
  280. changeList.Add(paintPoint);
  281. if (i == 0)
  282. {
  283. AddFigure.StartPoint = paintPoint;
  284. }
  285. else
  286. {
  287. LineSegment AddSegment = new LineSegment();
  288. AddSegment.Point = paintPoint;
  289. AddFigure.Segments.Add(AddSegment);
  290. }
  291. }
  292. if (changeList.Count > 0)
  293. {
  294. points.Add(changeList);
  295. }
  296. }
  297. int drawWidth = (int)DpiHelper.CurrentNumToStandardNum(maxLeft - minLeft);
  298. int drawHeight = (int)DpiHelper.CurrentNumToStandardNum(maxTop - minTop);
  299. RawPointList = points;
  300. DrawingVisual copyVisual = new DrawingVisual();
  301. DrawingContext copyContext = copyVisual.RenderOpen();
  302. System.Windows.Media.Pen drawPen = new System.Windows.Media.Pen(new SolidColorBrush(InkColor), InkThickness);
  303. copyContext?.DrawGeometry(null, drawPen, PaintGeomtry);
  304. copyContext.Close();
  305. RenderTargetBitmap targetBitmap = new RenderTargetBitmap(drawWidth, drawHeight, 96, 96, PixelFormats.Pbgra32);
  306. targetBitmap.Render(copyVisual);
  307. byte[] ImageArray = new byte[targetBitmap.PixelWidth * targetBitmap.PixelHeight * 4];
  308. targetBitmap.CopyPixels(new Int32Rect(0, 0, (int)targetBitmap.PixelWidth, (int)targetBitmap.PixelHeight), ImageArray, targetBitmap.PixelWidth * 4, 0);
  309. WriteableBitmap writeBitmap = new WriteableBitmap(targetBitmap.PixelWidth, targetBitmap.PixelHeight, 96, 96, PixelFormats.Bgra32, null);
  310. writeBitmap.WritePixels(new Int32Rect(0, 0, targetBitmap.PixelWidth, targetBitmap.PixelHeight), ImageArray, targetBitmap.PixelWidth * 4, 0);
  311. return writeBitmap;
  312. }
  313. }
  314. return null;
  315. }
  316. private Bitmap TextToBitmap(string text, string FontFamily, double size, System.Drawing.Rectangle rect, System.Windows.Media.Brush fontcolor, System.Drawing.Color backColor)
  317. {
  318. FormattedText formatText = new FormattedText(
  319. text,
  320. CultureInfo.CurrentCulture,
  321. FlowDirection.LeftToRight,
  322. new Typeface(new System.Windows.Media.FontFamily(FontFamily), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
  323. size,
  324. fontcolor
  325. );
  326. DrawingVisual drawingVisual = new DrawingVisual();
  327. DrawingContext dc = drawingVisual.RenderOpen();
  328. dc.DrawText(formatText, new System.Windows.Point(2, 10));
  329. dc.Close();
  330. Rect x = drawingVisual.ContentBounds;
  331. Rect DrawRect = new Rect(0, 0, x.Width + (x.X / 2), x.Height + x.Y);
  332. RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)((int)DrawRect.Width + (x.X / 2)), (int)((int)DrawRect.Height + x.Y), 96F, 96F, PixelFormats.Pbgra32);
  333. renderTargetBitmap.Render(drawingVisual);
  334. MemoryStream stream = new MemoryStream();
  335. BitmapEncoder encoder = new PngBitmapEncoder();
  336. encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
  337. encoder.Save(stream);
  338. Bitmap bitmap = new Bitmap(stream);
  339. return bitmap;
  340. }
  341. private void Grid_Drop(object sender, DragEventArgs e)
  342. {
  343. string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
  344. foreach (string f in file)
  345. {
  346. string FileType = System.IO.Path.GetExtension(f).Trim().ToLower();
  347. string type = "*.bmp;*.gif;*.jpeg;*.jpg;*.png;*.tiff)|*.bmp;*.gif;*.jpeg;*.jpg;*.png;*.tiff";
  348. if (!string.IsNullOrEmpty(FileType))
  349. {
  350. string imagetype = "*" + FileType;
  351. string[] x = type.ToLower().Split(';');
  352. List<string> list = x.ToList();
  353. int imageindex = list.IndexOf(imagetype);
  354. if (imageindex > 0)
  355. {
  356. SaveToImage(f);
  357. }
  358. }
  359. }
  360. }
  361. private void CreateSignatureControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
  362. {
  363. TabControl tabControl = sender as TabControl;
  364. if (IsPageLoaded && tabControl != null)
  365. {
  366. switch (tabControl.SelectedIndex)
  367. {
  368. case 0:
  369. if (DrawinkCanvas.Strokes.Count <= 0)
  370. {
  371. SaveBtn.IsEnabled = false;
  372. }
  373. else
  374. {
  375. SaveBtn.IsEnabled = true;
  376. }
  377. break;
  378. case 1:
  379. if (string.IsNullOrEmpty(InPutTextBox.Text))
  380. {
  381. SaveBtn.IsEnabled = false;
  382. }
  383. else
  384. {
  385. SaveBtn.IsEnabled = true;
  386. }
  387. break;
  388. case 2:
  389. if (ImageImage.Source == null)
  390. {
  391. SaveBtn.IsEnabled = false;
  392. }
  393. else
  394. {
  395. SaveBtn.IsEnabled = true;
  396. }
  397. break;
  398. default:
  399. break;
  400. }
  401. }
  402. }
  403. private void InPutTextBox_TextChanged(object sender, TextChangedEventArgs e)
  404. {
  405. if (IsPageLoaded)
  406. {
  407. if (string.IsNullOrEmpty((sender as TextBox).Text))
  408. {
  409. SaveBtn.IsEnabled = false;
  410. }
  411. else
  412. {
  413. SaveBtn.IsEnabled = true;
  414. }
  415. }
  416. }
  417. private void ImageImage_SourceUpdated(object sender, DataTransferEventArgs e)
  418. {
  419. if (IsPageLoaded)
  420. {
  421. if (ImageImage.Source == null)
  422. {
  423. SaveBtn.IsEnabled = false;
  424. }
  425. else
  426. {
  427. SaveBtn.IsEnabled = true;
  428. }
  429. }
  430. }
  431. private void DrawinkCanvas_Unloaded(object sender, RoutedEventArgs e)
  432. {
  433. DrawinkCanvas.Strokes.StrokesChanged -= Strokes_StrokesChanged;
  434. }
  435. private void DrawinkCanvas_Loaded(object sender, RoutedEventArgs e)
  436. {
  437. DrawinkCanvas.Strokes.StrokesChanged -= Strokes_StrokesChanged;
  438. DrawinkCanvas.Strokes.StrokesChanged += Strokes_StrokesChanged;
  439. }
  440. private void Strokes_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e)
  441. {
  442. if (IsPageLoaded)
  443. {
  444. if (DrawinkCanvas.Strokes.Count <= 0)
  445. {
  446. SaveBtn.IsEnabled = false;
  447. }
  448. else
  449. {
  450. SaveBtn.IsEnabled = true;
  451. }
  452. }
  453. }
  454. private void StrokeWidth_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  455. {
  456. if (IsPageLoaded)
  457. {
  458. DrawinkCanvas.DefaultDrawingAttributes.Height = DrawinkCanvas.DefaultDrawingAttributes.Width = StrokeHigh = StrokeWidth = e.NewValue;
  459. UpDateToStrokesObject();
  460. }
  461. }
  462. private void ColorPickerControl_Loaded(object sender, RoutedEventArgs e)
  463. {
  464. ColorPickerControl.SetIsChecked(1);
  465. }
  466. private void TextColorPickerControl_Loaded(object sender, RoutedEventArgs e)
  467. {
  468. TextColorPickerControl.SetIsChecked(1);
  469. }
  470. private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
  471. {
  472. if (!string.IsNullOrEmpty((sender as TextBox).Text))
  473. {
  474. int num;
  475. int.TryParse((sender as TextBox).Text, out num);
  476. if (num > StrokeWidthSlider.Maximum)
  477. {
  478. (sender as TextBox).Text = StrokeWidthSlider.Maximum.ToString();
  479. }
  480. if (num < StrokeWidthSlider.Minimum)
  481. {
  482. (sender as TextBox).Text = StrokeWidthSlider.Minimum.ToString();
  483. }
  484. }
  485. }
  486. private void TextName_SelectionChanged(object sender, SelectionChangedEventArgs e)
  487. {
  488. if (TextName.SelectedIndex != -1 && IsPageLoaded)
  489. {
  490. switch (TextName.SelectedIndex)
  491. {
  492. case 0:
  493. InPutTextBox.FontFamily = new System.Windows.Media.FontFamily("Arial");
  494. break;
  495. case 1:
  496. InPutTextBox.FontFamily = new System.Windows.Media.FontFamily("Courier New");
  497. break;
  498. case 2:
  499. InPutTextBox.FontFamily = new System.Windows.Media.FontFamily("Times New Roman");
  500. break;
  501. default:
  502. InPutTextBox.FontFamily = new System.Windows.Media.FontFamily("Arial");
  503. break;
  504. }
  505. }
  506. }
  507. private FontWeight GetFontWeight(string toString)
  508. {
  509. switch (toString)
  510. {
  511. case "Regular":
  512. return FontWeights.Normal;
  513. case "Oblique":
  514. return FontWeights.Normal;
  515. case "Bold":
  516. return FontWeights.Bold;
  517. case "BoldOblique":
  518. return FontWeights.Bold;
  519. default:
  520. return FontWeights.Normal;
  521. }
  522. }
  523. private System.Windows.FontStyle GetFontStyle(string style)
  524. {
  525. switch (style)
  526. {
  527. case "Regular":
  528. return FontStyles.Normal;
  529. case "Oblique":
  530. return FontStyles.Italic;
  531. case "Bold":
  532. return FontStyles.Normal;
  533. case "BoldOblique":
  534. return FontStyles.Oblique;
  535. default:
  536. return FontStyles.Normal;
  537. }
  538. }
  539. }
  540. }