mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-04-05 20:55:01 +08:00
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:
parent
132ada7fac
commit
8ca539942d
@ -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 />
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user