|
@@ -1,4 +1,5 @@
|
|
|
-using InABox.Core;
|
|
|
+using Comal.Classes;
|
|
|
+using InABox.Core;
|
|
|
using InABox.WPF;
|
|
|
using Microsoft.Office.Interop.Outlook;
|
|
|
using Motorola.Snapi.Attributes;
|
|
@@ -10,6 +11,7 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.ComponentModel;
|
|
|
+using System.Diagnostics.CodeAnalysis;
|
|
|
using System.Drawing;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
@@ -25,6 +27,7 @@ using System.Windows.Input;
|
|
|
using System.Windows.Media;
|
|
|
using System.Windows.Media.Imaging;
|
|
|
using DocumentPage = PRSDesktop.Panels.DataEntry.DocumentPage;
|
|
|
+using Exception = System.Exception;
|
|
|
using Image = System.Windows.Controls.Image;
|
|
|
|
|
|
namespace PRSDesktop
|
|
@@ -37,10 +40,13 @@ namespace PRSDesktop
|
|
|
|
|
|
public List<DocumentManipulationWindow.Page> Pages { get; set; }
|
|
|
|
|
|
- public DocumentGroup(string fileName, List<DocumentManipulationWindow.Page> pages)
|
|
|
+ public Guid TagID { get; set; }
|
|
|
+
|
|
|
+ public DocumentGroup(string fileName, List<DocumentManipulationWindow.Page> pages, Guid tagID)
|
|
|
{
|
|
|
FileName = fileName;
|
|
|
Pages = pages;
|
|
|
+ TagID = tagID;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -54,6 +60,8 @@ namespace PRSDesktop
|
|
|
public List<Page> Pages { get; set; }
|
|
|
public ObservableCollection<DocumentGroup> Groups { get; set; }
|
|
|
|
|
|
+ private ScanTag? SelectedTag => TagBox.SelectedItem as ScanTag;
|
|
|
+
|
|
|
public class Page
|
|
|
{
|
|
|
public string FileName { get; set; }
|
|
@@ -72,7 +80,7 @@ namespace PRSDesktop
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public DocumentManipulationWindow(List<Page> pages, string filename)
|
|
|
+ public DocumentManipulationWindow(List<Page> pages, string filename, Guid tagID)
|
|
|
{
|
|
|
InitializeComponent();
|
|
|
|
|
@@ -80,6 +88,14 @@ namespace PRSDesktop
|
|
|
GroupName.Text = Path.ChangeExtension(filename, ".pdf");
|
|
|
Pages = pages;
|
|
|
ReloadPages();
|
|
|
+
|
|
|
+ var tags = ScanGrid.GetVisibleScanTagList();
|
|
|
+ TagBox.ItemsSource = tags;
|
|
|
+ if (tagID != Guid.Empty)
|
|
|
+ {
|
|
|
+ TagBox.SelectedItem = tags.FirstOrDefault(x => x.ID == tagID);
|
|
|
+ }
|
|
|
+ TagBox.DisplayMemberPath = "Name";
|
|
|
}
|
|
|
|
|
|
private void ReloadPages()
|
|
@@ -87,7 +103,7 @@ namespace PRSDesktop
|
|
|
Documents.Children.Clear();
|
|
|
foreach (var page in Pages)
|
|
|
{
|
|
|
- page.Thumbnail ??= page.Pdf.ToLoadedDocument().ExportAsImage(page.PageIndex).AsBitmapImage(false);
|
|
|
+ page.Thumbnail ??= page.Pdf.AsLoadedDocument().ExportAsImage(page.PageIndex).AsBitmapImage(false);
|
|
|
|
|
|
var width = page.Thumbnail.Width;
|
|
|
var height = page.Thumbnail.Height;
|
|
@@ -136,7 +152,7 @@ namespace PRSDesktop
|
|
|
var filename = Path.ChangeExtension(GroupName.Text, ".pdf");
|
|
|
if(MessageBox.Show($"You still have ungrouped pages. Do you wish to combine them into a document called \"{filename}\"?", "Combine remaining?", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
|
|
|
{
|
|
|
- var group = new DocumentGroup(filename, Pages.ToList());
|
|
|
+ var group = new DocumentGroup(filename, Pages.ToList(), SelectedTag?.ID ?? Guid.Empty);
|
|
|
Pages.Clear();
|
|
|
Groups.Add(group);
|
|
|
}
|
|
@@ -169,7 +185,7 @@ namespace PRSDesktop
|
|
|
Documents.Children.Remove(page);
|
|
|
Pages.Remove(page.Page);
|
|
|
}
|
|
|
- var group = new DocumentGroup(filename, selected.Select(x => x.Page).ToList());
|
|
|
+ var group = new DocumentGroup(filename, selected.Select(x => x.Page).ToList(), SelectedTag?.ID ?? Guid.Empty);
|
|
|
Groups.Add(group);
|
|
|
GroupList.ItemsSource = Groups;
|
|
|
GroupName.Text = "";
|
|
@@ -193,22 +209,28 @@ namespace PRSDesktop
|
|
|
|
|
|
#region Drag & Drop
|
|
|
|
|
|
- private static PdfDocumentBase RenderToPDF(string filename, Stream stream)
|
|
|
+ private static bool TryRenderPDF(Stream stream, [NotNullWhen(true)] out PdfDocumentBase? doc)
|
|
|
{
|
|
|
- PdfDocumentBase pdf;
|
|
|
-
|
|
|
- var extension = Path.GetExtension(filename).ToLower();
|
|
|
- if (extension == ".pdf")
|
|
|
+ try
|
|
|
{
|
|
|
- pdf = new PdfLoadedDocument(stream);
|
|
|
+ doc = new PdfLoadedDocument(stream);
|
|
|
+ return true;
|
|
|
}
|
|
|
- else if (extension == ".jpg" || extension == ".jpeg" || extension == ".png" || extension == ".bmp")
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ doc = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ private static bool TryRenderImage(Stream stream, [NotNullWhen(true)] out PdfDocumentBase? doc)
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
var image = new PdfBitmap(stream);
|
|
|
|
|
|
- var doc = new PdfDocument();
|
|
|
+ var pdfDoc = new PdfDocument();
|
|
|
|
|
|
- var section = doc.Sections.Add();
|
|
|
+ var section = pdfDoc.Sections.Add();
|
|
|
section.PageSettings.Margins.All = 0;
|
|
|
section.PageSettings.Width = image.Width;
|
|
|
section.PageSettings.Height = image.Height;
|
|
@@ -216,16 +238,25 @@ namespace PRSDesktop
|
|
|
var page = section.Pages.Add();
|
|
|
page.Graphics.DrawImage(image, 0, 0, page.Size.Width, page.Size.Height);
|
|
|
|
|
|
- pdf = doc;
|
|
|
+ doc = pdfDoc;
|
|
|
+ return true;
|
|
|
}
|
|
|
- else
|
|
|
+ catch(Exception)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ doc = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ private static bool TryRenderText(Stream stream, [NotNullWhen(true)] out PdfDocumentBase? doc)
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
var bytes = new byte[stream.Length];
|
|
|
stream.Read(bytes, 0, bytes.Length);
|
|
|
var text = Encoding.UTF8.GetString(bytes);
|
|
|
|
|
|
- var doc = new PdfDocument();
|
|
|
- var page = doc.Pages.Add();
|
|
|
+ var pdfDoc = new PdfDocument();
|
|
|
+ var page = pdfDoc.Pages.Add();
|
|
|
|
|
|
var font = new PdfStandardFont(PdfFontFamily.Courier, 14);
|
|
|
var textElement = new PdfTextElement(text, font);
|
|
@@ -237,9 +268,47 @@ namespace PRSDesktop
|
|
|
|
|
|
textElement.Draw(page, new RectangleF(0, 0, page.GetClientSize().Width, page.GetClientSize().Height), layoutFormat);
|
|
|
|
|
|
- pdf = doc;
|
|
|
+ doc = pdfDoc;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ doc = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static PdfDocumentBase RenderToPDF(string filename, Stream stream)
|
|
|
+ {
|
|
|
+ var extension = Path.GetExtension(filename).ToLower();
|
|
|
+ if (extension == ".pdf")
|
|
|
+ {
|
|
|
+ if(TryRenderPDF(stream, out var pdf)
|
|
|
+ || TryRenderImage(stream, out pdf)
|
|
|
+ || TryRenderText(stream, out pdf))
|
|
|
+ {
|
|
|
+ return pdf;
|
|
|
+ }
|
|
|
}
|
|
|
- return pdf;
|
|
|
+ else if (extension == ".jpg" || extension == ".jpeg" || extension == ".png" || extension == ".bmp")
|
|
|
+ {
|
|
|
+ if (TryRenderImage(stream, out var pdf)
|
|
|
+ || TryRenderPDF(stream, out pdf)
|
|
|
+ || TryRenderText(stream, out pdf))
|
|
|
+ {
|
|
|
+ return pdf;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (TryRenderText(stream, out var pdf)
|
|
|
+ || TryRenderImage(stream, out pdf)
|
|
|
+ || TryRenderPDF(stream, out pdf))
|
|
|
+ {
|
|
|
+ return pdf;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new Exception("Could not render file to PDF");
|
|
|
}
|
|
|
|
|
|
private static PdfDocumentBase RenderToPDF(string filename)
|
|
@@ -248,7 +317,7 @@ namespace PRSDesktop
|
|
|
return RenderToPDF(filename, stream);
|
|
|
}
|
|
|
|
|
|
- public static List<Page>? HandleFileDrop(DragEventArgs e, out string fileName)
|
|
|
+ public static List<Tuple<string, PdfDocumentBase>>? HandleFileDrop(DragEventArgs e)
|
|
|
{
|
|
|
var dataObject = new OutlookDataObject(e.Data);
|
|
|
|
|
@@ -258,64 +327,69 @@ namespace PRSDesktop
|
|
|
|
|
|
if (desc is not null)
|
|
|
{
|
|
|
- var pages = new List<DocumentManipulationWindow.Page>();
|
|
|
+ var docs = new List<Tuple<string, PdfDocumentBase>>();
|
|
|
var filenames = (string[])dataObject.GetData(desc);
|
|
|
var filestreams = (MemoryStream[])dataObject.GetData("FileContents");
|
|
|
- fileName = "";
|
|
|
for (var i = 0; i < filenames.Length; i++)
|
|
|
{
|
|
|
var filename = filenames[i];
|
|
|
- fileName = filename;
|
|
|
var filestream = filestreams[i];
|
|
|
var doc = RenderToPDF(filename, filestream);
|
|
|
- var loaded = doc.ToLoadedDocument();
|
|
|
- for (int j = 0; j < loaded.PageCount(); ++j)
|
|
|
- {
|
|
|
- pages.Add(new(filename, loaded, j));
|
|
|
- }
|
|
|
+ docs.Add(new(filename, doc));
|
|
|
}
|
|
|
- return pages;
|
|
|
+ return docs;
|
|
|
}
|
|
|
else if (dataObject.GetDataPresent(DataFormats.FileDrop))
|
|
|
{
|
|
|
- var pages = new List<Page>();
|
|
|
- fileName = "";
|
|
|
+ var docs = new List<Tuple<string, PdfDocumentBase>>();
|
|
|
foreach (var filename in (string[])dataObject.GetData(DataFormats.FileDrop))
|
|
|
{
|
|
|
if (File.Exists(filename))
|
|
|
{
|
|
|
- fileName = filename;
|
|
|
var doc = RenderToPDF(filename);
|
|
|
- var loaded = doc.ToLoadedDocument();
|
|
|
- for (int i = 0; i < loaded.PageCount(); ++i)
|
|
|
- {
|
|
|
- pages.Add(new(filename, loaded, i));
|
|
|
- }
|
|
|
+ docs.Add(new(filename, doc));
|
|
|
}
|
|
|
}
|
|
|
- return pages;
|
|
|
+ return docs;
|
|
|
}
|
|
|
- fileName = "";
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ public static List<Page> SplitIntoPages(string filename, PdfDocumentBase doc)
|
|
|
+ {
|
|
|
+ var pages = new List<Page>();
|
|
|
+ var loaded = doc.AsLoadedDocument();
|
|
|
+
|
|
|
+ for(int i = 0; i < loaded.PageCount(); ++i)
|
|
|
+ {
|
|
|
+ pages.Add(new(filename, loaded, i));
|
|
|
+ }
|
|
|
+ return pages;
|
|
|
+ }
|
|
|
+
|
|
|
private void Documents_Drop(object sender, DragEventArgs e)
|
|
|
{
|
|
|
Task.Run(() =>
|
|
|
{
|
|
|
- var pages = HandleFileDrop(e, out var filename);
|
|
|
- if (pages is not null)
|
|
|
+ var docs = HandleFileDrop(e);
|
|
|
+ if (docs is not null)
|
|
|
{
|
|
|
Dispatcher.Invoke(() =>
|
|
|
{
|
|
|
- foreach (var page in pages)
|
|
|
+ var groupName = "";
|
|
|
+
|
|
|
+ foreach (var (filename, doc) in docs)
|
|
|
{
|
|
|
- Pages.Add(page);
|
|
|
- ReloadPages();
|
|
|
+ groupName = filename;
|
|
|
+ foreach(var page in SplitIntoPages(filename, doc))
|
|
|
+ {
|
|
|
+ Pages.Add(page);
|
|
|
+ }
|
|
|
}
|
|
|
- if (string.IsNullOrWhiteSpace(GroupName.Text))
|
|
|
+ ReloadPages();
|
|
|
+ if (string.IsNullOrWhiteSpace(GroupName.Text) && !string.IsNullOrWhiteSpace(groupName))
|
|
|
{
|
|
|
- GroupName.Text = Path.ChangeExtension(filename, ".pdf");
|
|
|
+ GroupName.Text = Path.ChangeExtension(groupName, ".pdf");
|
|
|
}
|
|
|
});
|
|
|
}
|