o
    @@i#                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl	mZ ddl	mZ dd	l	mZ dd
l	mZ ddlmZ G dd deZdS )z
    Beginning with PDF 1.5, cross-reference information may be stored in a cross-reference stream instead of in a
    cross-reference table.
    N)Decimal)decode_stream)HighLevelTokenizer)
Dictionary)List)Name)	Reference)Stream)XREFc                	       sd   e Zd ZdZddeje f fddZ	ddeje	j
e	je	jf dedeje dd	fd
dZ  ZS )
StreamXREFu  
    Beginning with PDF 1.5, cross-reference information may be stored in a cross-reference stream instead of in a
    cross-reference table. Cross-reference streams provide the following advantages:
    • A more compact representation of cross-reference information
    • The ability to access compressed objects that are stored in object streams (see 7.5.7, "Object Streams")
    and to allow new cross-reference entry types to be added in the future
    Cross-reference streams are stream objects (see 7.3.8, "Stream Objects"), and contain a dictionary and a data
    stream. Each cross-reference stream contains the information equivalent to the cross-reference table
     (see 7.5.4, "Cross-Reference Table") and trailer (see 7.5.5, "File Trailer") for one cross-reference section.
    Ninitial_offsetc                    s   t    || _d S N)super__init___initial_offset)selfr   	__class__ W/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/borb/pdf/xref/stream_xref.pyr   &   s   

zStreamXREF.__init__	io_source	tokenizerreturnr
   c              	      s  |dur
| | n| || | ttsJ dv s!J tfddtdtd D s5J fddtdtd D }t|}| 	 }t
ddd|d	g}d
v s\J td
 tseJ td
 }g }	dv rd }	t|	ts|J t|	d dksJ t|	d tsJ t|	d tsJ ntdt|g}	td }
tdt|	dD ]}t|	| }t|	|d  }d}td|D ]}||  d}|d dkrd}td|d D ]}|d> |
| d@  }|d7 }qd}td|d D ]}|d> |
| d@  }|d7 }qd}td|d D ]}|d> |
| d@  }|d7 }q|dv s-J d}|dkr=t
| ||dd}|dkrJt
| ||d}|dkrXt
| d||d}|dus_J tt fdd|D d}|duo{|jo{|j|jk}|du p| o|jdu }|r|dusJ || q|r|dusJ |dusJ |j|_|j|_qq|D ]}| | qt | td<  D ]\}}|| td |< q| td |  | S )z
        This method attempts to read a stream XREF from the given io_source.
        It will either throw an exception, or return this XREF
        NWc                    s   g | ]}t  d  | tqS r   )
isinstancer   .0xxref_streamr   r   
<listcomp>H   s    z#StreamXREF.read.<locals>.<listcomp>r   c                    s   g | ]
}t  d  | qS r   )intr   r   r   r   r!   N   s    i  F)object_numbergeneration_number	is_in_usedocumentSizeIndex      DecodedBytes      )r   r*   r)   )r&   r#   byte_offsetr$   r%   )r&   r#   r.   r$   )r&   r#   r$   parent_stream_object_numberindex_in_parent_streamc                    s(   g | ]}|j d ur|j t kr|qS r   )r#   r   r   )r#   r   r   r!      s    
Trailer)seek_seek_to_xref_tokenread_objectr   r	   allrangelensumget_rootr   r   r"   r   r   nextiterr%   r$   r&   appendr0   r/   addr   r   items
set_parent)r   r   r   r   widthstotal_entry_widthr&   indirect_referencesnumber_of_objectsindexxref_stream_decoded_bytesidxstartlengthbptritypejfield2field3pdf_indirect_referenceexisting_indirect_refref_is_in_reading_stateref_is_first_encounteredrkvr   )r#   r    r   read2   s   
 








nzStreamXREF.readr   )__name__
__module____qualname____doc__typingOptionalr"   r   UnionioBufferedIOBase	RawIOBaseBytesIOr   rV   __classcell__r   r   r   r   r      s    r   )rZ   r^   r[   decimalr   !borb.io.filter.stream_decode_utilr   *borb.io.read.tokenize.high_level_tokenizerr   borb.io.read.typesr   r   r   r   r	   borb.pdf.xref.xrefr
   r   r   r   r   r   <module>   s   