protected void DrawImageHighlight(DrawingContext drawingContext,
                                          PDFImageExtract extract,
                                          Pen pen,
                                          Brush brush)
        {
            var deviceRec = PageToDeviceDoubleRect(extract.BoundingBox, extract.PageIndex);

            drawingContext.DrawRectangle(brush,
                                         pen,
                                         deviceRec);
        }
Example #2
0
        protected bool CreateSMExtract(double priority)
        {
            bool ret = false;

            bool txtExtract  = false;
            var  imgExtracts = new List <PDFImageExtract>();
            var  contents    = new List <ContentBase>();

            var selImages     = SelectedImages;
            var selImageAreas = SelectedAreas.Where(a => a.Type == PDFAreaSelection.AreaType.Normal);
            var selTextAreas  = SelectedAreas.Where(a => a.Type == PDFAreaSelection.AreaType.Ocr).ToList();
            var pageIndices   = new HashSet <int>();

            if (priority < 0 || priority > 100)
            {
                priority = PDFConst.DefaultSMExtractPriority;
            }

            string extractTitle = null;

            // Image extract
            foreach (var selImage in selImages)
            {
                var imgExtract = new PDFImageExtract
                {
                    BoundingBox = selImage.BoundingBox,
                    ObjectIndex = selImage.ObjectIndex,
                    PageIndex   = selImage.PageIndex,
                };
                var imgObj           = (PdfImageObject)Document.Pages[selImage.PageIndex].PageObjects[selImage.ObjectIndex];
                var imgRegistryTitle = TitleOrFileName + $": {selImage}";

                var content = CreateImageContent(imgObj.Bitmap.Image, imgRegistryTitle);

                if (content != null)
                {
                    imgExtracts.Add(imgExtract);
                    contents.Add(content);

                    pageIndices.Add(selImage.PageIndex);
                }
            }

            // Area extract
            foreach (var selArea in selImageAreas)
            {
                var imgExtract = new PDFImageExtract
                {
                    BoundingBox = selArea.Normalized(),
                    ObjectIndex = -1,
                    PageIndex   = selArea.PageIndex,
                };

                var(lt, rb) = selArea.NormalizedPoints();
                var img = RenderArea(imgExtract.PageIndex, lt, rb);

                var imgRegistryTitle = TitleOrFileName + $": {selArea}";

                var content = CreateImageContent(img, imgRegistryTitle);

                if (content != null)
                {
                    imgExtracts.Add(imgExtract);
                    contents.Add(content);

                    pageIndices.Add(selArea.PageIndex);
                }
            }

            // Text extract
            var hasTextSelection = string.IsNullOrWhiteSpace(SelectedText) == false;
            var hasTextOcr       = selTextAreas.Any();

            if (hasTextSelection)
            {
                txtExtract = true;

                foreach (var selInfo in SelectInfos)
                {
                    for (int p = selInfo.StartPage; p <= selInfo.EndPage; p++)
                    {
                        pageIndices.Add(p);
                    }
                }
            }

            if (hasTextOcr)
            {
                foreach (var selArea in selTextAreas)
                {
                    pageIndices.Add(selArea.PageIndex);
                }
            }

            if (hasTextSelection || hasTextOcr)
            {
                string text = GetSelectedTextAsHtml();

                contents.Add(new TextContent(true, text));
            }

            else if (imgExtracts.Count > 0)
            {
                var parentEl = Svc.SM.Registry.Element[PDFElement.ElementId];

                var titleString = $"{parentEl.Title} -- Image extract:";
                var imageString = $"{imgExtracts.Count} image{(imgExtracts.Count == 1 ? "" : "s")}";
                var pageString  = "p" + string.Join(", p", pageIndices.Select(p => p + 1));

                extractTitle = $"{titleString} {imageString} from {pageString}";

                if (Config.ImageExtractAddHtml)
                {
                    contents.Add(new TextContent(true, string.Empty));
                }
            }

            // Generate extract
            if (contents.Count > 0)
            {
                Save(false);

                var bookmarks = pageIndices.Select(FindBookmark)
                                .Where(b => b != null)
                                .Distinct()
                                .Select(b => $"({b.ToHierarchyString()})");
                var bookmarksStr = StringEx.Join(" ; ", bookmarks);
                var parentEl     = Svc.SM.Registry.Element[PDFElement.ElementId];

                var templateId = imgExtracts.Count > 0 ? Config.ImageTemplate : Config.TextTemplate;
                var template   = Svc.SM.Registry.Template[templateId];

                ret = Svc.SM.Registry.Element.Add(
                    out _,
                    ElemCreationFlags.CreateSubfolders,
                    new ElementBuilder(ElementType.Topic,
                                       contents.ToArray())
                    .WithParent(parentEl)
                    .WithConcept(parentEl.Concept)
                    .WithLayout(Config.Layout)
                    .WithTemplate(template)
                    .WithPriority(priority)
                    .WithReference(r => PDFElement.ConfigureSMReferences(r, bookmarks: bookmarksStr))
                    .WithTitle(extractTitle)
                    .DoNotDisplay()
                    );

                Window.GetWindow(this)?.Activate();

                if (ret)
                {
                    SelectInfo lastSelInfo = default;

                    foreach (var imgExtract in imgExtracts)
                    {
                        PDFElement.SMImgExtracts.Add(imgExtract);
                        AddImgExtractHighlight(imgExtract.PageIndex, imgExtract.BoundingBox);
                    }

                    if (txtExtract)
                    {
                        foreach (var selInfo in SelectInfos)
                        {
                            PDFElement.SMExtracts.Add(selInfo);
                            AddSMExtractHighlight(selInfo);
                        }

                        lastSelInfo = SelectInfo;
                    }

                    Save(false);
                    DeselectAll();

                    if (txtExtract)
                    {
                        _selectInfo.StartPage  = _selectInfo.EndPage = lastSelInfo.StartPage;
                        _selectInfo.StartIndex = _selectInfo.EndIndex = lastSelInfo.StartIndex;
                    }
                }
            }

            return(ret);
        }
        protected bool CreateSMExtract()
        {
            bool ret = false;

            bool txtExtract  = false;
            var  imgExtracts = new List <PDFImageExtract>();
            var  contents    = new List <ContentBase>();

            var selImages     = SelectedImages;
            var selImageAreas = SelectedAreas.Where(a => a.Type == PDFAreaSelection.AreaType.Normal);
            var selTextAreas  = SelectedAreas.Where(a => a.Type == PDFAreaSelection.AreaType.Ocr).ToList();
            var pageIndices   = new HashSet <int>();

            // Image extract
            foreach (var selImage in selImages)
            {
                var imgExtract = new PDFImageExtract
                {
                    BoundingBox = selImage.BoundingBox,
                    ObjectIndex = selImage.ObjectIndex,
                    PageIndex   = selImage.PageIndex,
                };
                var imgObj           = (PdfImageObject)Document.Pages[selImage.PageIndex].PageObjects[selImage.ObjectIndex];
                var imgRegistryTitle = TitleOrFileName + $": {selImage}";

                var content = CreateImageContent(imgObj.Bitmap.Image,
                                                 imgRegistryTitle);

                if (content != null)
                {
                    imgExtracts.Add(imgExtract);
                    contents.Add(content);

                    pageIndices.Add(selImage.PageIndex);
                }
            }

            // Area extract
            foreach (var selArea in selImageAreas)
            {
                var imgExtract = new PDFImageExtract
                {
                    BoundingBox = selArea.Normalized(),
                    ObjectIndex = -1,
                    PageIndex   = selArea.PageIndex,
                };

                var(lt, rb) = selArea.NormalizedPoints();
                var img = RenderArea(imgExtract.PageIndex, lt, rb);

                var imgRegistryTitle = TitleOrFileName + $": {selArea}";

                var content = CreateImageContent(img,
                                                 imgRegistryTitle);

                if (content != null)
                {
                    imgExtracts.Add(imgExtract);
                    contents.Add(content);

                    pageIndices.Add(selArea.PageIndex);
                }
            }

            // Text extract
            if (string.IsNullOrWhiteSpace(SelectedText) == false)
            {
                string text = GetSelectedTextHtml();

                contents.Add(new TextContent(true,
                                             text));
                txtExtract = true;

                foreach (var selInfo in SelectInfos)
                {
                    for (int p = selInfo.StartPage; p <= selInfo.EndPage; p++)
                    {
                        pageIndices.Add(p);
                    }
                }
            }

            if (selTextAreas.Any())
            {
                var text = string.Join("\r\n<br/>[...] ",
                                       selTextAreas.Select(a => a.OcrText));
                contents.Add(new TextContent(true,
                                             text));

                foreach (var selArea in selTextAreas)
                {
                    pageIndices.Add(selArea.PageIndex);
                }
            }

            // Generate extract
            if (contents.Count > 0)
            {
                Save(false);

                var bookmarks = pageIndices.Select(FindBookmark)
                                .Where(b => b != null)
                                .Distinct()
                                .Select(b => $"({b.ToHierarchyString()})");
                var bookmarksStr = StringEx.Join(" ; ", bookmarks);

                ret = Svc.SMA.Registry.Element.Add(
                    out _,
                    ElemCreationFlags.CreateSubfolders,
                    new ElementBuilder(ElementType.Topic,
                                       contents.ToArray())
                    .WithParent(Svc.SMA.Registry.Element[PDFElement.ElementId])
                    .WithLayout(Config.Layout)
                    .WithPriority(Config.SMExtractPriority)
                    .WithReference(r => PDFElement.ConfigureSMReferences(r, bookmarks: bookmarksStr))
                    .WithForcedGeneratedTitle()
                    .DoNotDisplay()
                    );

                Window.GetWindow(this)?.Activate();

                if (ret)
                {
                    foreach (var imgExtract in imgExtracts)
                    {
                        PDFElement.SMImgExtracts.Add(imgExtract);
                        AddImgExtractHighlight(imgExtract.PageIndex,
                                               imgExtract.BoundingBox);
                    }

                    if (txtExtract)
                    {
                        foreach (var selInfo in SelectInfos)
                        {
                            PDFElement.SMExtracts.Add(selInfo);
                            AddSMExtractHighlight(selInfo);
                        }
                    }

                    Save(false);
                    DeselectAll();
                }
            }

            return(ret);
        }