Consolidate DictionaryToken extension methods

This commit is contained in:
Kasper Frank
2021-05-07 12:55:36 +02:00
parent f8990a79b8
commit 65a4c141ba
7 changed files with 76 additions and 78 deletions

View File

@@ -5,6 +5,7 @@
using System.IO;
using System.Linq;
using Tokens;
using UglyToad.PdfPig.Util;
/// <summary>
/// Decodes image data that has been encoded using either Group 3 or Group 4.
@@ -21,9 +22,9 @@
{
var decodeParms = DecodeParameterResolver.GetFilterParameters(streamDictionary, filterIndex);
var cols = decodeParms.GetInt(NameToken.Columns, 1728);
var rows = decodeParms.GetInt(NameToken.Rows, 0);
var height = streamDictionary.GetInt(NameToken.Height, NameToken.H, 0);
var cols = decodeParms.GetIntOrDefault(NameToken.Columns, 1728);
var rows = decodeParms.GetIntOrDefault(NameToken.Rows, 0);
var height = streamDictionary.GetIntOrDefault(NameToken.Height, NameToken.H, 0);
if (rows > 0 && height > 0)
{
// PDFBOX-771, PDFBOX-3727: rows in DecodeParms sometimes contains an incorrect value
@@ -35,8 +36,8 @@
rows = Math.Max(rows, height);
}
var k = decodeParms.GetInt(NameToken.K, 0);
var encodedByteAlign = decodeParms.GetBoolean(NameToken.EncodedByteAlign, false);
var k = decodeParms.GetIntOrDefault(NameToken.K, 0);
var encodedByteAlign = decodeParms.GetBooleanOrDefault(NameToken.EncodedByteAlign, false);
var compressionType = DetermineCompressionType(input, k);
using (var stream = new CcittFaxDecoderStream(new MemoryStream(input.ToArray()), cols, compressionType, encodedByteAlign))
{
@@ -45,7 +46,7 @@
ReadFromDecoderStream(stream, decompressed);
// we expect black to be 1, if not invert the bitmap
var blackIsOne = decodeParms.GetBoolean(NameToken.BlackIs1, false);
var blackIsOne = decodeParms.GetBooleanOrDefault(NameToken.BlackIs1, false);
if (!blackIsOne)
{
InvertBitmap(decompressed);

View File

@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using Tokens;
using UglyToad.PdfPig.Util;
internal static class DecodeParameterResolver
{
@@ -18,9 +19,9 @@
throw new ArgumentOutOfRangeException(nameof(index), "Index must be 0 or greater");
}
var filter = streamDictionary.GetDictionaryObject(NameToken.Filter, NameToken.F);
var filter = streamDictionary.GetObjectOrDefault(NameToken.Filter, NameToken.F);
var parameters = streamDictionary.GetDictionaryObject(NameToken.DecodeParms, NameToken.Dp);
var parameters = streamDictionary.GetObjectOrDefault(NameToken.DecodeParms, NameToken.Dp);
switch (filter)
{

View File

@@ -5,6 +5,7 @@
using System.Linq;
using Core;
using Tokens;
using UglyToad.PdfPig.Util;
/// <inheritdoc />
/// <summary>
@@ -60,7 +61,7 @@
throw new ArgumentNullException(nameof(dictionary));
}
var token = dictionary.GetDictionaryObject(NameToken.Filter, NameToken.F);
var token = dictionary.GetObjectOrDefault(NameToken.Filter, NameToken.F);
if (token == null)
{
return EmptyArray<IFilter>.Instance;

View File

@@ -7,6 +7,7 @@
using Parser.Parts;
using Tokenization.Scanner;
using Tokens;
using UglyToad.PdfPig.Util;
internal class FilterProviderWithLookup : ILookupFilterProvider
{
@@ -33,7 +34,7 @@
throw new ArgumentNullException(nameof(dictionary));
}
var token = dictionary.GetDictionaryObject(NameToken.Filter, NameToken.F);
var token = dictionary.GetObjectOrDefault(NameToken.Filter, NameToken.F);
if (token == null)
{
return EmptyArray<IFilter>.Instance;

View File

@@ -47,49 +47,6 @@
return typedToken;
}
internal static IToken GetDictionaryObject(this DictionaryToken dictionary, NameToken name)
{
if (dictionary.TryGet(name, out var token))
{
return token;
}
return null;
}
internal static IToken GetDictionaryObject(this DictionaryToken dictionary, NameToken first, NameToken second)
{
if (dictionary.TryGet(first, out var token))
{
return token;
}
if (dictionary.TryGet(second, out token))
{
return token;
}
return null;
}
internal static int GetInt(this DictionaryToken dictionary, NameToken name, int defaultValue)
{
var numericToken = dictionary.GetDictionaryObject(name) as NumericToken;
return numericToken?.Int ?? defaultValue;
}
internal static int GetInt(this DictionaryToken dictionary, NameToken first, NameToken second, int defaultValue)
{
var numericToken = dictionary.GetDictionaryObject(first, second) as NumericToken;
return numericToken?.Int ?? defaultValue;
}
internal static bool GetBoolean(this DictionaryToken dictionary, NameToken name, bool defaultValue)
{
var booleanToken = dictionary.GetDictionaryObject(name) as BooleanToken;
return booleanToken?.Data ?? defaultValue;
}
/// <summary>
/// Get the decoded data from this stream.
/// </summary>

View File

@@ -75,9 +75,9 @@
ILookupFilterProvider filterProvider,
bool cannotRecurse = false)
{
if (imageDictionary.GetDictionaryObject(NameToken.ImageMask, NameToken.Im) != null)
if (imageDictionary.GetObjectOrDefault(NameToken.ImageMask, NameToken.Im) != null)
{
var decodeRaw = imageDictionary.GetDictionaryObject(NameToken.Decode, NameToken.D) as ArrayToken
var decodeRaw = imageDictionary.GetObjectOrDefault(NameToken.Decode, NameToken.D) as ArrayToken
?? new ArrayToken(EmptyArray<IToken>.Instance);
var decode = decodeRaw.Data.OfType<NumericToken>().Select(x => x.Data).ToArray();
return IndexedColorSpaceDetails.Stencil(decode);

View File

@@ -9,6 +9,33 @@
internal static class DictionaryTokenExtensions
{
[CanBeNull]
public static IToken GetObjectOrDefault(this DictionaryToken token, NameToken name)
{
if (token.TryGet(name, out var obj))
{
return obj;
}
return null;
}
[CanBeNull]
public static IToken GetObjectOrDefault(this DictionaryToken token, NameToken first, NameToken second)
{
if (token.TryGet(first, out var obj))
{
return obj;
}
if (token.TryGet(second, out obj))
{
return obj;
}
return null;
}
public static int GetInt(this DictionaryToken token, NameToken name)
{
if (token == null)
@@ -16,12 +43,9 @@
throw new ArgumentNullException(nameof(token));
}
if (!token.TryGet(name, out var keyedToken) || !(keyedToken is NumericToken numeric))
{
throw new PdfDocumentFormatException($"The dictionary did not contain a number with the key {name}. Dictionary way: {token}.");
}
var numeric = token.GetObjectOrDefault(name) as NumericToken;
return numeric.Int;
return numeric?.Int ?? throw new PdfDocumentFormatException($"The dictionary did not contain a number with the key {name}. Dictionary way: {token}.");
}
public static int GetIntOrDefault(this DictionaryToken token, NameToken name, int defaultValue = 0)
@@ -31,12 +55,21 @@
throw new ArgumentNullException(nameof(token));
}
if (!token.TryGet(name, out var keyedToken) || !(keyedToken is NumericToken numeric))
var numeric = token.GetObjectOrDefault(name) as NumericToken;
return numeric?.Int ?? defaultValue;
}
public static int GetIntOrDefault(this DictionaryToken token, NameToken first, NameToken second, int defaultValue = 0)
{
if (token == null)
{
return defaultValue;
throw new ArgumentNullException(nameof(token));
}
return numeric.Int;
var numeric = token.GetObjectOrDefault(first, second) as NumericToken;
return numeric?.Int ?? default;
}
public static long? GetLongOrDefault(this DictionaryToken token, NameToken name)
@@ -46,12 +79,21 @@
throw new ArgumentNullException(nameof(token));
}
if (!token.TryGet(name, out var keyedToken) || !(keyedToken is NumericToken numeric))
var numeric = token.GetObjectOrDefault(name) as NumericToken;
return numeric?.Long;
}
public static bool GetBooleanOrDefault(this DictionaryToken token, NameToken name, bool defaultValue)
{
if (token == null)
{
return null;
throw new ArgumentNullException(nameof(token));
}
return numeric.Long;
var boolean = token.GetObjectOrDefault(name) as BooleanToken;
return boolean?.Data ?? defaultValue;
}
[CanBeNull]
@@ -62,12 +104,7 @@
throw new ArgumentNullException(nameof(token));
}
if (!token.TryGet(name, out var nameToken) || !(nameToken is NameToken result))
{
return null;
}
return result;
return token.GetObjectOrDefault(name) as NameToken;
}
public static bool TryGetOptionalTokenDirect<T>(this DictionaryToken token, NameToken name, IPdfTokenScanner scanner, out T result) where T : IToken