浏览代码

Merge remote-tracking branch 'origin/frank' into kenric

Kenric Nugteren 4 周之前
父节点
当前提交
bdfe805465

+ 1 - 1
inabox.wpf/DynamicGrid/DynamicEditorForm/IDynamicEditorForm.cs

@@ -72,7 +72,7 @@ namespace InABox.DynamicGrid
             }
         }
 
-        public static IDynamicEditorControl FindEditor(this IDynamicEditorForm form, string columnName)
+        public static IDynamicEditorControl? FindEditor(this IDynamicEditorForm form, string columnName)
         {
             form.TryFindEditor(columnName, out var editor);
             return editor;

+ 1 - 0
inabox.wpf/DynamicGrid/Editors/CodePopupEditor/CodePopupEditorControl.cs

@@ -253,6 +253,7 @@ public class CodePopupEditorControl : DynamicEditorControl<Guid, CodePopupEditor
                 SetEmptyValue();
             else
                 LookupValue("ID", value);
+            CheckChanged();
         }
     }
 

+ 76 - 33
inabox.wpf/ImageUtils.cs

@@ -29,6 +29,7 @@ using System.Runtime;
 using System.Text;
 using SharpVectors.Converters;
 using SharpVectors.Renderers.Wpf;
+using Syncfusion.PdfToImageConverter;
 using Encoder = System.Drawing.Imaging.Encoder;
 
 namespace InABox.WPF
@@ -822,7 +823,9 @@ namespace InABox.WPF
 
         public enum ImageEncoding
         {
-            JPEG
+            JPEG,
+            TIFF,
+            PNG,
         }
 
         public static ImageCodecInfo? GetEncoder(ImageFormat format)
@@ -887,20 +890,52 @@ namespace InABox.WPF
 
         public static byte[] GetPDFThumbnail(byte[] pdfData, int width, int height)
         {
-            PdfLoadedDocument loadeddoc = new PdfLoadedDocument(pdfData);
-            Bitmap image = loadeddoc.ExportAsImage(0, new SizeF(width, height), true);
-            MemoryStream stream = new MemoryStream();
-            image.Save(stream, ImageFormat.Jpeg);
-            return stream.ToArray();
+            
+            using (var inData = new MemoryStream(pdfData))
+            {
+                using (var converter = new PdfToImageConverter(inData))
+                {
+                    using (var outData = new MemoryStream())
+                    {
+                        converter.Convert(0, new SizeF(width, height), true, false, false)
+                            .CopyTo(outData);
+                        return outData.ToArray();
+                    }
+
+                }
+            }
         }
         
         public static byte[] PDFToBitmap(byte[] pdfData, int page)
         {
-            PdfLoadedDocument loadeddoc = new PdfLoadedDocument(pdfData);
-            Bitmap image = loadeddoc.ExportAsImage(page, new ImageExportSettings() { KeepAspectRatio = true });
-            MemoryStream stream = new MemoryStream();
-            image.Save(stream, ImageFormat.Jpeg);
-            return stream.ToArray();
+            using (var inData = new MemoryStream(pdfData))
+            {
+                using (var converter = new PdfToImageConverter(inData))
+                {
+                    using (var outData = new MemoryStream())
+                    {
+                        converter.Convert(page, false, false).CopyTo(outData);
+                        return outData.ToArray();
+                    }
+                }
+            }
+            
+        }
+        
+        private static Bitmap[] PDFToBitmapArray(byte[] pdfData)
+        {
+            Bitmap[] images = [];
+            using (var ms = new MemoryStream(pdfData))
+            {
+                using (var converter = new PdfToImageConverter(ms))
+                {
+                    images = converter.Convert(0, converter.PageCount - 1, false, false)
+                        .Select(x => new Bitmap(x))
+                        .ToArray();
+                }
+            }
+
+            return images;
         }
 
         [System.Runtime.InteropServices.DllImport("gdi32.dll")]
@@ -910,9 +945,8 @@ namespace InABox.WPF
             using var profiler = new Profiler(true);
             var rendered = new List<ImageSource>();
 
-            var loadeddoc = new PdfLoadedDocument(pdfData);
-            loadeddoc.FlattenAnnotations();
-            var images = loadeddoc.ExportAsImage(0, loadeddoc.Pages.Count - 1);
+
+            var images = PDFToBitmapArray(pdfData);
 
             if (images != null)
                 foreach (var image in images)
@@ -937,28 +971,38 @@ namespace InABox.WPF
             return rendered;
         }
 
+
+
         public static List<byte[]> RenderPDFToImageBytes(byte[] pdfData, ImageEncoding encoding = ImageEncoding.JPEG)
         {
             var rendered = new List<byte[]>();
+            Bitmap[] images = PDFToBitmapArray(pdfData);
 
-            PdfLoadedDocument loadeddoc = new PdfLoadedDocument(pdfData);
-            loadeddoc.FlattenAnnotations();
-            Bitmap[] images = loadeddoc.ExportAsImage(0, loadeddoc.Pages.Count - 1);
-
-            var jpgEncoder = GetEncoder(ImageFormat.Jpeg)!;
-            var quality = Encoder.Quality;
-            var encodeParams = new EncoderParameters(1);
-            encodeParams.Param[0] = new EncoderParameter(quality, 100L);
+            ImageCodecInfo encoder;
+            EncoderParameters? parameters = null;
+            if (encoding == ImageEncoding.JPEG)
+            {
+                encoder = GetEncoder(ImageFormat.Jpeg)!;
+                parameters = new EncoderParameters(1);
+                parameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
+            }
+            else if (encoding == ImageEncoding.TIFF)
+            {
+                encoder = GetEncoder(ImageFormat.Tiff)!;
+            }
+            else
+            {
+                encoder = GetEncoder(ImageFormat.Png)!;
+            }
 
-            if (images != null)
-                foreach (var image in images)
+            foreach (var image in images)
+            {
+                using (var data = new MemoryStream())
                 {
-                    using (var data = new MemoryStream())
-                    {
-                        image.Save(data, jpgEncoder, encodeParams);
-                        rendered.Add(data.ToArray());
-                    }
+                    image.Save(data, encoder, parameters);
+                    rendered.Add(data.ToArray());
                 }
+            }
 
             return rendered;
         }
@@ -980,10 +1024,9 @@ namespace InABox.WPF
 
             using var docStream = new MemoryStream();
             pdfDocument.Save(docStream);
-
-            var loadeddoc = new PdfLoadedDocument(docStream.ToArray());
-            Bitmap[] bmpImages = loadeddoc.ExportAsImage(0, loadeddoc.Pages.Count - 1);
-
+            
+            Bitmap[] bmpImages = PDFToBitmapArray(docStream.ToArray());
+            
             var jpgEncoder = GetEncoder(ImageFormat.Jpeg)!;
             var quality = Encoder.Quality;
             var encodeParams = new EncoderParameters(1);