Optimize cross reference object offset validation by avoiding nested loop

* Optimize cross reference object offset validation by avoiding nested loops

* Address https://github.com/UglyToad/PdfPig/pull/935#discussion_r1839585652
This commit is contained in:
madelson 2024-11-13 14:47:50 -05:00 committed by GitHub
parent 132ada7fac
commit 8ca539942d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 16 additions and 15 deletions

View File

@ -6,7 +6,7 @@
/// <summary>
/// Used to uniquely identify and refer to objects in the PDF file.
/// </summary>
public readonly struct IndirectReference
public readonly struct IndirectReference : IEquatable<IndirectReference>
{
/// <summary>
/// A positive integer object number.
@ -30,16 +30,16 @@
Generation = generation;
}
/// <inheritdoc />
public bool Equals(IndirectReference other)
{
return other.ObjectNumber == ObjectNumber && other.Generation == Generation;
}
/// <inheritdoc />
public override bool Equals(object obj)
{
if (obj is IndirectReference reference)
{
return reference.ObjectNumber == ObjectNumber
&& reference.Generation == Generation;
}
return false;
return obj is IndirectReference other && Equals(other);
}
/// <inheritdoc />

View File

@ -49,7 +49,7 @@
Trailer = trailer ?? throw new ArgumentNullException(nameof(trailer));
CrossReferenceOffsets = crossReferenceOffsets ?? throw new ArgumentNullException(nameof(crossReferenceOffsets));
var result = new Dictionary<IndirectReference, long>();
var result = new Dictionary<IndirectReference, long>(capacity: objectOffsets.Count);
foreach (var objectOffset in objectOffsets)
{
result[objectOffset.Key] = objectOffset.Value;

View File

@ -24,11 +24,12 @@
return true;
}
var builderOffsets = new Dictionary<IndirectReference, long>();
var bruteForceOffsets = BruteForceSearcher.GetObjectLocations(bytes);
if (bruteForceOffsets.Count > 0)
{
// Pre-allocate capacity for at least the bruteForceOffsets, since we'll be adding all of them
var builderOffsets = new Dictionary<IndirectReference, long>(bruteForceOffsets.Count);
// find all object streams
foreach (var entry in crossReferenceTable.ObjectOffsets)
{
@ -39,11 +40,11 @@
// TODO: more validation of streams.
builderOffsets[entry.Key] = entry.Value;
}
}
foreach (var item in bruteForceOffsets)
{
builderOffsets[item.Key] = item.Value;
}
foreach (var item in bruteForceOffsets)
{
builderOffsets[item.Key] = item.Value;
}
actualOffsets = builderOffsets;