Sfoglia il codice sorgente

Added document compression API

Marcin Ziąbek 1 anno fa
parent
commit
a03763c86e

+ 82 - 0
Source/QuestPDF.UnitTests/DocumentCompressionTests.cs

@@ -0,0 +1,82 @@
+using System;
+using System.Diagnostics;
+using System.Linq;
+using FluentAssertions;
+using NUnit.Framework;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.UnitTests;
+
+public class DocumentCompressionTests
+{
+    [Test]
+    public void Test()
+    {
+        var document = Document.Create(document =>
+        {
+            document.Page(page =>
+            {
+                page.Size(PageSizes.A4);
+                
+                page.Content()
+                    .Table(table =>
+                    {
+                        table.ColumnsDefinition(columns =>
+                        {
+                            columns.RelativeColumn();
+                            columns.RelativeColumn();
+                            columns.RelativeColumn();
+                            columns.RelativeColumn();
+                            columns.ConstantColumn(100);
+                        });
+
+                        foreach (var y in Enumerable.Range(1, 1_00))
+                        {
+                            foreach (var x in Enumerable.Range(1, 4))
+                            {
+                                table
+                                    .Cell()
+                                    .Padding(5)
+                                    .Border(1)
+                                    .Background(Placeholders.BackgroundColor())
+                                    .Padding(5)
+                                    .Text($"f({y}, {x}) = '{Placeholders.Sentence()}'");
+                            }
+                        
+                            table
+                                .Cell()
+                                .Padding(5)
+                                .AspectRatio(2f)
+                                .Image(Placeholders.Image);
+                        }
+                    });
+            });
+        });
+
+        var withoutCompression = MeasureDocumentSizeAndGenerationTime(false);
+        var withCompression = MeasureDocumentSizeAndGenerationTime(true);
+        
+        var sizeRatio = withoutCompression.documentSize / (float)withCompression.documentSize;
+        sizeRatio.Should().BeGreaterThan(3);
+
+        Math.Abs(withCompression.generationTime - withoutCompression.generationTime).Should().BeLessThan(100);
+        
+        (int documentSize, float generationTime) MeasureDocumentSizeAndGenerationTime(bool compress)
+        {
+            var stopwatch = new Stopwatch();
+            
+            stopwatch.Restart();
+            
+            var documentSize = document
+                .WithSettings(new DocumentSettings { CompressDocument = compress })
+                .GeneratePdf()
+                .Length;
+            
+            stopwatch.Stop();
+            
+            return (documentSize, stopwatch.ElapsedMilliseconds);
+        }
+    }
+}

+ 3 - 1
Source/QuestPDF/Drawing/PdfCanvas.cs

@@ -43,7 +43,9 @@ namespace QuestPDF.Drawing
                 
                 RasterDPI = documentSettings.ImageRasterDpi,
                 ImageEncodingQuality = documentSettings.ImageCompressionQuality.ToQualityValue(),
-                SupportPDFA = documentSettings.PdfA
+                
+                SupportPDFA = documentSettings.PdfA,
+                CompressDocument = documentSettings.CompressDocument
             };
         }
     }

+ 5 - 0
Source/QuestPDF/Infrastructure/DocumentSettings.cs

@@ -11,6 +11,11 @@
         /// </summary>
         public bool PdfA { get; set; } = false;
 
+        /// <summary>
+        /// Gets or sets a value indicating whether the generated document should be additionally compressed. May greatly reduce file size with a small increase in generation time.
+        /// </summary>
+        public bool CompressDocument { get; set; } = true;
+        
         /// <summary>
         /// Encoding quality controls the trade-off between size and quality.
         /// When the image is opaque, it will be encoded using the JPEG format with the selected quality setting.