using ComPDFKit.PDFAnnotation; using ComPDFKit.PDFDocument; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Xml; using ComPDFKit.DigitalSign; using Point = System.Windows.Point; using Size = System.Windows.Size; namespace Compdfkit_Tools.Helper { public class SDKLicenseHelper { public string key = string.Empty; public string secret = string.Empty; public SDKLicenseHelper() { string sdkLicensePath = "license_key_windows.xml"; XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(sdkLicensePath); XmlNode keyNode = xmlDocument.SelectSingleNode("/license/key"); XmlNode secretNode = xmlDocument.SelectSingleNode("/license/secret"); if (keyNode != null && secretNode != null) { key = keyNode.InnerText; secret = secretNode.InnerText; } else { Console.WriteLine("Key or secret element not found in the XML."); } } } public static class CommonHelper { public static int GetBitmapPointer(Bitmap bitmap) { IntPtr hBitmap = bitmap.GetHbitmap(); int bitmapPointer = hBitmap.ToInt32(); return bitmapPointer; } public static string EmailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; public static bool IsValidEmail(string email) { string emailPattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"; return Regex.IsMatch(email, emailPattern); } public static string GetExactDateFromString(string dateString) { DateTime dateTime = GetDateTimeFromString(dateString); return dateTime.ToString("yyyy/MM/dd HH:mm:ss"); } public static DateTime GetDateTimeFromString(string dateString) { int start = 0; for (int i = 0; i < dateString.Length; i++) { if (char.IsNumber(dateString[i])) { start = i; break; } } string date = dateString.Substring(start, 14); string year = date.Substring(0, 4); string month = date.Substring(4, 2); string day = date.Substring(6, 2); string hour = date.Substring(8, 2); string minute = date.Substring(10, 2); string second = date.Substring(12, 2); return new DateTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), int.Parse(second)); } /// /// Returns the file size based on the specified file path, with the smallest unit being bytes (B). /// /// The path to the file. /// /// The calculated file size, with units in bytes (B), kilobytes (KB), megabytes (MB), or gigabytes (GB). /// public static string GetFileSize(string filePath) { try { long fileSize = new FileInfo(filePath).Length; string[] sizes = { "B", "KB", "MB", "GB" }; int order = 0; while (fileSize >= 1024 && order < sizes.Length - 1) { fileSize /= 1024; order++; } return $"{fileSize} {sizes[order]}"; } catch { return "0B"; } } public static string GetExistedPathOrEmpty(string filter = "PDF files (*.pdf)|*.pdf") { string selectedFilePath = string.Empty; OpenFileDialog openFileDialog; try { openFileDialog = new OpenFileDialog { Filter = filter }; } catch { return string.Empty; }; if (openFileDialog.ShowDialog() == true) { selectedFilePath = openFileDialog.FileName; } return selectedFilePath; } public static string GetGeneratePathOrEmpty(string filter, string defaultFileName = "") { string selectedFilePath = string.Empty; SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = filter, FileName = defaultFileName }; if (saveFileDialog.ShowDialog() == true) { selectedFilePath = saveFileDialog.FileName; } return selectedFilePath; } public static bool GetPagesInRange(ref List pageList, string pageRange, int count, char[] enumerationSeparator, char[] rangeSeparator, bool inittag = false) { string[] rangeSplit = pageRange.Split(enumerationSeparator); pageList.Clear(); foreach (string range in rangeSplit) { int starttag = 1; if (inittag) { starttag = 0; } if (range.Contains("-")) { try { string[] limits = range.Split(rangeSeparator); if (limits.Length >= 2 && !string.IsNullOrWhiteSpace(limits[0]) && !string.IsNullOrWhiteSpace(limits[1])) { int start = int.Parse(limits[0]); int end = int.Parse(limits[1]); if ((start < starttag) || (end > count) || (start > end)) { return false; } for (int i = start; i <= end; ++i) { if (pageList.Contains(i)) { return false; } pageList.Add(i - 1); } continue; } } catch (Exception ex) { return false; } } int pageNr; try { pageNr = int.Parse(range); } catch (Exception) { return false; } if (pageNr < starttag || pageNr > count) { return false; } if (pageList.Contains(pageNr)) { return false; } pageList.Add(pageNr - 1); } return true; } internal static class PageEditHelper { public static T FindVisualParent(DependencyObject obj) where T : class { while (obj != null) { if (obj is T) return obj as T; obj = VisualTreeHelper.GetParent(obj); } return null; } public static childItem FindVisualChild(DependencyObject obj) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is childItem) return (childItem)child; else { childItem childOfChild = FindVisualChild(child); if (childOfChild != null) return childOfChild; } } return null; } } public static class ViewportHelper { public static CPDFDocument CopyDoc; public static bool IsInViewport(ScrollViewer sv, Control item) { if (item == null) return false; ItemsControl itemsControl = null; if (item is ListBoxItem) itemsControl = ItemsControl.ItemsControlFromItemContainer(item) as ListBox; else throw new NotSupportedException(item.GetType().Name); ScrollContentPresenter scrollContentPresenter = (ScrollContentPresenter)sv.Template.FindName("PART_ScrollContentPresenter", sv); MethodInfo isInViewportMethod = sv.GetType().GetMethod("IsInViewport", BindingFlags.NonPublic | BindingFlags.Instance); return (bool)isInViewportMethod.Invoke(sv, new object[] { scrollContentPresenter, item }); } public static T FindVisualParent(DependencyObject obj) where T : class { while (obj != null) { if (obj is T) return obj as T; obj = VisualTreeHelper.GetParent(obj); } return null; } public static childItem FindVisualChild(DependencyObject obj) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is childItem) return (childItem)child; else { childItem childOfChild = FindVisualChild(child); if (childOfChild != null) return childOfChild; } } return null; } } public class ArrowHelper { public bool HasStartArrow { get { if (StartSharp != C_LINE_TYPE.LINETYPE_UNKNOWN && StartSharp != C_LINE_TYPE.LINETYPE_NONE) { return true; } return false; } } public bool IsStartClosed { get { if (StartSharp == C_LINE_TYPE.LINETYPE_CLOSEDARROW || StartSharp == C_LINE_TYPE.LINETYPE_RCLOSEDARROW || StartSharp == C_LINE_TYPE.LINETYPE_DIAMOND) { return true; } return false; } } public bool HasEndArrow { get { if (EndSharp != C_LINE_TYPE.LINETYPE_UNKNOWN && EndSharp != C_LINE_TYPE.LINETYPE_NONE) { return true; } return false; } } public bool IsEndClosed { get { if (EndSharp == C_LINE_TYPE.LINETYPE_CLOSEDARROW || EndSharp == C_LINE_TYPE.LINETYPE_RCLOSEDARROW || EndSharp == C_LINE_TYPE.LINETYPE_DIAMOND) { return true; } return false; } } public uint ArrowAngle { get; set; } public uint ArrowLength { get; set; } public Point? LineStart { get; set; } public Point? LineEnd { get; set; } public PathGeometry Body { get; set; } public C_LINE_TYPE StartSharp { get; set; } public C_LINE_TYPE EndSharp { get; set; } public ArrowHelper() { Body = new PathGeometry(); ArrowLength = 12; ArrowAngle = 60; } protected PathFigure CreateLineBody() { if (LineStart != null && LineEnd != null) { PathFigure lineFigure = new PathFigure(); lineFigure.StartPoint = (Point)LineStart; LineSegment linePath = new LineSegment(); linePath.Point = (Point)LineEnd; lineFigure.Segments.Add(linePath); return lineFigure; } return null; } protected PathFigure CreateStartArrow() { switch (StartSharp) { case C_LINE_TYPE.LINETYPE_NONE: case C_LINE_TYPE.LINETYPE_UNKNOWN: break; case C_LINE_TYPE.LINETYPE_ARROW: case C_LINE_TYPE.LINETYPE_CLOSEDARROW: return CreateStartOpenArrow(); case C_LINE_TYPE.LINETYPE_ROPENARROW: case C_LINE_TYPE.LINETYPE_RCLOSEDARROW: return CreateStartReverseArrow(); case C_LINE_TYPE.LINETYPE_BUTT: return CreateStartButtArrow(); case C_LINE_TYPE.LINETYPE_DIAMOND: return CreateStartDiamondArrow(); case C_LINE_TYPE.LINETYPE_CIRCLE: return CreateStartRoundArrow(); case C_LINE_TYPE.LINETYPE_SQUARE: return CreateStartSquareArrow(); case C_LINE_TYPE.LINETYPE_SLASH: return CreateStartSlashArrow(); default: break; } return null; } protected virtual PathFigure CreateEndArrow() { switch (EndSharp) { case C_LINE_TYPE.LINETYPE_NONE: case C_LINE_TYPE.LINETYPE_UNKNOWN: break; case C_LINE_TYPE.LINETYPE_ARROW: case C_LINE_TYPE.LINETYPE_CLOSEDARROW: return CreateEndOpenArrow(); case C_LINE_TYPE.LINETYPE_ROPENARROW: case C_LINE_TYPE.LINETYPE_RCLOSEDARROW: return CreateEndReverseArrow(); case C_LINE_TYPE.LINETYPE_BUTT: return CreateEndButtArrow(); case C_LINE_TYPE.LINETYPE_DIAMOND: return CreateEndDiamondArrow(); case C_LINE_TYPE.LINETYPE_CIRCLE: return CreateEndRoundArrow(); case C_LINE_TYPE.LINETYPE_SQUARE: return CreateEndSquareArrow(); case C_LINE_TYPE.LINETYPE_SLASH: return CreateEndSlashArrow(); default: break; } return null; } public PathGeometry BuildArrowBody() { Body.Figures.Clear(); PathFigure lineBody = CreateLineBody(); if (lineBody != null) { Body.Figures.Add(lineBody); PathFigure arrowFigure = CreateStartArrow(); if (arrowFigure != null) { Body.Figures.Add(arrowFigure); } arrowFigure = CreateEndArrow(); if (arrowFigure != null) { Body.Figures.Add(arrowFigure); } } return Body; } private PathFigure CreateStartOpenArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null || ArrowAngle == 0) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(ArrowAngle / 2); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); arrowSegment.Points.Add((Point)LineStart); rotateMatrix.Rotate(-ArrowAngle); arrowSegment.Points.Add((Point)LineStart + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsStartClosed; arrowFigure.IsFilled = IsStartClosed; return arrowFigure; } private PathFigure CreateEndOpenArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null || ArrowAngle == 0) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(ArrowAngle / 2); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); arrowSegment.Points.Add((Point)LineEnd); rotateMatrix.Rotate(-ArrowAngle); arrowSegment.Points.Add((Point)LineEnd + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsEndClosed; arrowFigure.IsFilled = IsEndClosed; return arrowFigure; } private PathFigure CreateStartReverseArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null || ArrowAngle == 0) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(ArrowAngle / 2); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); arrowSegment.Points.Add((Point)LineStart); rotateMatrix.Rotate(-ArrowAngle); arrowSegment.Points.Add((Point)LineStart + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsStartClosed; arrowFigure.IsFilled = IsStartClosed; return arrowFigure; } private PathFigure CreateEndReverseArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null || ArrowAngle == 0) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(ArrowAngle / 2); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); arrowSegment.Points.Add((Point)LineEnd); rotateMatrix.Rotate(-ArrowAngle); arrowSegment.Points.Add((Point)LineEnd + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsEndClosed; arrowFigure.IsFilled = IsEndClosed; return arrowFigure; } private PathFigure CreateStartButtArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); LineSegment buttSegment = new LineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); buttSegment.Point = ((Point)LineStart + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(buttSegment); return arrowFigure; } private PathFigure CreateEndButtArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); LineSegment buttSegment = new LineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); buttSegment.Point = ((Point)LineEnd + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(buttSegment); return arrowFigure; } private PathFigure CreateStartDiamondArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(45); Point cornerTop = (Point)LineStart + (lineVector * rotateMatrix); Vector turnVector = cornerTop - (Point)LineStart; turnVector.Normalize(); turnVector *= ArrowLength; Matrix turnMatrix = new Matrix(); turnMatrix.Rotate(-90); Point awayPoint = cornerTop + (turnVector * turnMatrix); rotateMatrix = new Matrix(); rotateMatrix.Rotate(-45); Point cornerDown = (Point)LineStart + (lineVector * rotateMatrix); arrowFigure.StartPoint = (Point)LineStart; arrowSegment.Points.Add(cornerTop); arrowSegment.Points.Add(awayPoint); arrowSegment.Points.Add(cornerDown); arrowSegment.Points.Add((Point)LineStart); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsStartClosed; arrowFigure.IsFilled = IsStartClosed; return arrowFigure; } private PathFigure CreateEndDiamondArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment arrowSegment = new PolyLineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(45); Point cornerTop = (Point)LineEnd + (lineVector * rotateMatrix); Vector turnVector = cornerTop - (Point)LineEnd; turnVector.Normalize(); turnVector *= ArrowLength; Matrix turnMatrix = new Matrix(); turnMatrix.Rotate(-90); Point awayPoint = cornerTop + (turnVector * turnMatrix); rotateMatrix = new Matrix(); rotateMatrix.Rotate(-45); Point cornerDown = (Point)LineEnd + (lineVector * rotateMatrix); arrowFigure.StartPoint = (Point)LineEnd; arrowSegment.Points.Add(cornerTop); arrowSegment.Points.Add(awayPoint); arrowSegment.Points.Add(cornerDown); arrowSegment.Points.Add((Point)LineEnd); arrowFigure.Segments.Add(arrowSegment); arrowFigure.IsClosed = IsEndClosed; arrowFigure.IsFilled = IsEndClosed; return arrowFigure; } private PathFigure CreateStartRoundArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(180); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); ArcSegment circleSegment = new ArcSegment(); circleSegment.Point = (Point)LineStart; circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2); arrowFigure.Segments.Add(circleSegment); circleSegment = new ArcSegment(); circleSegment.Point = (Point)arrowFigure.StartPoint; circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2); arrowFigure.Segments.Add(circleSegment); return arrowFigure; } private PathFigure CreateEndRoundArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(180); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); ArcSegment circleSegment = new ArcSegment(); circleSegment.Point = (Point)LineEnd; circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2); arrowFigure.Segments.Add(circleSegment); circleSegment = new ArcSegment(); circleSegment.Point = (Point)arrowFigure.StartPoint; circleSegment.Size = new Size(ArrowLength / 2, ArrowLength / 2); arrowFigure.Segments.Add(circleSegment); return arrowFigure; } private PathFigure CreateStartSquareArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment squreSegment = new PolyLineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= (ArrowLength / 2); Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); Point pointCorner = (Point)LineStart + (lineVector * rotateMatrix); squreSegment.Points.Add(pointCorner); Vector moveVector = arrowFigure.StartPoint - pointCorner; moveVector.Normalize(); moveVector *= (ArrowLength); rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); squreSegment.Points.Add(pointCorner + (moveVector * rotateMatrix)); squreSegment.Points.Add(arrowFigure.StartPoint + (moveVector * rotateMatrix)); squreSegment.Points.Add(arrowFigure.StartPoint); squreSegment.Points.Add((Point)LineStart); arrowFigure.Segments.Add(squreSegment); return arrowFigure; } private PathFigure CreateEndSquareArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); PolyLineSegment squreSegment = new PolyLineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= (ArrowLength / 2); Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); Point pointCorner = (Point)LineEnd + (lineVector * rotateMatrix); squreSegment.Points.Add(pointCorner); Vector moveVector = arrowFigure.StartPoint - pointCorner; moveVector.Normalize(); moveVector *= (ArrowLength); rotateMatrix = new Matrix(); rotateMatrix.Rotate(90); squreSegment.Points.Add(pointCorner + (moveVector * rotateMatrix)); squreSegment.Points.Add(arrowFigure.StartPoint + (moveVector * rotateMatrix)); squreSegment.Points.Add(arrowFigure.StartPoint); squreSegment.Points.Add((Point)LineEnd); arrowFigure.Segments.Add(squreSegment); return arrowFigure; } private PathFigure CreateStartSlashArrow() { if (ArrowLength == 0 || !HasStartArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); LineSegment buttSegment = new LineSegment(); Vector lineVector = (Point)LineStart - (Point)LineEnd; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(45); arrowFigure.StartPoint = (Point)LineStart + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); buttSegment.Point = ((Point)LineStart + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(buttSegment); return arrowFigure; } private PathFigure CreateEndSlashArrow() { if (ArrowLength == 0 || !HasEndArrow || LineStart == null || LineEnd == null) { return null; } PathFigure arrowFigure = new PathFigure(); LineSegment buttSegment = new LineSegment(); Vector lineVector = (Point)LineEnd - (Point)LineStart; lineVector.Normalize(); lineVector *= ArrowLength; Matrix rotateMatrix = new Matrix(); rotateMatrix.Rotate(45); arrowFigure.StartPoint = (Point)LineEnd + (lineVector * rotateMatrix); rotateMatrix.Rotate(-180); buttSegment.Point = ((Point)LineEnd + (lineVector * rotateMatrix)); arrowFigure.Segments.Add(buttSegment); return arrowFigure; } } } public class PanelState { private static PanelState instance; public enum RightPanelState { None, PropertyPanel, ViewSettings } private bool _isLeftPanelExpand; public bool IsLeftPanelExpand { get { return _isLeftPanelExpand; } set { if (_isLeftPanelExpand != value) { _isLeftPanelExpand = value; OnPropertyChanged(); } } } private RightPanelState _rightPanel; public RightPanelState RightPanel { get { return _rightPanel; } set { if (_rightPanel != value) { _rightPanel = value; OnPropertyChanged(); } } } private PanelState() { } public static PanelState GetInstance() { if (instance == null) { instance = new PanelState(); } return instance; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class SaveHelper { private static SaveHelper instance; private bool _canSave; public bool CanSave { get { return _canSave; } set { if (_canSave != value) { _canSave = value; OnPropertyChanged(); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class CommandHelper { public static void CopyImage_Click(Dictionary> imageDict) { try { if (imageDict != null && imageDict.Count > 0) { foreach (int pageIndex in imageDict.Keys) { List imageList = imageDict[pageIndex]; foreach (Bitmap image in imageList) { MemoryStream ms = new MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); BitmapImage imageData = new BitmapImage(); imageData.BeginInit(); imageData.StreamSource = ms; imageData.CacheOption = BitmapCacheOption.OnLoad; imageData.EndInit(); imageData.Freeze(); Clipboard.SetImage(imageData); break; } } } } catch (Exception ex) { } } public static void ExtraImage_Click(Dictionary> imageDict) { System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog(); if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string choosePath = folderDialog.SelectedPath; string openPath = choosePath; try { if (imageDict != null && imageDict.Count > 0) { foreach (int pageIndex in imageDict.Keys) { List imageList = imageDict[pageIndex]; foreach (Bitmap image in imageList) { string savePath = Path.Combine(choosePath, Guid.NewGuid() + ".jpg"); image.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg); openPath = savePath; } } } Process.Start("explorer", "/select,\"" + openPath + "\""); } catch (Exception ex) { } } } public static double CheckZoomLevel(double[] zoomLevelList, double zoom, bool IsGrowth) { double standardZoom = 100; if (zoom <= 0.01) { return 0.01; } if (zoom >= 10) { return 10; } zoom *= 100; for (int i = 0; i < zoomLevelList.Length - 1; i++) { if (zoom > zoomLevelList[i] && zoom <= zoomLevelList[i + 1] && IsGrowth) { standardZoom = zoomLevelList[i + 1]; break; } if (zoom >= zoomLevelList[i] && zoom < zoomLevelList[i + 1] && !IsGrowth) { standardZoom = zoomLevelList[i]; break; } } return standardZoom / 100; } } public class SignatureHelper { public static List GetEffectiveSignatureList(ListsignatureList) { for(int index = signatureList.Count - 1; index >= 0; index--) { if (signatureList[index].SignerList.Count <= 0) { signatureList.RemoveAt(index); } } return signatureList; } } }