allow indirect references in xref streams as an attempt to fix #457

This commit is contained in:
Eliot Jones 2022-05-29 16:26:56 -04:00
parent 559f3af5f3
commit b5d90d1725
4 changed files with 13 additions and 8 deletions

View File

@ -1,11 +1,11 @@
namespace UglyToad.PdfPig.Filters
{
using Core;
using System;
using System.Collections.Generic;
using System.Linq;
using Core;
using Tokens;
using UglyToad.PdfPig.Util;
using Util;
/// <inheritdoc />
/// <summary>

View File

@ -269,7 +269,7 @@
return false;
}
xrefTablePart = crossReferenceStreamParser.Parse(objByteOffset, fromTableAtOffset, objectStream);
xrefTablePart = crossReferenceStreamParser.Parse(objByteOffset, fromTableAtOffset, objectStream, pdfScanner);
return true;
}

View File

@ -4,6 +4,7 @@
using Core;
using Filters;
using PdfPig.CrossReference;
using Tokenization.Scanner;
using Tokens;
using Util;
@ -19,9 +20,9 @@
/// <summary>
/// Parses through the unfiltered stream and populates the xrefTable HashMap.
/// </summary>
public CrossReferenceTablePart Parse(long streamOffset, long? fromTableAtOffset, StreamToken stream)
public CrossReferenceTablePart Parse(long streamOffset, long? fromTableAtOffset, StreamToken stream, IPdfTokenScanner pdfTokenScanner)
{
var decoded = stream.Decode(filterProvider);
var decoded = stream.DecodeWithLookup(filterProvider, pdfTokenScanner);
var fieldSizes = new CrossReferenceStreamFieldSize(stream.StreamDictionary);

View File

@ -45,14 +45,18 @@
}
return typedToken;
}
}
/// <summary>
/// Get the decoded data from this stream.
/// </summary>
public static IReadOnlyList<byte> Decode(this StreamToken stream, IFilterProvider filterProvider)
=> DecodeWithLookup(stream, filterProvider, null);
internal static IReadOnlyList<byte> DecodeWithLookup(this StreamToken stream, IFilterProvider filterProvider, IPdfTokenScanner pdfTokenScanner)
{
var filters = filterProvider.GetFilters(stream.StreamDictionary);
var filters = pdfTokenScanner != null
? new FilterProviderWithLookup(filterProvider).GetFilters(stream.StreamDictionary, pdfTokenScanner)
: filterProvider.GetFilters(stream.StreamDictionary);
var transform = stream.Data;
for (var i = 0; i < filters.Count; i++)