Class MemoryLimitsAwareHandler

java.lang.Object
com.itextpdf.kernel.pdf.MemoryLimitsAwareHandler

public class MemoryLimitsAwareHandler extends Object
Enforces configurable limits intended to protect PDF reading/parsing against excessive memory consumption.

The handler is primarily used during decoding (decompression) of PDF streams, but also guards against other potentially unbounded structures during reading, e.g. cross-reference (xref) table growth and per-page XObject usage.

How it is configured

A configured handler can be set on ReaderProperties and will be used by PdfReader when opening a document.

Note that MemoryLimitsAwareHandler must not be shared between different PdfDocument instances.

See Also:
  • Constructor Details

    • MemoryLimitsAwareHandler

      public MemoryLimitsAwareHandler()
      Creates a MemoryLimitsAwareHandler to handle decompression of PDF streams and other memory-related limits during reading.
    • MemoryLimitsAwareHandler

      public MemoryLimitsAwareHandler (long documentSize)
      Creates a MemoryLimitsAwareHandler with calculated memory limits for decompression and xref structures based on the provided document size.
      Parameters:
      documentSize - the size of the document (in bytes)
  • Method Details

    • createNewInstance

      public MemoryLimitsAwareHandler createNewInstance()
      Creates a new instance of MemoryLimitsAwareHandler by copying settings from this instance of MemoryLimitsAwareHandler.
      Returns:
      a new instance of MemoryLimitsAwareHandler
    • getMaxSizeOfSingleDecompressedPdfStream

      public int getMaxSizeOfSingleDecompressedPdfStream()
      Returns the maximum allowed size (in bytes) of a single decompressed PDF stream.
      Returns:
      maximum allowed size of a single decompressed stream in bytes
    • setMaxSizeOfSingleDecompressedPdfStream

      public MemoryLimitsAwareHandler setMaxSizeOfSingleDecompressedPdfStream (int maxSizeOfSingleDecompressedPdfStream)
      Sets the maximum allowed size which can be occupied by a single decompressed PDF stream. This value correlates with maximum heap size. This value should not exceed limit of the heap size.

      iText will throw an exception if during decompression a PDF stream which was identified as requiring memory limits awareness occupies more memory than allowed.

      Parameters:
      maxSizeOfSingleDecompressedPdfStream - the maximum allowed size which can be occupied by a single decompressed PDF stream
      Returns:
      this MemoryLimitsAwareHandler instance
      See Also:
    • getMaxSizeOfDecompressedPdfStreamsSum

      public long getMaxSizeOfDecompressedPdfStreamsSum()
      Gets the maximum allowed size which can be occupied by all decompressed PDF streams.
      Returns:
      the maximum allowed size value which streams may occupy
    • setMaxSizeOfDecompressedPdfStreamsSum

      public MemoryLimitsAwareHandler setMaxSizeOfDecompressedPdfStreamsSum (long maxSizeOfDecompressedPdfStreamsSum)
      Sets the maximum allowed size which can be occupied by all decompressed PDF streams. This value can be limited by the maximum expected PDF file size when it's completely decompressed. Setting this value correlates with the maximum processing time spent on document reading

      iText will throw an exception if during decompression of PDF streams which were identified as requiring memory limits awareness occupy more memory than allowed.

      Note that if a PDF stream is decompressed multiple times, it is counted multiple times for this limit.

      Parameters:
      maxSizeOfDecompressedPdfStreamsSum - he maximum allowed size which can be occupied by all decompressed PDF streams
      Returns:
      this MemoryLimitsAwareHandler instance
      See Also:
    • isMemoryLimitsAwarenessRequiredOnDecompression

      @Deprecated public boolean isMemoryLimitsAwarenessRequiredOnDecompression (PdfArray filters)
      Deprecated.
      to be made protected and accept stream dictionary instead of PdfArray of filters
      Performs a check if the PdfStream with provided setup of the filters requires memory limits awareness during decompression.
      Parameters:
      filters - is an PdfArray of names of filters
      Returns:
      true if PDF stream is suspicious and false otherwise
    • getMaxNumberOfElementsInXrefStructure

      public int getMaxNumberOfElementsInXrefStructure()
      Gets maximum number of elements in xref structure.
      Returns:
      maximum number of elements in xref structure
    • getMaxXObjectsSizePerPage

      @Deprecated public long getMaxXObjectsSizePerPage()
      Gets maximum page size.
      Returns:
      maximum page size
    • setMaxXObjectsSizePerPage

      @Deprecated public void setMaxXObjectsSizePerPage (long maxPageSize)
      Sets maximum page size.
      Parameters:
      maxPageSize - maximum page size
    • setMaxNumberOfElementsInXrefStructure

      public void setMaxNumberOfElementsInXrefStructure (int maxNumberOfElementsInXrefStructure)
      Sets maximum number of elements in xref structure.
      Parameters:
      maxNumberOfElementsInXrefStructure - maximum number of elements in xref structure
    • checkIfXrefStructureExceedsTheLimit

      public void checkIfXrefStructureExceedsTheLimit (int requestedCapacity)
      Performs a check of possible extension of xref structure.
      Parameters:
      requestedCapacity - capacity to which we need to expand xref array
    • checkIfPageSizeExceedsTheLimit

      @Deprecated public void checkIfPageSizeExceedsTheLimit (long totalPageSize)
      Deprecated.
      in favor of setMaxSizeOfDecompressedPdfStreamsSum(long). Also get rid of its usage in PdfCanvasProcessor
      Checks if page size limit is exceeded.
      Parameters:
      totalPageSize - total size of the read page content
    • calculateMaxElementsInXref

      protected static int calculateMaxElementsInXref (long documentSizeInBytes)
      Calculate max number of elements allowed in xref table based on the size of the document, achieving max limit at 100MB.
      Parameters:
      documentSizeInBytes - document size in bytes
      Returns:
      calculated limit