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 ComPDFKit.PDFAnnotation.Form;
using Point = System.Windows.Point;
using Size = System.Windows.Size;
using System.Collections.ObjectModel;
using Brush = System.Windows.Media.Brush;
using Color = System.Windows.Media.Color;
using System.Drawing.Drawing2D;
using Matrix = System.Windows.Media.Matrix;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using ComPDFKit.NativeMethod;
namespace ComPDFKit.Controls.Helper
{
public class SDKLicenseHelper
{
public static string ParseLicenseXML()
{
try
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("license_key_windows.xml");
XmlNode xmlNode = xmlDocument.SelectSingleNode("/license/key");
if (xmlNode == null)
{
return string.Empty;
}
else
{
return xmlNode.InnerText;
}
}
catch
{
return string.Empty;
}
}
}
public static class CommonHelper
{
[DllImport("shell32.dll", ExactSpelling = true)]
private static extern void ILFree(IntPtr pidlList);
[DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern IntPtr ILCreateFromPathW(string pszPath);
[DllImport("shell32.dll", ExactSpelling = true)]
private static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);
public static bool IsImageCorrupted(string imagePath)
{
try
{
using (Bitmap bitmap = new Bitmap(imagePath))
{
int width = bitmap.Width;
int height = bitmap.Height;
}
return false;
}
catch (Exception)
{
MessageBox.Show(LanguageHelper.CommonManager.GetString("Text_ImageCorrupted"), LanguageHelper.CommonManager.GetString("Button_OK"), MessageBoxButton.OK);
return true;
}
}
public static Bitmap ConvertTo32bppArgb(Bitmap source)
{
// Create a new Bitmap with 32bppArgb pixel format
Bitmap newBitmap = new Bitmap(source.Width, source.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Create a Graphics object to draw the source image on the new Bitmap
using (Graphics g = Graphics.FromImage(newBitmap))
{
// Set the interpolation mode and pixel offset mode for high-quality rendering
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
// Draw the source image on the new Bitmap
g.DrawImage(source, new System.Drawing.Rectangle(0, 0, source.Width, source.Height));
}
return newBitmap;
}
public static byte[] ConvertBrushToByteArray(Brush brush)
{
if (brush is SolidColorBrush solidColorBrush)
{
Color color = solidColorBrush.Color;
byte[] colorBytes = new byte[3];
colorBytes[0] = color.R;
colorBytes[1] = color.G;
colorBytes[2] = color.B;
return colorBytes;
}
else
{
throw new ArgumentException("The provided brush is not a SolidColorBrush.");
}
}
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 string GetPageParmFromList(List pagesList)
{
string pageParam = "";
if (pagesList.Count != 0)
{
pagesList.Sort();
for (int i = 0; i < pagesList.Count; i++)
{
if (i == 0)
{
pageParam += pagesList[0].ToString();
}
else
{
if (pagesList[i] == pagesList[i - 1] + 1)
{
if (i >= 2)
{
if (pagesList[i - 1] != pagesList[i - 2] + 1)
pageParam += "-";
}
else
pageParam += "-";
if (i == pagesList.Count - 1)
{
pageParam += pagesList[i].ToString();
}
}
else
{
if (i >= 2)
{
if (pagesList[i - 1] == pagesList[i - 2] + 1)
pageParam += pagesList[i - 1].ToString();
}
pageParam += "," + pagesList[i].ToString();
}
}
}
}
return pageParam;
}
public static List GetDefaultPageList(CPDFDocument document)
{
List pageRangeList = new List();
for (int i = 0; i < document.PageCount; i++)
{
pageRangeList.Add(i + 1);
}
return pageRangeList;
}
public static bool GetPagesInRange(ref List pageList, string pageRange, int count, char[] enumerationSeparator, char[] rangeSeparator, bool inittag = false)
{
if (pageRange == null || pageList == null)
{
return false;
}
pageList.Clear();
int starttag = inittag ? 0 : 1;
string[] rangeSplit = pageRange.Split(enumerationSeparator);
foreach (string range in rangeSplit)
{
if (range.Contains("-"))
{
string[] limits = range.Split(rangeSeparator);
if (limits.Length == 2 && int.TryParse(limits[0], out int start) && int.TryParse(limits[1], out int end))
{
if (start < starttag || end > count || start > end)
{
return false;
}
for (int i = start; i <= end; i++)
{
if (pageList.Contains(i - 1))
{
return false;
}
pageList.Add(i - 1);
}
}
else
{
return false;
}
}
else if (int.TryParse(range, out int pageNr))
{
if (pageNr < starttag || pageNr > count)
{
return false;
}
if (pageList.Contains(pageNr - 1))
{
return false;
}
pageList.Add(pageNr - 1);
}
else
{
return false;
}
}
return true;
}
internal static byte[] ConvertBitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
public static string CreateFilePath(string path)
{
int i = 1;
string oldDestName = path;
do
{
if (File.Exists(path))
{
int lastDot = oldDestName.LastIndexOf('.');
string fileExtension = string.Empty;
string fileName = oldDestName;
if (lastDot > 0)
{
fileExtension = fileName.Substring(lastDot);
fileName = fileName.Substring(0, lastDot);
}
path = fileName + string.Format(@"({0})", i) + fileExtension;
}
++i;
} while (File.Exists(path));
return path;
}
public static void ExplorerFile(string filePath)
{
try
{
if (!File.Exists(filePath) && !Directory.Exists(filePath))
return;
if (Directory.Exists(filePath))
Process.Start(@"explorer.exe", "/select,\"" + filePath + "\"");
else
{
IntPtr pidlList = ILCreateFromPathW(filePath);
if (pidlList != IntPtr.Zero)
{
try
{
Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));
}
finally
{
ILFree(pidlList);
}
}
}
}
catch { }
}
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 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 SignatureList;
public static void InitEffectiveSignatureList(CPDFDocument document)
{
SignatureList = document.GetSignatureList();
for (int index = SignatureList.Count - 1; index >= 0; index--)
{
if (SignatureList[index].SignerList.Count <= 0)
{
SignatureList.RemoveAt(index);
}
}
}
public static void VerifySignatureList(CPDFDocument document)
{
foreach (var sig in SignatureList)
{
sig.VerifySignatureWithDocument(document);
}
}
}
}