mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-09-20 20:07:57 +08:00
#55 move support for images to page and add inline images
support both xobject and inline images. adds unsupported filters so that exceptions are only thrown when accessing lazily evaluated image.bytes property rather than when opening the page. treat all warnings as errors.
This commit is contained in:
18
src/UglyToad.PdfPig/Tokenization/Scanner/IPdfTokenScanner.cs
Normal file
18
src/UglyToad.PdfPig/Tokenization/Scanner/IPdfTokenScanner.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
namespace UglyToad.PdfPig.Tokenization.Scanner
|
||||
{
|
||||
using System;
|
||||
using Tokens;
|
||||
|
||||
/// <summary>
|
||||
/// Tokenizes objects from bytes in a PDF file.
|
||||
/// </summary>
|
||||
internal interface IPdfTokenScanner : ISeekableTokenScanner, IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// Tokenize the object with a given object number.
|
||||
/// </summary>
|
||||
/// <param name="reference">The object number for the object to tokenize.</param>
|
||||
/// <returns>The tokenized object.</returns>
|
||||
ObjectToken Get(IndirectReference reference);
|
||||
}
|
||||
}
|
@@ -13,19 +13,6 @@
|
||||
using Parser.Parts;
|
||||
using Tokens;
|
||||
|
||||
/// <summary>
|
||||
/// Tokenizes objects from bytes in a PDF file.
|
||||
/// </summary>
|
||||
internal interface IPdfTokenScanner : ISeekableTokenScanner
|
||||
{
|
||||
/// <summary>
|
||||
/// Tokenize the object with a given object number.
|
||||
/// </summary>
|
||||
/// <param name="reference">The object number for the object to tokenize.</param>
|
||||
/// <returns>The tokenized object.</returns>
|
||||
ObjectToken Get(IndirectReference reference);
|
||||
}
|
||||
|
||||
internal class PdfTokenScanner : IPdfTokenScanner
|
||||
{
|
||||
private static readonly byte[] EndstreamBytes =
|
||||
@@ -41,6 +28,7 @@
|
||||
private readonly CoreTokenScanner coreTokenScanner;
|
||||
|
||||
private IEncryptionHandler encryptionHandler;
|
||||
private bool isDisposed;
|
||||
|
||||
/// <summary>
|
||||
/// Stores tokens encountered between obj - endobj markers for each <see cref="MoveNext"/> call.
|
||||
@@ -75,6 +63,11 @@
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
// Read until we find object-number generation obj, e.g. "69 420 obj".
|
||||
int tokensRead = 0;
|
||||
while (coreTokenScanner.MoveNext() && !Equals(coreTokenScanner.CurrentToken, OperatorToken.StartObject))
|
||||
@@ -576,26 +569,51 @@
|
||||
|
||||
public bool TryReadToken<T>(out T token) where T : class, IToken
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
return coreTokenScanner.TryReadToken(out token);
|
||||
}
|
||||
|
||||
public void Seek(long position)
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
coreTokenScanner.Seek(position);
|
||||
}
|
||||
|
||||
public void RegisterCustomTokenizer(byte firstByte, ITokenizer tokenizer)
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
coreTokenScanner.RegisterCustomTokenizer(firstByte, tokenizer);
|
||||
}
|
||||
|
||||
public void DeregisterCustomTokenizer(ITokenizer tokenizer)
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
coreTokenScanner.DeregisterCustomTokenizer(tokenizer);
|
||||
}
|
||||
|
||||
public ObjectToken Get(IndirectReference reference)
|
||||
{
|
||||
if (isDisposed)
|
||||
{
|
||||
throw new ObjectDisposedException(nameof(PdfTokenScanner));
|
||||
}
|
||||
|
||||
if (objectLocationProvider.TryGetCached(reference, out var objectToken))
|
||||
{
|
||||
return objectToken;
|
||||
@@ -717,5 +735,11 @@
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
inputBytes?.Dispose();
|
||||
isDisposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user