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); }