using ComPDFKit.PDFAnnotation; using ComPDFKit.PDFDocument; using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Compdfkit_Tools.Helper { public static class CommonHelper { /// /// 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) { FileInfo fileInfo = null; try { fileInfo = new FileInfo(filePath); } catch { return "0B"; } if (fileInfo != null && fileInfo.Exists) { double fileSize = fileInfo.Length; if (fileSize > 1024) { fileSize = Math.Round(fileSize / 1024, 2); if (fileSize > 1024) { fileSize = Math.Round(fileSize / 1024, 2); if (fileSize > 1024) { fileSize = Math.Round(fileSize / 1024, 2); return fileSize + " GB"; } else { return fileSize + " MB"; } } else { return fileSize + " KB"; } } else { return fileSize + " B"; } } return "0B"; } public static string GetFilePathOrEmpty() { string selectedFilePath = string.Empty; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "PDF files (*.pdf)|*.pdf"; if (openFileDialog.ShowDialog() == true) { selectedFilePath = openFileDialog.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; } } } }