using ComPDFKit.Import; using ComPDFKit.PDFPage; using ComPDFKit.Viewer.Helper; using ComPDFKit.Viewer.Layer; using ComPDFKitViewer; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using ComPDFKit.Tool.SettingParam; namespace ComPDFKit.Tool.DrawTool { public class PageImageItem { public int PageIndex; /// /// PDF DPI(72) /// public Rect PaintRect; public int PageRotate; public int ImageIndex; public PageImageItem Clone() { PageImageItem cloneItem = new PageImageItem(); cloneItem.PageIndex = PageIndex; cloneItem.PaintRect = PaintRect; cloneItem.PageRotate = PageRotate; cloneItem.ImageIndex = ImageIndex; return cloneItem; } } internal class SelectImage : CustomizeLayer { protected DrawingContext drawDC { get; set; } protected DefaultDrawParam drawParam = new DefaultDrawParam(); private Dictionary> pageImageDict = new Dictionary>(); private PageImageItem hoverImageItem = null; /// /// Identify whether the image selection effect is being drawn /// protected bool isDrawSelectImage { get; set; } public override void Draw() { } public void Draw(CPDFViewer cPDFViewer) { Dispatcher.Invoke(() => { drawDC = Open(); List renderDatas = cPDFViewer.CurrentRenderFrame.GetRenderDatas(); foreach (RenderData item in renderDatas) { if (pageImageDict.ContainsKey(item.PageIndex)) { List PaintImageList = pageImageDict[item.PageIndex]; foreach (PageImageItem SelectItem in PaintImageList) { DrawItem(SelectItem, item, cPDFViewer, drawDC, false); } } if (hoverImageItem != null && hoverImageItem.PageIndex == item.PageIndex) { DrawItem(hoverImageItem, item, cPDFViewer, drawDC, true); } } Present(); }); } public void CleanDraw(CPDFViewer cPDFViewer) { Dispatcher.Invoke(() => { drawDC = Open(); Present(); ClearImageItem(); }); } private void DrawItem(PageImageItem SelectItem, RenderData renderData, CPDFViewer cPDFViewer, DrawingContext dc, bool isHover) { Rect drawRect = SelectItem.PaintRect; if (cPDFViewer.GetDocument() != null) { CPDFPage rawPage = cPDFViewer.GetDocument().PageAtIndex(renderData.PageIndex); if (rawPage != null) { int rotation = rawPage.Rotation - SelectItem.PageRotate; if (rotation != 0) { Size rawSize = renderData.RenderRect.Size; Matrix matrix = new Matrix(); matrix.RotateAt(-rotation * 90, rawSize.Width / 2, rawSize.Height / 2); Rect checkRect = new Rect(0, 0, rawSize.Width, rawSize.Height); checkRect.Transform(matrix); matrix = new Matrix(); matrix.RotateAt(rotation * 90, checkRect.Width / 96D * 72D / 2, checkRect.Height / 96D * 72D / 2); checkRect = new Rect(0, 0, checkRect.Width / 96D * 72D, checkRect.Height / 96D * 72D); drawRect.Transform(matrix); checkRect.Transform(matrix); drawRect = new Rect(drawRect.Left - checkRect.Left, drawRect.Top - checkRect.Top, drawRect.Width, drawRect.Height); } } } Rect BorderRect = renderData.PageBound; Rect RawPaintRect = new Rect(drawRect.Left / 72 * cPDFViewer.GetZoom() * 96 - renderData.CropLeft * cPDFViewer.GetZoom(), drawRect.Top / 72 * cPDFViewer.GetZoom() * 96 - renderData.CropTop * cPDFViewer.GetZoom(), drawRect.Width / 72 * cPDFViewer.GetZoom() * 96, drawRect.Height / 72 * cPDFViewer.GetZoom() * 96); RawPaintRect.X += BorderRect.X; RawPaintRect.Y += BorderRect.Y; RectangleGeometry clipGeometry = new RectangleGeometry(); clipGeometry.Rect = renderData.PageBound; dc.PushClip(clipGeometry); if (isHover) { dc.DrawRectangle(null, drawParam.ViewerImagePen, RawPaintRect); } else { dc.DrawRectangle(drawParam.ViewerImageBackgroundBrush, null, RawPaintRect); } dc.Pop(); } public bool ProcessMouseDownForSelectImage(Point pdfPoint, int pageIndex, CPDFViewer cPDFViewer, bool isNeedClear) { return ProcessSelectImageAtPos(cPDFViewer, pdfPoint, pageIndex, false, isNeedClear); } public bool ProcessMouseMoveForSelectImage(Point pdfPoint, int pageIndex, CPDFViewer cPDFViewer) { return ProcessSelectImageAtPos(cPDFViewer, pdfPoint, pageIndex, true, true); } private bool ProcessSelectImageAtPos(CPDFViewer cPDFViewer, Point pdfPoint, int pageIndex, bool isHover, bool isNeedClear) { bool result = false; if (cPDFViewer == null || cPDFViewer.GetDocument() == null || pageIndex < 0) { return result; } CPDFPage rawPage = cPDFViewer.GetDocument().PageAtIndex(pageIndex); CPDFImgSelection imageRanges = rawPage.GetImgSelection(); List checkList = imageRanges.GetImageRects(); bool findItem = false; for (int i = 0; i < checkList.Count; i++) { Rect checkRect = DataConversionForWPF.CRectConversionForRect(checkList[i]); if (checkRect.Contains(pdfPoint)) { findItem = true; if (isHover) { if (hoverImageItem == null || hoverImageItem.PageIndex != pageIndex || hoverImageItem.ImageIndex != i) { hoverImageItem = new PageImageItem() { PageIndex = pageIndex, PaintRect = checkRect, PageRotate = rawPage.Rotation, ImageIndex = i }; result = true; } } else { if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) { if (ContainImageItem(pageIndex, i)) { result = RemoveImageItem(pageIndex, i); } else { if (pageImageDict != null && pageImageDict.Count > 0 && pageImageDict.Keys.Contains(pageIndex) == false) { ClearImageItem(); } result = AddPageImageItem(pageIndex, checkRect, rawPage.Rotation, i); } } else { if (!ContainImageItem(pageIndex, i) || isNeedClear) { ClearImageItem(); result = AddPageImageItem(pageIndex, checkRect, rawPage.Rotation, i); } else { result = true; } } hoverImageItem = null; } break; } } if (findItem == false && hoverImageItem != null) { hoverImageItem = null; result = false; } if (findItem == false && !isHover && pageImageDict != null && pageImageDict.Count > 0 && isNeedClear) { ClearImageItem(); result = true; } return result; } private bool AddPageImageItem(int pageIndex, Rect paintRect, int pageRotate, int ImageIndex) { bool result = false; if (pageImageDict.ContainsKey(pageIndex) && pageImageDict[pageIndex] != null) { List imageItems = pageImageDict[pageIndex]; if (ContainImageItem(pageIndex, ImageIndex) == false) { imageItems.Add(new PageImageItem() { PageIndex = pageIndex, PaintRect = paintRect, PageRotate = pageRotate, ImageIndex = ImageIndex }); result = true; } } else { List imageItems = new List(); imageItems.Add(new PageImageItem() { PageIndex = pageIndex, PaintRect = paintRect, PageRotate = pageRotate, ImageIndex = ImageIndex }); pageImageDict.Add(pageIndex, imageItems); result = true; } return result; } private bool ContainImageItem(int pageIndex, int ImageIndex) { bool result = false; if (pageImageDict != null && pageImageDict.ContainsKey(pageIndex)) { List imageItems = pageImageDict[pageIndex]; if (imageItems != null && imageItems.Count > 0 && imageItems.Where(x => x.ImageIndex == ImageIndex).Count() > 0) { result = true; } } return result; } private bool RemoveImageItem(int pageIndex, int ImageIndex) { bool result = false; if (pageImageDict.ContainsKey(pageIndex) && pageImageDict[pageIndex] != null) { List imageItems = pageImageDict[pageIndex]; if (imageItems.Count > 0) { List delItems = imageItems.Where(x => x.ImageIndex == ImageIndex).ToList(); if (delItems.Count > 0) { result = true; } foreach (PageImageItem delItem in delItems) { imageItems.Remove(delItem); } } } return result; } public bool ClearImageItem() { bool result = false; if (pageImageDict.Count > 0) { pageImageDict.Clear(); result = true; } hoverImageItem = null; return result; } public PageImageItem GetHoverImageItem() { return hoverImageItem.Clone(); } public Dictionary> GetSelectImageItems() { return pageImageDict; } } }