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 namespace UglyToad.PdfPig.Filters
{ {
using Core;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Core;
using Tokens; using Tokens;
using UglyToad.PdfPig.Util; using Util;
/// <inheritdoc /> /// <inheritdoc />
/// <summary> /// <summary>

View File

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

View File

@ -4,6 +4,7 @@
using Core; using Core;
using Filters; using Filters;
using PdfPig.CrossReference; using PdfPig.CrossReference;
using Tokenization.Scanner;
using Tokens; using Tokens;
using Util; using Util;
@ -19,9 +20,9 @@
/// <summary> /// <summary>
/// Parses through the unfiltered stream and populates the xrefTable HashMap. /// Parses through the unfiltered stream and populates the xrefTable HashMap.
/// </summary> /// </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); var fieldSizes = new CrossReferenceStreamFieldSize(stream.StreamDictionary);

View File

@ -51,8 +51,12 @@
/// Get the decoded data from this stream. /// Get the decoded data from this stream.
/// </summary> /// </summary>
public static IReadOnlyList<byte> Decode(this StreamToken stream, IFilterProvider filterProvider) 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; var transform = stream.Data;
for (var i = 0; i < filters.Count; i++) for (var i = 0; i < filters.Count; i++)