From 184a2f0f16af522ab15425b240064366459aaf3a Mon Sep 17 00:00:00 2001 From: Modest-as Date: Wed, 27 Sep 2023 15:37:38 +0300 Subject: [PATCH] different form fill info allocation to fix mem read issues --- src/Docnet.Core/Bindings/DocumentWrapper.cs | 32 --------- src/Docnet.Core/Bindings/FormWrapper.cs | 45 +++++++++++++ src/Docnet.Core/Bindings/PdfiumWrapper.cs | 4 +- src/Docnet.Core/Models/RenderFlags.cs | 1 + src/Docnet.Core/Readers/PageReader.cs | 12 ++-- .../Docs/annotation_1.pdf | Bin 0 -> 21276 bytes .../Docs/simple_7.pdf | Bin 0 -> 32155 bytes .../PageReaderTests.cs | 63 ++++++++++++++++++ 8 files changed, 118 insertions(+), 39 deletions(-) create mode 100644 src/Docnet.Core/Bindings/FormWrapper.cs create mode 100644 src/Docnet.Tests.Integration/Docs/annotation_1.pdf create mode 100644 src/Docnet.Tests.Integration/Docs/simple_7.pdf diff --git a/src/Docnet.Core/Bindings/DocumentWrapper.cs b/src/Docnet.Core/Bindings/DocumentWrapper.cs index c69b94d..7e81bd0 100644 --- a/src/Docnet.Core/Bindings/DocumentWrapper.cs +++ b/src/Docnet.Core/Bindings/DocumentWrapper.cs @@ -10,9 +10,6 @@ internal sealed class DocumentWrapper : IDisposable public FpdfDocumentT Instance { get; private set; } - private FPDF_FORMFILLINFO _formInfo; - private FpdfFormHandleT _formHandle; - public DocumentWrapper(string filePath, string password) { Instance = fpdf_view.FPDF_LoadDocument(filePath, password); @@ -47,30 +44,6 @@ public DocumentWrapper(FpdfDocumentT instance) } } - public FpdfFormHandleT GetFormHandle() - { - if (_formHandle != null) - { - return _formHandle; - } - - _formInfo = new FPDF_FORMFILLINFO(); - - for (var i = 1; i <= 2; i++) - { - _formInfo.version = i; - - _formHandle = fpdf_view.FPDFDOCInitFormFillEnvironment(Instance, _formInfo); - - if (_formHandle != null) - { - break; - } - } - - return _formHandle; - } - public void Dispose() { if (Instance == null) @@ -78,11 +51,6 @@ public void Dispose() return; } - if (_formHandle != null) - { - fpdf_view.FPDF_ExitFormFillEnvironment(_formHandle); - } - fpdf_view.FPDF_CloseDocument(Instance); Marshal.FreeHGlobal(_ptr); diff --git a/src/Docnet.Core/Bindings/FormWrapper.cs b/src/Docnet.Core/Bindings/FormWrapper.cs new file mode 100644 index 0000000..05fa611 --- /dev/null +++ b/src/Docnet.Core/Bindings/FormWrapper.cs @@ -0,0 +1,45 @@ +using System; +using System.Runtime.InteropServices; + +namespace Docnet.Core.Bindings +{ + internal sealed class FormWrapper : IDisposable + { + private readonly IntPtr _ptr; + + public FormWrapper(DocumentWrapper docWrapper) + { + var formInfo = new FPDF_FORMFILLINFO(); + + _ptr = Marshal.AllocHGlobal(Marshal.SizeOf(formInfo)); + + for (var i = 1; i <= 2; i++) + { + formInfo.version = i; + + Marshal.StructureToPtr(formInfo, _ptr, false); + + Instance = fpdf_view.FPDFDOCInitFormFillEnvironment(docWrapper.Instance, _ptr); + + if (Instance != null) + { + break; + } + } + } + + public FpdfFormHandleT Instance { get; private set; } + + public void Dispose() + { + if (Instance != null) + { + fpdf_view.FPDF_ExitFormFillEnvironment(Instance); + } + + Marshal.FreeHGlobal(_ptr); + + Instance = null; + } + } +} diff --git a/src/Docnet.Core/Bindings/PdfiumWrapper.cs b/src/Docnet.Core/Bindings/PdfiumWrapper.cs index f6bd34a..ab7c9e3 100644 --- a/src/Docnet.Core/Bindings/PdfiumWrapper.cs +++ b/src/Docnet.Core/Bindings/PdfiumWrapper.cs @@ -1833,7 +1833,7 @@ internal static extern IntPtr FPDF_LoadDocument( [SuppressUnmanagedCodeSecurity] [DllImport("pdfium", CallingConvention = CallingConvention.Cdecl, EntryPoint = "FPDFDOC_InitFormFillEnvironment")] - internal static extern IntPtr FPDFDOC_InitFormFillEnvironment(IntPtr document, FPDF_FORMFILLINFO formInfo); + internal static extern IntPtr FPDFDOC_InitFormFillEnvironment(IntPtr document, IntPtr formInfo); [SuppressUnmanagedCodeSecurity] [DllImport("pdfium", CallingConvention = CallingConvention.Cdecl, @@ -2325,7 +2325,7 @@ public static FpdfBitmapT FPDFBitmapCreate(int width, int height, int alpha) return __result0; } - public static FpdfFormHandleT FPDFDOCInitFormFillEnvironment(FpdfDocumentT document, FPDF_FORMFILLINFO formInfo) + public static FpdfFormHandleT FPDFDOCInitFormFillEnvironment(FpdfDocumentT document, IntPtr formInfo) { var __arg0 = ReferenceEquals(document, null) ? IntPtr.Zero : document.__Instance; diff --git a/src/Docnet.Core/Models/RenderFlags.cs b/src/Docnet.Core/Models/RenderFlags.cs index 3ca9a4e..a7a49b0 100644 --- a/src/Docnet.Core/Models/RenderFlags.cs +++ b/src/Docnet.Core/Models/RenderFlags.cs @@ -5,6 +5,7 @@ namespace Docnet.Core.Models [Flags] public enum RenderFlags { + None = 0x00, // None RenderAnnotations = 0x01, // FPDF_ANNOT: Set if annotations are to be rendered. OptimizeTextForLcd = 0x02, // FPDF_LCD_TEXT: Set if using text rendering optimized for LCD display. This flag will only take effect if anti-aliasing is enabled for text. NoNativeText = 0x04, // FPDF_NO_NATIVETEXT: Don't use the native text output available on some platforms diff --git a/src/Docnet.Core/Readers/PageReader.cs b/src/Docnet.Core/Readers/PageReader.cs index 236671e..b87dde5 100644 --- a/src/Docnet.Core/Readers/PageReader.cs +++ b/src/Docnet.Core/Readers/PageReader.cs @@ -233,6 +233,8 @@ private byte[] WriteImageToBufferInternal(RenderFlags flags, byte[] result = nul throw new DocnetException($"result array length should be greater or equal than {length}"); } + FormWrapper formWrapper = null; + try { // | | a b 0 | @@ -253,18 +255,16 @@ private byte[] WriteImageToBufferInternal(RenderFlags flags, byte[] result = nul clipping.Bottom = 0; clipping.Top = height; - FpdfFormHandleT formHandle = null; - if (flags.HasFlag(RenderFlags.RenderAnnotations)) { - formHandle = _docWrapper.GetFormHandle(); + formWrapper = new FormWrapper(_docWrapper); } fpdf_view.FPDF_RenderPageBitmapWithMatrix(bitmap, _page, matrix, clipping, (int)flags); - if (flags.HasFlag(RenderFlags.RenderAnnotations) && formHandle != null) + if (flags.HasFlag(RenderFlags.RenderAnnotations) && formWrapper?.Instance != null) { - fpdf_view.FPDFFFLDraw(formHandle, bitmap, _page, 0, 0, width, height, PageRotate.Normal, flags); + fpdf_view.FPDFFFLDraw(formWrapper.Instance, bitmap, _page, 0, 0, width, height, PageRotate.Normal, flags); } var buffer = fpdf_view.FPDFBitmapGetBuffer(bitmap); @@ -278,6 +278,8 @@ private byte[] WriteImageToBufferInternal(RenderFlags flags, byte[] result = nul } finally { + formWrapper?.Dispose(); + fpdf_view.FPDFBitmapDestroy(bitmap); } } diff --git a/src/Docnet.Tests.Integration/Docs/annotation_1.pdf b/src/Docnet.Tests.Integration/Docs/annotation_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2defdf652bb97d6490571e65e03d696ce39cd9a8 GIT binary patch literal 21276 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 literal 0 HcmV?d00001 diff --git a/src/Docnet.Tests.Integration/Docs/simple_7.pdf b/src/Docnet.Tests.Integration/Docs/simple_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..77bff86f82bf95354cc512d8e0aa201e4de40a08 GIT binary patch literal 32155 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 { + if (pageReader == null) + { + throw new ArgumentNullException(nameof(pageReader)); + } + Assert.Equal(index, pageReader.PageIndex); }); } @@ -409,6 +415,63 @@ public void WriteImageToBufferWithResultFromArrayPoolNoRenderFlags_WhenCalled_Sh }); } + [Theory] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 0)] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 1)] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 2)] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 3)] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 4)] + [InlineData(RenderFlags.RenderAnnotations, "Docs/annotation_1.pdf", null, 0, 5)] + public void Parallel_GetImage_WhenCalledWithFlags_ShouldWork(RenderFlags flags, string filePath, string password, int pageIndex, int run) + { + var numbers = Enumerable.Range(1, 1000); + + Parallel.ForEach(numbers, i => + { + ExecuteForDocument(Input.FromFile, filePath, password, 1, pageIndex, pageReader => + { + var bytes = pageReader.GetImage(flags).ToArray(); + + Assert.NotEmpty(bytes); + + // WriteToPPM($"{run}_{i}_image", bytes, pageReader.GetPageHeight(), pageReader.GetPageWidth()); + }); + }); + } + + /// + /// BGRA data to PPM file + /// Alpha channel discarded + /// https://netpbm.sourceforge.net/doc/ppm.html + /// + private static void WriteToPPM(string fileName, byte[] data, int height, int width) + { + fileName = $"{fileName}.ppm"; + + using (var writer = new StreamWriter(fileName)) + { + writer.WriteLine("P6"); + writer.WriteLine($"{width} {height}"); + writer.WriteLine("255"); + } + + using var writerB = new BinaryWriter(new FileStream(fileName, FileMode.Append)); + + for (var i = 0; i < data.Length / 4; i++) + { + var j = i * 4; + + var blue = data[j]; + var green = data[j + 1]; + var red = data[j + 2]; + var alpha = data[j + 3]; + + writerB.Write((byte)((green * alpha + byte.MaxValue * (255 - alpha)) >> 8)); // G + writerB.Write((byte)((blue * alpha + byte.MaxValue * (255 - alpha)) >> 8)); // B + writerB.Write((byte)((red * alpha + byte.MaxValue * (255 - alpha)) >> 8)); // R + } + } + private static int GetNonZeroByteCount(Input type, string filePath, LibFixture fixture) { using (var reader = fixture.GetDocReader(type, filePath, null, 1000, 1000))