
    є j!              	       2   d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZ ded	efd
Zded	efdZded	efdZded	efdZdeded	efdZdeded	efdZdededed	dfdZdededed	dfdZdeded	eee         ee         f         fdZdS )u  
Page labels are shown by PDF viewers as "the page number".

A page has a numeric index, starting at 0. Additionally, the page
has a label. In the most simple case:

    label = index + 1

However, the title page and the table of contents might have Roman numerals as
page labels. This makes things more complicated.

Example 1
---------

>>> reader.root_object["/PageLabels"]["/Nums"]
[0, IndirectObject(18, 0, 139929798197504),
 8, IndirectObject(19, 0, 139929798197504)]
>>> reader.get_object(reader.root_object["/PageLabels"]["/Nums"][1])
{'/S': '/r'}
>>> reader.get_object(reader.root_object["/PageLabels"]["/Nums"][3])
{'/S': '/D'}

Example 2
---------
The following is a document with pages labeled
i, ii, iii, iv, 1, 2, 3, A-8, A-9, ...

1 0 obj
    << /Type /Catalog
       /PageLabels << /Nums [
                        0 << /S /r >>
                        4 << /S /D >>
                        7 << /S /D
                             /P ( A- )
                             /St 8
                        >>
                        % A number tree containing
                        % three page label dictionaries
                        ]
                   >>
    ...
    >>
endobj


§12.4.2 PDF Specification 1.7 and 2.0
=====================================

Entries in a page label dictionary
----------------------------------
The /S key:
D       Decimal Arabic numerals
R       Uppercase Roman numerals
r       Lowercase Roman numerals
A       Uppercase letters (A to Z for the first 26 pages,
                           AA to ZZ for the next 26, and so on)
a       Lowercase letters (a to z for the first 26 pages,
                           aa to zz for the next 26, and so on)
    )CallableIterator)Optionalcast   )PdfCommonDocProtocol)logger_warning)ArrayObjectDictionaryObject
NullObjectNumberObjectis_null_or_nonenumreturnc                     g ddt           dt          t                   ffd}d                    t	           ||                               S )N))i  M)i  CM)i  D)i  CD)d   C)Z   XC)2   L)(   XL)
   X)	   IX)   V)   IV)r   Ir   r   c              3   r   K   D ]0\  }}t          | |          \  }}||z  V  | ||z  z  } | dk    r d S 1d S )Nr   )divmod)r   decimal
roman_reprx_romans        fC:\Users\Terasoftware\OneDrive\Desktop\faahhh\fyndo\fyndo\venv\Lib\site-packages\pypdf/_page_labels.py	roman_numz1number2uppercase_roman_numeral.<locals>.roman_num\   sn      #( 	 	GZ#w''DAqq.   7Q;Cax 		 	     )intr   strjoinlist)r   r/   r-   s     @r.   number2uppercase_roman_numeralr6   K   sh      E s x}       774		#''(((r0   numberc                 D    t          |                                           S N)r6   lowerr7   s    r.   number2lowercase_roman_numeralr<   g   s    )&1177999r0   c                    | dk    rt          d          d t          t          d          t          d          dz             D             }d}| dk    r+| dz  }|dk    rd}||dz
           |z   }| |z  } | dz  } | dk    +|S )	Nr   zExpecting a positive numberc                 ,    g | ]}t          |          S  )chr).0is     r.   
<listcomp>z+number2uppercase_letter.<locals>.<listcomp>n   s    >>>1A>>>r0   AZr   r1      )
ValueErrorrangeord)r7   alphabetrep	remainders       r.   number2uppercase_letterrM   k   s    { 86777>>c#hhC1 = =>>>H
C
1* RK	> 	Iy1}%+)2 1*  Jr0   c                 D    t          |                                           S r9   )rM   r:   r;   s    r.   number2lowercase_letterrO   {   s    "6**00222r0   dictionary_objectindexc                    t          t          | d                   }d}d }d}|t          |          k     rd||         }||dz                                            }|dz   t          |          k    rn(||dz            |k    rn|dz  }|t          |          k     dd t          t
          t          t          t          d}t          |t                    st	          |dz             S |                    dd          }t          t          |                    dd	                    }||                    d
                   }	| |	||z
  |z             z   S )N/Numsr   r      c                     dS )Nr1   r?   )r,   s    r.   <lambda>z%get_label_from_nums.<locals>.<lambda>   s     r0   )Nz/Dz/Rz/rz/Az/az/Stz/Pr1   z/S)r   r
   len
get_objectr3   r6   r<   rM   rO   
isinstancedictget)
rP   rQ   numsrB   valuestart_indexmstartprefixmapping_functions
             r.   get_label_from_numsrc      sW    .w788D	AEK
c$ii- 1gQU&&((q5CII 	A; 		Q c$ii-  l,,%%4 4A eT"" 519~~IIeQE#uyyr**++F4)$$U[%85%@AAAAr0   readerc                    t          t          | j                  }d|vrt          |dz             S t          t          |d                                                   }d|v rt          ||          S d|v rt          |d         t                    sd}|dk     rt          t          t                   |d                   }|D ]}t          t          t                   |d                   }|d         |cxk    r|d         k    rVn Dt          |                    dd                    s|dz  }|dk    rt          d	          |} nt          ||          c S n|dk     t          d
| dt                     t          |dz             S )z
    See 7.9.7 "Number Trees".

    Args:
        reader: The PdfReader
        index: The index of the page

    Returns:
        The label of the page, e.g. "iv" or "4".

    z/PageLabelsr   rS   z/Kidsr   r   z/LimitsNz"Too deep nesting is not supported.z,Could not reliably determine page label for .)r   r   root_objectr3   rX   rc   rY   r   r5   r2   r   r[   NotImplementedErrorr	   __name__)rd   rQ   rootnumber_treelevelkidskidlimitss           r.   index2labelrp      s     &"455DD  519~~'m)<)G)G)I)IJJK+ 7";666+ jW1Ez&R&R  ck 	-.G0DEED  d3iY88!9 ; ; ; ; ; ; ; ; ;*3777D+A+ABB 

 C< "5 D# #  '* .sE:::::;  + ck 	. J%JJJHUUUuqy>>r0   keyr]   r\   Nc                 |   t          |          dz  dk    rt          d          t          |          }|dk    r)| ||dz
           k    r|dz
  }|dk    r| ||dz
           k    |t          |          k     r| ||         k    r
|||dz   <   dS |                    ||            |                    |dz   |           dS )z
    Insert a key, value pair in a Nums array.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry
        value: value of the entry
        nums: Nums array to modify

    rT   r   6A nums like array must have an even number of elementsr   N)rW   rG   insert)rq   r]   r\   rB   s       r.   nums_insertru      s      4yy1} SQRRRD		A
q& SDQK' E q& SDQK'  	3t99} "Q "QUAsAE5!!!!!r0   page_index_toc                    t          |          dz  dk    rt          d          || k     rt          d          |                    |           dz   }|t          |          k     rW||         |k    rO|                    |           |                    |           |t          |          k     r||         |k    IdS dS dS dS )a  
    Remove all entries in a number tree in a range after an entry.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry before the range
        page_index_to: The page index of the upper limit of the range
        nums: Nums array to modify

    rT   r   rs   z/page_index_to must be greater or equal than keyN)rW   rG   rQ   pop)rq   rv   r\   rB   s       r.   nums_clear_rangery      s      4yy1} SQRRRs LJKKK

3!A
c$ii- DG}4  c$ii- DG}4         r0   c                     t          |          dz  dk    rt          d          |                    |           dz   }|t          |          k     r||         ||dz            fS dS )z
    Return the (key, value) pair of the entry after the given one.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry
        nums: Nums array

    rT   r   rs   r   )NN)rW   rG   rQ   )rq   r\   rB   s      r.   	nums_nextr{     sm     4yy1} SQRRR

3!A3t99} &Qa!e%%<r0   )__doc__collections.abcr   r   typingr   r   
_protocolsr   _utilsr	   genericr
   r   r   r   r   r2   r3   r6   r<   rM   rO   rc   rp   ru   ry   tupler{   r?   r0   r.   <module>r      sN  : :x / . . . . . . . ! ! ! ! ! ! ! ! , , , , , , " " " " " "             ) ) ) ) ) )8:3 :3 : : : :C C     3C 3C 3 3 3 3"B+; "BC "BC "B "B "B "BJ., .S .S . . . .b"	"" " 
	" " " "<	  
	   6	
 8L!8,<#==>     r0   