From 5c091aeba7fc335035ce3326cff578cf4faf65d4 Mon Sep 17 00:00:00 2001 From: Eliot Jones Date: Mon, 21 Jan 2019 18:34:24 +0000 Subject: [PATCH] #29 skip mediaboxes or cropboxes with the wrong dimensions and log an error. --- src/UglyToad.PdfPig/Parser/PageFactory.cs | 26 +++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/UglyToad.PdfPig/Parser/PageFactory.cs b/src/UglyToad.PdfPig/Parser/PageFactory.cs index 9bb850a1..dc395839 100644 --- a/src/UglyToad.PdfPig/Parser/PageFactory.cs +++ b/src/UglyToad.PdfPig/Parser/PageFactory.cs @@ -53,8 +53,8 @@ throw new InvalidOperationException($"Page {number} had its type specified as {type} rather than 'Page'."); } - MediaBox mediaBox = GetMediaBox(number, dictionary, pageTreeMembers, isLenientParsing); - CropBox cropBox = GetCropBox(dictionary, pageTreeMembers, mediaBox); + MediaBox mediaBox = GetMediaBox(number, dictionary, pageTreeMembers, log, isLenientParsing); + CropBox cropBox = GetCropBox(dictionary, pageTreeMembers, mediaBox, log, isLenientParsing); UserSpaceUnit userSpaceUnit = GetUserSpaceUnits(dictionary); @@ -128,11 +128,20 @@ return spaceUnits; } - private static CropBox GetCropBox(DictionaryToken dictionary, PageTreeMembers pageTreeMembers, MediaBox mediaBox) + private static CropBox GetCropBox(DictionaryToken dictionary, PageTreeMembers pageTreeMembers, MediaBox mediaBox, ILog log, bool isLenientParsing) { CropBox cropBox; if (dictionary.TryGet(NameToken.CropBox, out var cropBoxObject) && cropBoxObject is ArrayToken cropBoxArray) { + if (cropBoxArray.Length != 4 && isLenientParsing) + { + log.Error($"The CropBox was the wrong length in the dictionary: {dictionary}. Array was: {cropBoxArray}."); + + cropBox = new CropBox(mediaBox.Bounds); + + return cropBox; + } + cropBox = new CropBox(cropBoxArray.ToIntRectangle()); } else @@ -143,11 +152,20 @@ return cropBox; } - private static MediaBox GetMediaBox(int number, DictionaryToken dictionary, PageTreeMembers pageTreeMembers, bool isLenientParsing) + private static MediaBox GetMediaBox(int number, DictionaryToken dictionary, PageTreeMembers pageTreeMembers, ILog log, bool isLenientParsing) { MediaBox mediaBox; if (dictionary.TryGet(NameToken.MediaBox, out var mediaboxObject) && mediaboxObject is ArrayToken mediaboxArray) { + if (mediaboxArray.Length != 4 && isLenientParsing) + { + log.Error($"The MediaBox was the wrong length in the dictionary: {dictionary}. Array was: {mediaboxArray}."); + + mediaBox = MediaBox.A4; + + return mediaBox; + } + mediaBox = new MediaBox(mediaboxArray.ToIntRectangle()); } else