
    ,h7                    6   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ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mZmZmZmZmZmZm Z m!Z! ddl"m#Z# dd	l$m%Z%m&Z& dd
l'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl6m8Z9 ddl6m:Z: ddl6m;Z< ddl6m=Z> ddl6m?Z?m@Z@mAZAmBZBmCZC ddl6mDZE ddl6mFZG ddl6mHZI ddl6mJZK ddl6mLZLmMZM ddlNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZd ddlemfZfmgZg ddlmhZhmiZimjZjmkZkmlZlmmZmmnZn  ej                  ep      Zq e@d       Zr eMd      Zs G d d      Ztde eeuef   euevee   f   de^fd Zwd!e deZf   d"eud#e eexexexf   eudf   d$eyd%eydebfd&Zz G d' d(et      Z{y))    N)md5)BytesIOFileIOIOBase)Path)TracebackType)IOAnyCallableDequeDictIterableListOptionalPatternTupleTypeUnioncast   )
Encryption)
PageObject_VirtualList)	PdfReader)_alg33_alg34_alg35)StrByteType
StreamType_get_max_pdf_version_headerb_deprecate_with_replacementdeprecation_bookmarkdeprecation_with_replacementlogger_warning)AnnotationDictionaryAttributes)CatalogAttributes)CatalogDictionary)Core)EncryptionDictAttributes)FieldDictionaryAttributes	FieldFlag"FileSpecificationDictionaryEntriesGoToActionArgumentsInteractiveFormDictEntries)PageAttributes)PagesAttributes)StreamAttributes)TrailerKeys)TypFitArgumentsUserAccessPermissions)PAGE_FITAnnotationBuilderArrayObjectBooleanObjectByteStringObjectContentStreamDecodedStreamObjectDestinationDictionaryObjectFitFloatObjectIndirectObject
NameObject
NullObjectNumberObject	PdfObjectRectangleObjectStreamObjectTextStringObject
TreeObjectcreate_string_object
hex_to_rgb)	PageRangePageRangeSpec)BorderArrayTypeFitType
LayoutTypeOutlineItemTypeOutlineTypePagemodeTypeZoomArgTypeic                      e Zd ZdZddeddfdZddZdeee	      dee	   d	ee
   ddfd
Zedefd       Zej                  deddfd       ZdedefdZ	 	 ddedeef   dee   defdZdeeef   defdZ	 ddedeeegdf   dee   defdZddZ	 ddedee   defdZ	 ddedee   defdZ	 	 ddededee   defdZ 	 	 ddededee   defdZ!	 ddee   dee   defd Z"dedefd!Z#defd"Z$defd#Z%ede&e   fd$       Z'	 dd%ee(   d&ee(   defd'Z)	 dd%ee(   d&ee(   defd(Z*	 	 	 dd%ee+jX                     d&ee+jX                     dedefd)Z-	 	 	 dd%ee+jX                     d&ee+jX                     dedefd*Z.edede/e0e1f   fd+       Z2e2j                  d,edee/ef   ddfd-       Z2d.eddfd/Z3d.eddfd0Z4d1ed2eeef   ddfd3Z5d4ed5eeef   ddfd6Z6	 dd7e7d8eeegdf      ddfd9Z8	 dd7e7d8eeegdf      ddfd:Z9e:fded;e;eef   d<e<ddfd=Z=e:fded;e;eef   d<e<ddfd>Z>d7e7ddfd?Z?d7e7ddfd@Z@	 dd7e7d8eeegdf      ddfdAZA	 dd7e7d8eeegdf      ddfdBZBdddCeCddfdDee   dEee   dFeDdGeEdHee   dIee   ddfdJZFdKeGddfdLZHdKeeIef   deJeDeKf   fdMZLdKeGde&e   fdNZMdKeGdOe&e   defdPZNdKeGddfdQZOdRe;eef   ddfdSZPdRe;eef   ddfdTZQdUeeReSeTeUeeVeeWe0eXf
   ddfdVZYd2edefdWZZdedefdXZ[dedefdYZ\de]fdZZ^deRfd[Z_edeRfd\       Z`de]fd]ZadeRfd^ZbdeRfd_Zc	 	 	 	 dd`edee]f   daede]ef   dbede]ef   d,edee]f   def
dcZd	 dd,eee]f   daede]ef   defddZe	 dd,edaee]   defdeZf egdfg      	 	 ddfehdaede]ef   dbede]ef   defdh       Zi egdfg      	 ddfehdaee]   defdi       Zj egdfg      	 ddfehdaee]   defdj       Zkddddkdkeldfdlededeeef   daede]ef   dbede]ef   dmeeeJe(e(e(f   ef      dneDdoeDdpemdqee   defdrZn	 	 	 	 	 ddledqedaede]ef   dmeeJe(e(e(f      dneDdoeDdpeodsepdefdtZq	 	 	 	 	 ddledqedaede]ef   dmeeJe(e(e(f      dneDdoeDdpeodsepdefduZrddvZsdle0dweeeRf   ddfdxZt	 	 dd`ee   d,ee   defdyZud,e/defdzZv	 	 ddledee   dqee   defd{Zwdledqedefd|Zxdd}Zydd~ZzddeDddfdZ{	 ddeDddfdZ|ddeDddfdZ}	 ddeDddfdZ~	 	 ddedededeeR   dqee   ddfdZ	 ddqedededeeR   ddf
dZ	 	 ddqed`ededeeR   dpeodsepddfdZ	 	 ddqed`ededeeR   dpeodsepddfdZdZdee   fdZdee   fdZdeeVef   ddfdZdeddfdZdeddfdZedee   fd       Zej                  deddfd       Zedee   fd       Zej                  deddfd       ZdZdee   fdZdee   fdZdeddfdZdeddfdZedee   fd       Zej                  deddfd       Zedee   fd       Zej                  deddfd       Zdede;eef   ddfdZdeeef   defdZdeeIee7f   deJeee   f   fdZ	 	 	 	 ddeee7eIf   dfeedeeJeef   eJeeef   e&e   f   dedeeJeef   eJeeef   e&e   f   deDdeee&e   eJedf   f      ddfdZ egdfd      	 	 	 	 ddee   deeIee7f   dfee   dee   deDdeee&e   eJedf   f      ddfd       ZdeTde;eef   d7e7defdZdeeef   de;eef   d7e7ddfdZdedeeeeXf   de;eef   d7e7dee   fdZdeee&eT   f   dede;eef   d7e7de&e/   f
dZdede;eef   d7e7de&e/   fdZd,e/de]fdZ	 dde&e/   daee]ef   dbede]ef   ddfdZddZ	 ddfe;eef   dUee   dee&e      fdZ egdfg      	 ddfe;eef   dUee   dee&e      fd       Z	 dd7ede7ef   ddfdZy)	PdfWriterz
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
    fileobjreturnNc           	         d| _         g | _        i | _        i | _        t	               }|j                  t        t        j                        t        d      t        t        j                        t        d      t        t        j                        t               i       | j                  |      | _        t	               }|j                  t        d      t        t         j"                  dj%                  d      z         i       | j                  |      | _        t	               | _        | j(                  j                  t        t        j                        t        t*        j,                        t        t*        j.                        | j                  i       | j                  | j(                        | _        || _        d| _        y )Ns   %PDF-1.3z/Pagesr   z	/ProducerPyPDF2zutf-16beF)_header_objects_idnum_hash_id_translatedr>   updaterB   PATYPECOUNTrD   KIDSr8   _add_object_pagesrJ   codecsBOM_UTF16_BEencode_info_root_objectCOCATALOGPAGES_rootrW   with_as_usage)selfrW   pagesinfos       P/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/PyPDF2/_writer.py__init__zPdfWriter.__init__   sR   ")+8:9; !"277#Z%9288$l1o277#[]	
 &&u-  !;')=''(//**EE*	
 %%d+
 -.  277#Z

%;288$dkk	
 %%d&7&78
"    c                     d| _         | S )z+Store that writer is initialized by 'with'.T)ro   rp   s    rs   	__enter__zPdfWriter.__enter__   s    !ru   exc_typeexc	tracebackc                 T    | j                   r| j                  | j                          yy)zWrite data to the fileobj.N)rW   write)rp   ry   rz   r{   s       rs   __exit__zPdfWriter.__exit__   s      <<JJt||$ ru   c                     | j                   S )z
        Header of the PDF document that is written.

        This should be something like b'%PDF-1.5'. It is recommended to set the
        lowest version that supports all features which are used within the
        PDF file.
        r[   rw   s    rs   
pdf_headerzPdfWriter.pdf_header   s     ||ru   
new_headerc                     || _         y Nr   )rp   r   s     rs   r   zPdfWriter.pdf_header   s	    !ru   objc                     t        |d      r%|j                  j                  | k(  r|j                  S | j                  j	                  |       t        t        | j                        d|       |_        |j                  S )Nindirect_referencer   )hasattrr   pdfr\   appendrA   lenrp   r   s     rs   rd   zPdfWriter._add_object   se    3,-#2H2H2L2LPT2T)))S!!/DMM0BAt!L%%%ru   r   idoc                    |)|t        d      |}t        j                  dt               |J t	        |t
              r| j                  |dz
     S |j                  | k7  rt        d      | j                  |j                  dz
     S )NzGPlease only set 'indirect_reference'. The 'ido' argument is deprecated.zGThe parameter 'ido' is depreciated and will be removed in PyPDF2 4.0.0.r   zpdf must be self)	
ValueErrorwarningswarnDeprecationWarning
isinstanceintr\   r   idnum)rp   r   r   s      rs   
get_objectzPdfWriter.get_object   s    
 ?!- ]  &)"]&
 *	
 (#.==!3a!788!!T)/00}}/559::ru   c                 >    t        ddd       | j                  |      S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        	getObjectr   3.0.0)r$   r   )rp   r   s     rs   r   zPdfWriter.getObject   s     	%[,Hs##ru   pageactionexcluded_keysc                    t        t        |t        j                           t        j
                  k(  sJ |}t        |      }|t        j                  dgz  }	 | j                  t        |j                  j                           |j                  j                  = t        d|j                  | d|            }|j                  Q|j                  j                  }t!        |t              r|j#                         }t%        | j                  |      | _        | j&                  |t)        t        j                        <   t        t*        | j-                  | j&                              }|j                  J  ||t        j.                     |j                         t        t0        |t        j2                           }t5        |dz         |t)        t        j2                        <   |S # t        $ r Y Rw xY w)Nz/StructParentsr   Fr   )r   strr`   ra   rk   PAGElistPARENTr^   idr   r   r   	Exceptioncloner   r   rh   r    re   rB   r>   r   rc   r   rb   rD   )rp   r   r   r   page_orgotherrq   
page_counts           rs   	_add_pagezPdfWriter._add_page   sy    Cbgg'27722]+"))%566	##Bx'B'B'F'F$GH++11
 L(..um"LM<<#LL++E%%9$//5QDO&*kkZ		"#%tt{{'CD&&22uRWW~t667#uRXX/
&2:>&Bj"#  		s   AG 	G,+G,c                    	 | j                   }t        j                  |vrR| j                   j                  t	        t        j                        t        t        | j                        d|       i       t	        t        j                        }t        d      | j                   t        j                     |<   y # t        $ r)}t        j                  dt        |             Y d }~y d }~ww xY w)Nr   Tz&set_need_appearances_writer() catch : )rj   r(   	ACRO_FORMr_   rB   rA   r   r\   r/   NeedAppearancesr9   r   loggererrorrepr)rp   catalogneed_appearancesrz   s       rs   set_need_appearances_writerz%PdfWriter.set_need_appearances_writer  s    	N''G **'9!!(("#4#>#>?.4B  **D*T*TUO\]aObD/99:;KL 	NLLA49MM	Ns   B2B5 5	C'>C""C'c                 D    | j                  |t        j                  |      S )ar  
        Add a page to this PDF file.
        Recommended for advanced usage including the adequate excluded_keys

        The page is usually acquired from a :class:`PdfReader<PyPDF2.PdfReader>`
        instance.

        :param PageObject page: The page to add to the document. Should be
            an instance of :class:`PageObject<PyPDF2._page.PageObject>`
        )r   r   r   rp   r   r   s      rs   add_pagezPdfWriter.add_page2  s     ~~dDKK??ru   c                 @    t        ddd       | j                  ||      S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        addPager   r   )r$   r   r   s      rs   r   zPdfWriter.addPageC  s!     	%Y
GD}}T=11ru   indexc                 .    | j                  |fd      S )a  
        Insert a page in this PDF file. The page is usually acquired from a
        :class:`PdfReader<PyPDF2.PdfReader>` instance.

        :param PageObject page: The page to add to the document.
        :param int index: Position at which the page will be inserted.
        c                 (    | j                  |      S r   )insert)lpr   s     rs   <lambda>z'PdfWriter.insert_page.<locals>.<lambda>]  s    %1C ru   )r   rp   r   r   r   s     ` rs   insert_pagezPdfWriter.insert_pageP  s     ~~d$CDDru   c                 B    t        ddd       | j                  |||      S )zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        
insertPager   r   )r$   r   r   s       rs   r   zPdfWriter.insertPage_  s%     	%\='Je];;ru   page_number
pageNumberc                 ,   ||t        d      t        ddd       |}||t        d      t        t        t        t
        f   | j                  | j                              }t        t        |t        j                     |   j                               S )z
        Retrieve a page by number from this PDF file.

        :param int page_number: The page number to retrieve
            (pages begin at zero)
        :return: the page at the index given by *page_number*
        z)Please only use the page_number parameterzget_page(pageNumber)zget_page(page_number)4.0.0zPlease specify the page_number)r   r"   r   r   r   r
   r   re   r   r`   rc   )rp   r   r   rq   s       rs   get_pagezPdfWriter.get_pagem  s     !& !LMM&&(? %K:#5=>>T#s(^T__T[[%ABJbgg{ ; F F HIIru   c                 >    t        ddd       | j                  |      S )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        getPagezwriter.pages[page_number]r   )r$   r   )rp   r   s     rs   r   zPdfWriter.getPage  s      	%Y0KWU}}Z((ru   c                     t        t        t        t        f   | j	                  | j
                              }t        |t        d               S )Nz/Count)r   r   r   r
   r   re   r   rB   )rp   rq   s     rs   _get_num_pageszPdfWriter._get_num_pages  s8    T#s(^T__T[[%AB5H-.//ru   c                 <    t        ddd       | j                         S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        getNumPageszlen(writer.pages)r   )r$   r   rw   s    rs   r   zPdfWriter.getNumPages  s      	%]4GQ""$$ru   c                 B    t        | j                  | j                        S )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r   r   rw   s    rs   rq   zPdfWriter.pages  s     D//??ru   widthheightc                 V    t        j                  | ||      }| j                  |       |S )a  
        Append a blank page to this PDF file and returns it. If no page size
        is specified, use the size of the last page.

        :param float width: The width of the new page expressed in default user
            space units.
        :param float height: The height of the new page expressed in default
            user space units.
        :return: the newly appended page
        :raises PageSizeNotDefinedError: if width and height are not defined
            and previous page does not exist.
        )r   create_blank_pager   )rp   r   r   r   s       rs   add_blank_pagezPdfWriter.add_blank_page  s)     ++D%@dru   c                 @    t        ddd       | j                  ||      S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        addBlankPager   r   )r$   r   )rp   r   r   s      rs   r   zPdfWriter.addBlankPage  s$     	%^5EwO""5&11ru   c                    ||Q| j                         dz
  |k\  r;| j                  |   }|j                  j                  }|j                  j                  }t        j                  | ||      }| j                  ||       |S )a8  
        Insert a blank page to this PDF file and returns it. If no page size
        is specified, use the size of the last page.

        :param float width: The width of the new page expressed in default user
            space units.
        :param float height: The height of the new page expressed in default
            user space units.
        :param int index: Position to add the page.
        :return: the newly appended page
        :raises PageSizeNotDefinedError: if width and height are not defined
            and previous page does not exist.
        r   )r   rq   mediaboxr   r   r   r   r   )rp   r   r   r   oldpager   s         rs   insert_blank_pagezPdfWriter.insert_blank_page  s{    & =FN0C0C0E0Ie/Sjj'G$$**E%%,,F++D%@u%ru   c                 B    t        ddd       | j                  |||      S )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        insertBlankPager   r   )r$   r   )rp   r   r   r   s       rs   r   zPdfWriter.insertBlankPage  s'     	%%68KWU%%eVU;;ru   c                 X   d| j                   vry| j                   d   }t        |t        t        f      rt	        t        |            S t        |t
              r0	 |dd \  }}|dd }t        |t        |            }t        d||      S y# t        $ r}t        d| d|       d}~ww xY w)a  
        Property to access the opening destination ("/OpenAction" entry in the
        PDF catalog).
        it returns `None` if the entry does not exist is not set.

        :param destination:.
        the property can be set to a Destination, a Page or an string(NamedDest) or
            None (to remove "/OpenAction")

        (value stored in "/OpenAction" entry in the Pdf Catalog)
        /OpenActionNr      
OpenActionzInvalid Destination : )
rj   r   r   bytesrJ   r8   r?   tupler=   r   )rp   oar   typarrayfitrz   s          rs   open_destinationzPdfWriter.open_destination  s      1 11}-b3,''B00K(DqG	c12#uU|,"<s;;   D"6rd"SE BCCDs   .B
 
	B)B$$B)destc                    |	 | j                   d= y t        |t              r"t	        |      | j                   t        d      <   y t        |t              r#|j                  | j                   t        d      <   y t        |t              rRt        d|j                  |j                  n	t               t              j                  | j                   t        d      <   y y # t        $ r Y y w xY w)Nr   Opening)rj   KeyErrorr   r   rH   rB   r=   
dest_arrayr   r   rC   r6   rp   r   s     rs   r   zPdfWriter.open_destination  s    <%%m4 c";KD;QDj78k*;???Dj78j);F**6 ''\< j j78 *  s   C 	C&%C&
javascriptc           
         d| j                   vr.t               | j                   t        t        j                        <   t        t        | j                   t        j                           }d|vr*t        t        d      t               i      |t        d      <   t        t        t        t        |d         d         }t               }|j                  t        t        j                        t        d      t        d      t        d      t        d      t        |       i       |j                  t        t        t        j                                            |j                  | j!                  |             y)a  
        Add Javascript which will launch upon opening this PDF.

        :param str javascript: Your Javascript.

        >>> output.add_js("this.print({bUI:true,bSilent:false,bShrinkToFit:true});")
        # Example: This will launch the print window when the PDF is opened.
        z/Namesz/JavaScriptz/Action/Sz/JSN)rj   r>   rB   CANAMESr   r8   r_   r`   ra   rH   r   rJ   r   uuiduuid4rd   )rp   r   namesjs_listjss        rs   add_jszPdfWriter.add_js  s    4,,,6F6HDj23%t'8'8'BC%/?H%{}50E*]+, .m0DEhO
 
		277#Z	%:4 *]";5!#3zl#D	
 	+C

,=>?t''+,ru   c                 >    t        ddd       | j                  |      S )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        addJSr   r   )r$   r   )rp   r   s     rs   r   zPdfWriter.addJS;  s     	%Wh@{{:&&ru   filenamedatac           	          t               }|j                  |       |j                  t        t        j
                        t        d      i       t               }|j                  t        d      |i       t               }|j                  t        t        j
                        t        d      t        t        j                        t        |      t        t        j                        |i       t               }|j                  t        t        j                        t        t        |      |g      i       t               }|j                  t        d      |i       | j                  j                  t        t        j                        |i       y)a  
        Embed a file inside the PDF.

        :param str filename: The filename to display.
        :param str data: The data in the file.

        Reference:
        https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
        Section 7.11.3
        z/EmbeddedFile/Fz	/Filespecz/EmbeddedFilesN)r<   set_datar_   rB   r`   ra   r>   r-   FrJ   EFr   r   r8   rj   )rp   r   r   
file_entryef_entryfilespecembedded_files_names_dictionaryembedded_files_dictionarys           rs   add_attachmentzPdfWriter.add_attachmentD  s@   8 )*
D!:bgg.
?0KLM $%D):67#%277#Z%<=??@BVC =@@A8	
* +;*<''..288$k)(3X>'	
 %5$6!!((()+JK	
 	  *RXX"68Q!RSru   fnamefdatac                 @    t        ddd       | j                  ||      S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        addAttachmentr  r   )r$   r  )rp   r  r  s      rs   r
  zPdfWriter.addAttachment  s$     	%_6FP""5%00ru   readerafter_page_appendc                     t        |j                        }t        |      D ]6  }|j                  |   }| j                  |      }t	        |      s/ ||       8 y)a  
        Copy pages from reader to writer. Includes an optional callback parameter
        which is invoked after pages are appended to the writer.

        :param PdfReader reader: a PdfReader object from which to copy page
            annotations to this writer object.  The writer's annots
            will then be updated
        :param Callable[[PageObject], None] after_page_append:
            Callback function that is invoked after each page is appended to
            the writer. Signature includes a reference to the appended page
            (delegates to append_pages_from_reader). The single parameter of the
            callback is a reference to the page just appended to the document.
        N)r   rq   ranger   callable)rp   r  r  reader_num_pagesreader_page_numberreader_pagewriter_pages          rs   append_pages_from_readerz"PdfWriter.append_pages_from_reader  sW    & v||,"'(8"9 	/ ,,'9:K--4K)*!+.	/ru   c                 B    t        ddd       | j                  ||       y)zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        appendPagesFromReaderr  r   N)r$   r  rp   r  r  s      rs   r  zPdfWriter.appendPagesFromReader  s'     	%#%?	
 	%%f.?@ru   fieldsflagsc           	         | j                          t        j                  |vrt        dt               yt        t        |t        j                                 D ]  }|t        j                     |   j                         }i }t        j                  |v r|t        j                     }|D ]D  }|j                  t        j                        |k(  r|j                  t        j                        dk(  r6|j                  t        t        j                         t        ||         i       |j                  t        t        j"                        t%        ||         i       |s|j                  t        t        j&                        t)        |      i       |j                  t        j                        |k(  s|j                  t        t        j"                        t%        ||         i       G  y)a  
        Update the form field values for a given page from a fields dictionary.

        Copy field texts and values from fields to page.
        If the field links to a parent object, add the information to the parent.

        :param PageObject page: Page reference from PDF writer where the
            annotations and field data will be updated.
        :param dict fields: a Python dictionary of field names (/T) and text
            values (/V)
        :param int flags: An integer (0 to 7). The first bit sets ReadOnly, the
            second bit sets Required, the third bit sets NoExport. See
            PDF Reference Table 8.70 for details.
        z No fields to update on this pageNz/Btn)r   PGANNOTSr%   __name__r  r   r   r   getr+   TFTr_   rB   r&   ASVrH   FfrD   )rp   r   r  r  jwriter_annotwriter_parent_annotfields           rs   update_page_form_field_valuesz'PdfWriter.update_page_form_field_values  s   ( 	((*99D =xHs4		?+, &	A		?1-88:L"$yyL(&2299&=#  ##$=$?$?@EI#''(A(D(DEO$++ *$B$E$E!"#-fUm#< !''&'@'B'BCEU &uF $++ *+D+G+G H,$)K" ),,-F-H-HIUR'..&'@'B'BCEU &uF5 &	ru   c                 B    t        ddd       | j                  |||      S )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        updatePageFormFieldValuesr(  r   )r$   r(  )rp   r   r  r  s       rs   r*  z#PdfWriter.updatePageFormFieldValues  s+     	%')H'	
 11$FFru   c                 d    t        t        |j                  t        j                           | _        y)z
        Copy the reader document root to the writer.

        :param reader:  PdfReader from the document root should be copied.
        N)r   r>   trailerTKROOTrj   rp   r  s     rs   clone_reader_document_rootz$PdfWriter.clone_reader_document_root  s!     !!16>>"''3JKru   c                 @    t        ddd       | j                  |       y)ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        cloneReaderDocumentRootr0  r   N)r$   r0  r/  s     rs   r2  z!PdfWriter.cloneReaderDocumentRoot%  s$     	%%'CW	
 	''/ru   c                 J    | j                  |       | j                  ||       y)a)  
        Create a copy (clone) of a document from a PDF file reader

        :param reader: PDF file reader instance from which the clone
            should be created.
        :param Callable[[PageObject], None] after_page_append:
            Callback function that is invoked after each page is appended to
            the writer. Signature includes a reference to the appended page
            (delegates to append_pages_from_reader). The single parameter of the
            callback is a reference to the page just appended to the document.
        N)r0  r  r  s      rs   clone_document_from_readerz$PdfWriter.clone_document_from_reader0  s#    " 	''/%%f.?@ru   c                 B    t        ddd       | j                  ||       y)ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        cloneDocumentFromReaderr4  r   N)r$   r4  r  s      rs   r6  z!PdfWriter.cloneDocumentFromReaderD  s'     	%%'CW	
 	''0ABru   Tuser_passwordowner_password
use_128bitpermissions_flaguser_pwd	owner_pwdc           	      R   |$|t        d      t        j                  d       |}|t        d      |4|t        d      d}d}t        j                  | d| d	t        
       |}||}|rd}	d}
t	        d      }nd}	d}
t	        d      }|}t        t        |||
|            }t        t        t        t        j                               j                  d            j                               }t        t        t        t        j                               j                  d            j                               }t        ||f      | _        |
dk(  rt        ||||      \  }}n|
dk(  sJ t!        ||
||||d      \  }}t#               }t%        d      |t%        t&        j(                        <   t+        |	      |t%        d      <   |	dk(  r(t+        |dz        |t%        t&        j,                        <   t+        |
      |t%        t.        j0                        <   t        |      |t%        t.        j2                        <   t        |      |t%        t.        j4                        <   t+        |      |t%        t.        j6                        <   | j9                  |      | _        || _        y)a  
        Encrypt this PDF file with the PDF Standard encryption handler.

        :param str user_password: The "user password", which allows for opening
            and reading the PDF file with the restrictions provided.
        :param str owner_password: The "owner password", which allows for
            opening the PDF files without any restrictions.  By default,
            the owner password is the same as the user password.
        :param bool use_128bit: flag as to whether to use 128bit
            encryption.  When false, 40bit encryption will be used.  By default,
            this flag is on.
        :param unsigned int permissions_flag: permissions as described in
            TABLE 3.20 of the PDF 1.7 specification. A bit value of 1 means the
            permission is grantend. Hence an integer value of -1 will set all
            flags.
            Bit position 3 is for printing, 4 is for modifying content, 5 and 6
            control annotations, 9 for form fields, 10 for extraction of
            text and graphics.
        NzGPlease only set 'user_password'. The 'user_pwd' argument is deprecated.z|Please use 'user_password' instead of 'user_pwd'. The 'user_pwd' argument is deprecated and will be removed in PyPDF2 4.0.0.zuser_password may not be NonezIThe argument owner_pwd of encrypt is deprecated. Use owner_password only.r<  r8  G is deprecated as an argument and will be removed in PyPDF2 4.0.0. Use  insteadmessagecategoryr      g      0@r   g      @utf8Fz	/Standard/V   )r   r   r   r   r   r:   r   r   r   timerh   digestrandomr8   _IDr   r   r>   rB   SAFILTERrD   LENGTHEDROUPrd   _encrypt_encrypt_key)rp   r7  r8  r9  r:  r;  r<  old_termnew_termr"  revkeylenrR  rP  ID_1ID_2rQ  keyencrypts                      rs   r\  zPdfWriter.encryptS  sl   8 ( = 
 7
 !) <== ) _  '+#* %88@zK 0 "+!*NAC\FAC[FVNM3OPT$))+%6$>$>v$F G N N PQT&--/%:$B$B6$J K R R TUd|,!8M1a6FAs!8OM31dEJFAs"$)3K)@
299%&$0O
4 !6-9&1*-EGJryy)*$0$5
244 !$4Q$7
244 !$4Q$7
244 !$0O
244 !((1ru   streamc                    t        |d      r,d|j                  vrt        d|j                   dt               | j
                  s | j                  | j                        | _        | j                  | j
                         | j                  |      }| j                  ||      }| j                  |       |j                  t        d| d             y )NmodebzFile <zH> to write to is not in binary mode. It may not be written to correctly.z
startxref
z
%%EOF
)r   r_  r%   namer  rn   rd   rj   _sweep_indirect_references_write_header_write_xref_table_write_trailerr}   r!   )rp   r]  object_positionsxref_locations       rs   write_streamzPdfWriter.write_stream  s    66"s&++'= &6 6 zz))$*;*;<DJ 	''

3--f5..v7GHF#R-i@ABru   c                     d}|dk(  rt        d| d      t        |t        t        f      rt	        |d      }d| _        d}| j                  |       | j
                  r|j                          ||fS )ae  
        Write the collection of pages added to this object out as a PDF file.

        :param stream: An object to write the file to.  The object can support
            the write method and the tell method, similar to a file object, or
            be a file path, just like the fileobj, just named it stream to keep
            existing workflow.
        F zOutput(stream=z) is empty.wbT)r   r   r   r   r   ro   rh  close)rp   r]  my_files      rs   r}   zPdfWriter.write  su     R<~fX[ABBfsDk*FD)F!%DG&!LLNru   c           	      H   g }|j                  | j                  dz          |j                  d       t        | j                        D ]W  \  }}| j                  |   }||dz   }|j	                  |j                                |j                  t        t        |            dz          d }t        | d      r|| j                  j                  k7  rt        j                  d|dz         d d }t        j                  dd      d d	 }| j                  |z   |z   }t        |      t        | j                        d
z   k(  sJ t        |      j!                         }	|	d t#        dt        | j                        d
z          }|j%                  ||       |j                  d       Z |S )N   
s   %
r   s    0 obj
rS  z<irC  r   r         s   
endobj
)r}   r   	enumerater\   r   tellr!   r   r   rS  r   structpackrT  r   r   rH  minwrite_to_stream)
rp   r]  rf  ir   r   r[  pack1pack2md5_hashs
             rs   rc  zPdfWriter._write_header  sm   T__u,-+,. 	,FAs--"CA ''6RE
^k9:4,$--:M:M1M"KKa!e4Ra8E"KKa0!4E++e3e;Cs8D,=,=(>(BCC"3x0H"#HSS1B1B-Ca-G%HIC##FC0]+!	,"  ru   rf  c           	      F   |j                         }|j                  d       |j                  t        dt        | j                        dz    d             |j                  t        ddddd	d
             |D ]$  }|j                  t        |dddd	d             & |S )Ns   xref
z0 r   
r   z0>10 i  z0>5z f 
z n 
)rs  r}   r!   r   r\   )rp   r]  rf  rg  offsets        rs   rd  zPdfWriter._write_xref_table  s    YR"S/!34B789R1T(!E#;e456& 	<FLLvdm1QsG59:;	<ru   c           	      D   |j                  d       t               }|j                  t        t        j
                        t        t        | j                        dz         t        t        j                        | j                  t        t        j                        | j                  i       t        | d      r&| j                  |t        t        j                        <   t        | d      r&| j                   |t        t        j"                        <   |j%                  |d        y )Ns   trailer
r   rJ  rS  )r}   r>   r_   rB   r-  SIZErD   r   r\   r.  rn   INFOri   r   rJ  IDrS  ENCRYPTrw  )rp   r]  r,  s      rs   re  zPdfWriter._write_trailer  s    \""$277#\#dmm2Dq2H%I277#TZZ277#TZZ	
 4)-GJruu%&4$.2mmGJrzz*+-ru   infosc                     i }t        |j                               D ]  \  }}t        |      |t        |      <    | j	                  | j
                        j                  |       y)z
        Add custom metadata to the output.

        :param dict infos: a Python dictionary where each key is a field
            and each value is your new metadata.
        N)r   itemsrJ   rB   r   ri   r_   )rp   r  argsr[  values        rs   add_metadatazPdfWriter.add_metadata  sW     u{{}- 	@JC$8$?DC!	@

#**40ru   c                 @    t        ddd       | j                  |       y)zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        addMetadatar  r   N)r$   r  )rp   r  s     rs   r  zPdfWriter.addMetadata!  s     	%]NGL% ru   rootc                    t        j                         }g }d }g }d }|j                  ||||f       t        |      r|j	                         \  }}}}t        |t        t        f      r6|j                         D ]"  \  }}	|j                  |	|||||gz   ng f       $ nzt        |t              rj|j                  | k7  r[| j                  |      }t        |      |vr=|j                  t        |             |j                  |j                         d d g f       t        |t        t        f      rt        |t              r | j                  | j                  |            }g }
||   |k7  r5|j!                         g|D cg c]  }|j!                          c}z   }
|||<   |
D ]Q  }| j"                  j	                  |d       }|"|j                         }|5|| j"                  |j!                         <   S t        |      ry y c c}w r   )collectionsdequer   r   popr   r8   r>   r  rA   r   _resolve_indirect_objectr   r   rG   rd   
hash_valuer]   )rp   r  stack
discoveredparentgrant_parents	key_or_idr   r[  r  update_hashesgrant_parentold_hashr   indirect_reference_objs                  rs   rb  z$PdfWriter._sweep_indirect_references*  s   ,  	 
)+	 	dFI}=>%j5:YY[2D&)] $.> ?@"&**, JCLL! 8>8JMVH4PR	 D.188t#88>D4y
2"))#d)4doo&7tR%HI &#3["ABdL1  889I9I$9OPD " )$,%+%6%6%8$9FS=6B//1= %M )-F9% !. 	3H)-)9)9)=)=h)M&)51C1N1N1P.1= !3 !,, 6 A A C	3O %jjB=s   =Hc                    t        |j                  d      rL|j                  j                  j                  r,t	        d|j                  j                  j
                         |j                  | k(  r|S |j                  j                  |      }|5t        d|j                  j                   d| dt               t               }|j                         }|| j                  v r| j                  |   S |j                  | k(  r%t        |j                  d|       | j                  |<   n| j                  |      | j                  |<   | j                  |   S )z
        Resolves indirect object to this pdf indirect objects.

        If it is a new object then it is added to self._objects
        and new idnum is given and generation is always 0.
        r]  zI/O operation on closed file: zUnable to resolve [r   z], returning NullObject insteadr   )r   r   r]  closedr   ra  r   r%   	__class__r  rC   r  r]   rA   r   rd   )rp   r   real_objr  s       rs   r  z"PdfWriter._resolve_indirect_object{  s.    488X&488??+A+A=dhhoo>R>R=STUU88tK 88&&t,%dnn&=&=%>b G/ /
 "|H((*
 )))##J//88t+9$**a+NDZ( ,0+;+;H+EDZ(
++ru   c                     | j                   j                  |      dz   }t        |d|       }|j                         |k(  sJ |S Nr   r   )r\   r   rA   r   )rp   r   r   refs       rs   get_referencezPdfWriter.get_reference  s@    ##C(1,UAt,~~3&&
ru   c                 >    t        ddd       | j                  |      S )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        getReferencer  r   )r$   r  r   s     rs   r  zPdfWriter.getReference  s!     	%^_gN!!#&&ru   c                    t         j                  | j                  v rmt        t        | j                  t         j                           }| j
                  j                  |      dz   }t        |d|       }|j                         |k(  sJ |S t	               }|j                  i        | j                  |      }|| j                  t        t         j                        <   |S r  )rk   OUTLINESrj   r   rI   r\   r   rA   r   r_   rd   rB   )rp   outliner   outline_refs       rs   get_outline_rootzPdfWriter.get_outline_root  s    ;;$+++:t'8'8'EFGMM''014E(48K))+w66  !lGNN2**73K9DDj56ru   c                     t         j                  | j                  v r-t        t        | j                  t         j                           }|S t	               }|| j                  t        t         j                        <   |S )u   
        the list of threads see §8.3.2 from PDF 1.7 spec

                :return: an Array (possibly empty) of Dictionaries with "/F" and "/I" properties
        )rk   THREADSrj   r   r8   rB   )rp   threadss     rs   get_threads_rootzPdfWriter.get_threads_root  s_     ::***;(9(9"**(EFG  "mG8?Dj45ru   c                 "    | j                         S )u   
        Read-only property for the list of threads see §8.3.2 from PDF 1.7 spec

        :return: an Array (possibly empty) of Dictionaries with "/F" and "/I" properties
        )r  rw   s    rs   r  zPdfWriter.threads  s     $$&&ru   c                 <    t        ddd       | j                         S )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        getOutlineRootr  r   )r$   r  rw   s    rs   r  zPdfWriter.getOutlineRoot  s!     	%%57I7S$$&&ru   c                 z   t         j                  | j                  v rt        | j                  t         j                     t              rSt        t        | j                  t         j                           }|j                  }t         j                  |v rt        |t         j                     t              rt        t        |t         j                           }|j                  }t         j                  |v r#t        t        |t         j                           }|S t               }||t        t         j                        <   |S t	               }| j                  |      }||t        t         j                        <   t               }||t        t         j                        <   |S t	               }| j                  |      }|| j                  t        t         j                        <   t	               }| j                  |      }||t        t         j                        <   t               }||t        t         j                        <   |S r   )r   r   rj   r   r>   r   r   DESTSr8   rB   rd   )rp   r   	names_refdests	dests_refnds         rs   get_named_dest_rootzPdfWriter.get_named_dest_root  s   88t(((Zbhh')9.
 )4+<+<RXX+FGE00Ixx5 ZbhhAQ%R-uRXX?!44	88u$k5?;B* 	' %B24E*RXX./$ 	! )* ,,U3	.7j*+ ].0j*+ 	 %&E((/I6?Dj23$&E((/I*3E*RXX&'B*,E*RXX&'	ru   c                 <    t        ddd       | j                         S )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        getNamedDestRootr  r   )r$   r  rw   s    rs   r  zPdfWriter.getNamedDestRoot  s"     	%%79NPWX''))ru   page_destinationr  beforec                 T   ||t        d      |'d}d}t        j                  | d| dt               |}|t        d      || j	                         }t        t        |j                               }| j                  |      }||j                  }|j                  |||        |S )Nz[The argument dest of add_outline_item_destination is deprecated. Use page_destination only.r   r  r>  r?  r@   page_destination may not be None)r   r   r   r   r  r   rI   r   rd   r   insert_child)rp   r  r  r  r   rU  rV  page_destination_refs           rs   add_outline_item_destinationz&PdfWriter.add_outline_item_destination  s     'D,<m  H)HMMj !44<:XG ,  $#?@@>**,Fj&"3"3"56#//0@A..F0&$?##ru   c                 @    t        ddd       | j                  ||      S )zf
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_destination` instead.
        add_bookmark_destinationr  r   r$   r  rp   r   r  s      rs   r  z"PdfWriter.add_bookmark_destination0  s)     	%&(F	
 00v>>ru   c                 @    t        ddd       | j                  ||      S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_destination` instead.
        addBookmarkDestinationr  r   r  r  s      rs   r  z PdfWriter.addBookmarkDestination?  s)     	%$&Dg	
 00v>>ru   outline_item)bookmarkc                    t               }t        |j                               D ]  \  }}||t        t	        |            <    |j                  |       d|v rtt               }t        t        |d         }t        |j                               D ]  \  }}||t        t	        |            <    | j                  |      }	|	|t        d      <   | j                  |||      S )N/A)
rI   r   r  rB   r   r_   r>   r   rd   r  )
rp   r  r  r  outline_item_objectkvr   a_dict
action_refs
             rs   add_outline_item_dictzPdfWriter.add_outline_item_dictL  s     )l++-. 	8DAq67
3q6 23	8""<0<%'F*L,>?FV\\^, /1-.z#a&)*/))&1J4>
4 01001DffUUru   c                 @    t        ddd       | j                  ||      S )z_
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_dict` instead.
        add_bookmark_dictr  r   r$   r  rp   r  r  s      rs   r  zPdfWriter.add_bookmark_dictb  s)     	%!8'	
 )),??ru   c                 @    t        ddd       | j                  ||      S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_dict` instead.
        addBookmarkDictr  r   r  r  s      rs   r  zPdfWriter.addBookmarkDictp  s)     	%6	
 )),??ru   Ftitlecolorbolditalicr   pagenumc
           
      
   t        |t              r|||}| j                  |||d||||      S ||	t        d      |d}
nt        |t              r|}nGt        |t
              r|j                  }n*t        |t              r	 | j                  |   j                  }t        d| t               t               }t        t        d|z   dz         ||      }| j!                  t#        t        t$        j&                        |j(                  t        t$        j*                        t        d      i            }
t-        |
||||      }|| j/                         }| j1                  |||      S # t        $ r t        |      }Y w xY w)a  
        Add an outline item (commonly referred to as a "Bookmark") to this PDF file.

        :param str title: Title to use for this outline item.
        :param int page_number: Page number this outline item will point to.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param tuple color: Color of the outline item's font as a red, green, blue tuple
            from 0.0 to 1.0 or as a Hex String (#RRGGBB)
        :param bool bold: Outline item font is bold
        :param bool italic: Outline item font is italic
        :param Fit fit: The fit of the destination page.
        NMThe argument pagenum of add_outline_item is deprecated. Use page_number only.zcan not find reference of page /z outline item/GoTo)r   r?   add_outline_itemr   rA   r   r   r   rq   
IndexErrorrD   r%   r  rC   r=   rB   rd   r>   r.   Dr   S_create_outline_itemr  r  )rp   r  r   r  r  r  r  r  r   r  r  page_refr   r  s                 rs   r  zPdfWriter.add_outline_item~  s   8 fc";#6!(({FD&%v  "w':_  J+~6&K4&99K-9#zz+6IIH 5k]C &<3;89D )) "#6#8#894??"#6#8#89:g;NJ ,JufdS>**,F00vvNN5 " 9+K8H9s   E+ +FFr  c                 `    t        ddd       | j                  ||||||t        ||            S )zZ
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item` instead.
        add_bookmarkr  r   fit_typefit_argsr$   r  r?   	rp   r  r  r  r  r  r  r   r  s	            rs   r  zPdfWriter.add_bookmark  s@      	%^5GQ$$t,
 	
ru   c                 b    t        ddd       | j                  |||d|||t        ||            S )z[
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item` instead.
        addBookmarkr  r   Nr  r  r  s	            rs   r  zPdfWriter.addBookmark  sC      	%]4FP$$t,	
 		
ru   c                     t        d      )NzIThis method is not yet implemented. Use :meth:`add_outline_item` instead.)NotImplementedErrorrw   s    rs   add_outlinezPdfWriter.add_outline  s    !W
 	
ru   destinationc                    | j                         }d}|t        |      k  rJ|||   k  r.|j                  ||       |j                  |t        |             y |dz  }|t        |      k  rJ|j	                  t        |      |g       y )Nr   r   )r  r   r   rH   extend)rp   r  r  r  rx  s        rs   add_named_destination_arrayz%PdfWriter.add_named_destination_array  s     %%'#b'kr!u}		![)		!-e45Q #b'k 			#E*K89ru   c                    ||t        d      |'d}d}t        j                  | d| dt               |}|t        d      | j	                  |j
                        }| j                  t        d|d	         |       |S )
Nz[The argument dest of add_named_destination_object is deprecated. Use page_destination only.r   r  r>  r?  r@  r  rH   /Title)r   r   r   r   rd   r   r  r   )rp   r  r   rU  rV  r  s         rs   add_named_destination_objectz&PdfWriter.add_named_destination_object  s    
 'D,<m  H)HMMj !44<:XG ,  $#?@@#//0@0K0KL((#%5h%?@BV	
 $#ru   c                 >    t        ddd       | j                  |      S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        addNamedDestinationObjectr  r   )r$   r  r   s     rs   r  z#PdfWriter.addNamedDestinationObject3  s'     	%')G	
 0066ru   c           
         ||t        d      |'d}d}t        j                  | d| dt               |}|t        d      | j	                  | j
                        t        j                     |   }t               }|j                  t        t        j                        t        |t        t        j                        t!        d      g      t        t        j"                        t        d	      i       | j%                  |      }| j'                         }	t)        |t*              st+        t-        |            }|	j/                  ||g       |S )
Nr  r  r   r>  r?  r@  zpage_number may not be Nonei:  r  )r   r   r   r   r   re   r`   rc   r>   r_   rB   r.   r  r8   r4   FIT_HrD   r  rd   r  r   rH   r   r  )
rp   r  r   r  rU  rV  r  r   dest_refr  s
             rs   add_named_destinationzPdfWriter.add_named_destination@  sB    "w':_   H$HMMj !44<:XG , "K:;;??4;;/8E!.001;z/*?*?@,sBST4 .001:g3F		
 ##D)%%'%!12$SZ0E
		5(#$ru   c                 @    t        ddd       | j                  ||      S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        addNamedDestinationr   r   )r$   r   )rp   r  r  s      rs   r  zPdfWriter.addNamedDestinationi  s)     	%!#:G	
 ))%99ru   c                 ,   t        t        | j                  | j                              }t        t        |t
        j                           }|D ]E  }t        t        | j                  |            }t        j                  |v s5|t        j                  = G y)z.Remove links and annotations from this output.N)	r   r>   r   re   r8   r`   rc   r  r  )rp   pg_dictrq   r   r  s        rs   remove_linkszPdfWriter.remove_linksv  sn    ')EF['"''"23 	(D,dood.CDHyyH$RYY'	(ru   c                 <    t        ddd       | j                         S )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        removeLinksr  r   )r$   r  rw   s    rs   r  zPdfWriter.removeLinks  s     	%]NGL  ""ru   ignore_byte_string_objectc                 V   t        t        | j                  | j                              }t        t        |t
        j                           }d}|D ]W  }t        t        | j                  |            }|d   j                         }t        |t              st        ||      }g }d}	|j                  D ]  \  }
}|dv r%|
d   }|rt        |t              st               |
d<   nu|dk(  r%|
d   }|rit        |t              sYt               |
d<   nK|dk(  rFt        t        |
d               D ],  }|st        |
d   |   t              rt               |
d   |<   . |d	k(  rd
}	|dk(  rd}	|	r||v r|dk(  r|j                  |
|f        ||_	        |j                  t        d      |       Z y)z
        Remove images from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        )s   cm   w   J   j   M   ds   ri   is   gs   W   b   s   S   f   F   n   m   l   c   v   y   h   Bs   Dos   sh	/ContentsFs   Tj   'r      "r      TJ   qT   Qs   reN)r   r>   r   re   r8   r`   rc   r   r;   
operationsrH   r  r   r   __setitem__rB   )rp   r  r  rq   jump_operatorsr   r  content_operationsseq_graphicsoperandsoperatortextrx  s                 rs   remove_imageszPdfWriter.remove_images  s    ')EF['"''"23
6  '	CD,dood.CDH{+668Gg}5':K L&-&8&8 9"(},#A;D0.: '7&8%#A;D0.: '7&8&"3x{#34 @4Z$QKN,<> .>-?HQKN	@ t##'Lt##(LH$>u$""Hh#7899< "-G  K!8'BO'	Cru   ignoreByteStringObjectc                 >    t        ddd       | j                  |      S )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        removeImagesr.  r   )r$   r.  rp   r/  s     rs   r1  zPdfWriter.removeImages  s"     	%^_gN!!"899ru   c                    t        t        | j                  | j                              }t        t        t
           |t        j                           }|D ]  }t        t        | j                  |            }|d   j                         }t        |t              st        ||      }|j                  D ]  \  }}|dv rK|d   }	|st        |	t              s#t               |d<   1t        |	t        t        f      sHt               |d<   V|dk(  rK|d   }	|st        |	t              sst               |d<   t        |	t        t        f      st               |d<   |dk(  st        t        |d               D ]Y  }
|s(t        |d   |
   t              st               |d   |
<   -t        |d   |
   t        t        f      sJt               |d   |
<   [ ! |j!                  t#        d      |        y)z
        Remove text from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        r  r  r   r!  r   r"  N)r   r>   r   re   r   rA   r`   rc   r   r   r;   r%  rH   r:   r  r   r&  rB   )rp   r  r  rq   r   r  r(  r+  r,  r-  rx  s              rs   remove_textzPdfWriter.remove_text  s    ')EFT.)7277+;< !	CDJ(=>H{+668Gg}5':&-&8&8 D"(},#A;D4%d,<=*:*<HQK%d-=?O,PQ*:*<HQK%#A;D4%d,<=*:*<HQK%d-=?O,PQ*:*<HQK&"3x{#34 D8)(1+a.:JK1A1CA) (A1ACS0T  2B1CAD%D8   K!8'BC!	Cru   c                 >    t        ddd       | j                  |      S )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        
removeTextr4  r   )r$   r4  r2  s     rs   r6  zPdfWriter.removeText  s"     	%\='J 677ru   urirectborderc                 |   |t        j                  dt               |}| j                  | j                        t
        j                     |   }t        t        t        t        f   | j                  |            }|`|dd D cg c]  }t        |       }	}t        |      dk(  rFt        |d   D cg c]  }t        |       c}      }
|	j                  |
       nt        d      gdz  }	t!        |t              rt        |      }nt!        |t"              rnt#        |      }t%               }|j'                  t        d      t        d      t        d      t)        |      i       t%               }|j'                  t        t*        j,                        t        t.        j0                        t        t*        j2                        t        d	      t        t*        j4                        |t        t*        j6                        |t        d
      t        d      t        t*        j8                        t        |	      t        d      |i       | j;                  |      }t.        j0                  |v r#|t.        j0                     j                  |       yt        |g      |t        t.        j0                        <   yc c}w c c}w )a  
        Add an URI from a rectangular area to the specified page.
        This uses the basic structure of :meth:`add_link`

        :param int page_number: index of the page on which to place the URI action.
        :param str uri: URI of resource to link to.
        :param Tuple[int, int, int, int] rect: :class:`RectangleObject<PyPDF2.generic.RectangleObject>` or array of four
            integers specifying the clickable rectangular area
            ``[xLL, yLL, xUR, yUR]``, or string in the form ``"[ xLL yLL xUR yUR ]"``.
        :param ArrayObject border: if provided, an array describing border-drawing
            properties. See the PDF spec for details. No border will be
            drawn if this argument is omitted.
        NzoThe 'pagenum' argument of add_uri is deprecated and will be removed in PyPDF2 4.0.0. Use 'page_number' instead.)rB  rC     r   r   z/URI/Linkz/H/Ir  )r   r   r   r   re   r`   rc   r   r   r   r
   rB   r   r8   r   rD   r   rF   r>   r_   rH   r&   r   r  r  SubtyperR  RectBorderrd   )rp   r   r7  r8  r9  r  	page_linkr  n
border_arrdash_patternlnk2lnklnk_refs                 rs   add_urizPdfWriter.add_uri  s-   * MMF+
 "KOODKK09+F	S#X	(BC 17<A*Q-<J<6{a*6!9+MaJqM+MN!!,/&q/*Q.JdC d#Do."4(D!4 *V"46"$4S$9	
  

9>>?BIIAV9AABJwDW9;;<i9>>?4 *T"29@@A;D 4 $
	
 ""3'99 RYY&&w/.97).DHZ		*+Q =+Ms   J42J9c                 D    t        ddd       | j                  ||||      S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        addURIrH  r   )r$   rH  )rp   r  r7  r8  r9  s        rs   rJ  zPdfWriter.addURIb  s%     	%Xy'B||GS$77ru   c           	         t        dd       t        |t              rT|j                         dd }t	        |j                  d      D cg c]  }t        |      dkD  st        |       c}      }nt        |t              rnt	        |      }t        j                  |||t        ||            }| j                  ||	      S c c}w )
Nadd_link+add_annotation(AnnotationBuilder.link(...))r   r~  r   r  )r8  r9  target_page_indexr   )r   
annotation)r$   r   r   striprF   splitr   floatr7   linkr?   add_annotation)	rp   r  r  r8  r9  r   r  numrP  s	            rs   rL  zPdfWriter.add_linkq  s     	%E	
 dC ::<"%D"'+zz#G#c(Q,sGD o."4(D&++.S40	

 ""w:"NN Hs   CCc                 J    t        ddd        | j                  |||||g| S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_link` instead.
        addLinkrM  r   )r"   rL  )rp   r  r  r8  r9  r   r  s          rs   rX  zPdfWriter.addLink  s5     	#Dg	
 t}}W&6fcQDQQru   )z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 \    	 t        t        | j                  d         S # t        $ r Y y w xY w)N/PageLayout)r   rP   rj   r   rw   s    rs   _get_page_layoutzPdfWriter._get_page_layout  s1    	
D$5$5m$DEE 		    	++c                 <    t        ddd       | j                         S )Y
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        getPageLayoutpage_layoutr   )r$   r[  rw   s    rs   r_  zPdfWriter.getPageLayout  s     	%_mWM$$&&ru   layoutc                     t        |t              sG|| j                  vr.t        dddj	                  | j                        f t
               t        |      }| j                  j                  t        d      |i       y)a  
        Set the page layout.

        :param str layout: The page layout to be used.

        .. list-table:: Valid ``layout`` arguments
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        zLayout should be one of: rj  rZ  N)r   rB   _valid_layoutsr%   joinr  rj   r_   rp   ra  s     rs   _set_page_layoutzPdfWriter._set_page_layout  sp    0 &*-T000/BGGD<O<O4P0P/QR  'F  *]";V!DEru   c                 &    | j                  |       y)a  
        Set the page layout.

        :param str layout: The page layout to be used

        .. list-table:: Valid ``layout`` arguments
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        Nrf  re  s     rs   set_page_layoutzPdfWriter.set_page_layout  s    0 	f%ru   c                 >    t        ddd       | j                  |      S )r^  zwriter.setPageLayout(val)zwriter.page_layout = valr   )r$   rf  re  s     rs   setPageLayoutzPdfWriter.setPageLayout  s'     	%')CW	
 $$V,,ru   c                 "    | j                         S )a  
        Page layout property.

        .. list-table:: Valid ``layout`` values
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        )r[  rw   s    rs   r`  zPdfWriter.page_layout  s    . $$&&ru   c                 &    | j                  |       y r   rh  re  s     rs   r`  zPdfWriter.page_layout  s    f%ru   c                 4    t        ddd       | j                  S )r^  
pageLayoutr`  r   r$   r`  rw   s    rs   ro  zPdfWriter.pageLayout  s     	%\='Jru   c                 ,    t        ddd       || _        y)r^  ro  r`  r   Nrp  re  s     rs   ro  zPdfWriter.pageLayout)  s     	%\='J!ru   )z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 \    	 t        t        | j                  d         S # t        $ r Y y w xY w)N	/PageMode)r   rS   rj   r   rw   s    rs   _get_page_modezPdfWriter._get_page_mode<  s1    	d&7&7&DEE 		r\  c                 <    t        ddd       | j                         S )W
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        getPageMode	page_moder   )r$   rt  rw   s    rs   rw  zPdfWriter.getPageModeB  s     	%]KI""$$ru   r_  c                     t        |t              r|}nE|| j                  vr,t        ddj	                  | j                         t
               t        |      }| j                  j                  t        d      |i       y)rv  zMode should be one of: z, rs  N)r   rB   _valid_modesr%   rd  r  rj   r_   )rp   r_  	mode_names      rs   set_page_modezPdfWriter.set_page_modeK  so     dJ'$(I4,,,-dii8I8I.J-KLh #4(I  *["99!EFru   c                 @    t        ddd       | j                  |       y)rv  zwriter.setPageMode(val)zwriter.page_mode = valr   N)r$   r|  rp   r_  s     rs   setPageModezPdfWriter.setPageMode[  s$     	%%'?	
 	4 ru   c                 "    | j                         S )a  
        Page mode property.

        .. list-table:: Valid ``mode`` values
           :widths: 50 200

           * - /UseNone
             - Do not show outline or thumbnails panels
           * - /UseOutlines
             - Show outline (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        )rt  rw   s    rs   rx  zPdfWriter.page_modef  s    * ""$$ru   c                 &    | j                  |       y r   )r|  r~  s     rs   rx  zPdfWriter.page_mode}  s    4 ru   c                 4    t        ddd       | j                  S )rv  pageModerx  r   r$   rx  rw   s    rs   r  zPdfWriter.pageMode  s     	%ZgF~~ru   c                 ,    t        ddd       || _        y)rv  r  rx  r   Nr  r~  s     rs   r  zPdfWriter.pageMode  s     	%ZgFru   rP  c           
      v   t        t        t        |            }| j                  | j                        d   |   |t        d      <   | j                  |   }|j                  t               |t        d      <   |j                  J |j                  d      dk(  rtt        d      |v rgt        t        |t        d               }t        t        d      |d   t        |d	   t        |      d
               }|j                  |t        d      <   | j                  |      }|j                  j                  |       y )Nz/Kids/P/Annots/Subtyper<  /Destz	/LinkNamerO  r   r  r  )r   r>   _pdf_objectifyr   re   rB   rq   annotationsr8   r  dictr=   r?   r   rd   r   )rp   r   rP  to_addr   tmpr   ind_objs           rs   rU  zPdfWriter.add_annotation  s   &z(BC#'??4;;#?#H#Uz$ zz+&#*5-DI&'++ ::j!W,G1D1NtVJw$789C;''( Z$s)J2GD +///F:g&'""6*(ru   c                    t        d|j                               }|j                  dg       D ]  }|j                         }|j                  dd      }|j                  dd      }t        |t              rt        |      |t	        d      <   _|b|j                         }|j                  dd      }t        |t              st        |      |t	        d      <    |S )z
        Perform some clean up in the page.
        Currently: convert NameObject nameddestination to TextStringObject (required for names/dests list)
        r   r  r  Nr  /D)r   r   r  r   rB   rH   )rp   r   aa_objdacts         rs   
clean_pagezPdfWriter.clean_page  s    
 L$//"34)R( 
	@ALLNE		'4(A))D$'C!Z(-=a-@j)*nn&GGD$'a,,<Q,?C
4()
	@ ru   c                    d }t        |t        t        f      r2t        |d      5 }t	        |j                               }d d d        ||fS t        |t              r|j                  r|j                  }|j                  j                         }|j                  j                  d       t	        |j                  j                               }|j                  j                  |       ||fS t        |d      r<t        |d      r0|j                  d       |j                         }t	        |      }||fS t        d      # 1 sw Y   |fS xY w)Nrbr   seekreadzPdfMerger.merge requires an object that PdfReader can parse. Typically, that is a Path or a string representing a Path, a file object, or an object implementing .seek and .read. Passing a PdfReader directly works as well.)r   r   r   r   r   r  r   _encryptionr]  rs  r  r   r  )rp   rW   encryption_objfr]  	orig_tellfilecontents          rs   _create_streamzPdfWriter._create_stream  s/    gT{+& +! *+, ~%%) +""!(!4!4++-INN"W^^0023F NN	* ~%% Wf%''6*BLLO!,,.K[)F ~%% &> !+, ~%%s   D==E	rq   import_outlineexcluded_fields.c                     |d}t        |t        t        t        f      r=t        |t              rt        |t              s|}|}|}| j                  d|d|||       y| j                  d|||||       y)a0  
        Identical to the :meth:`merge()<merge>` method, but assumes you want to
        concatenate all pages onto the end of the file instead of specifying a
        position.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify a string to build an outline
            (aka 'bookmark') to identify the
            beginning of the included file.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            or a list of pages to be processed
            to merge only the specified range of pages from the source
            document into the output document.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.

        :param List excluded_fields: provide the list of fields/keys to be ignored
            if "/Annots" is part of the list, the annotation will be ignored
            if "/B" is part of the list, the articles will be ignored
        N )r   r   r   rL   boolmerge)rp   rW   r  rq   r  r  s         rs   r   zPdfWriter.append  ss    N " OlUD)$<=%&!.$7&4O!& EJJtWdE>?SJJg|UNOru   )r  import_bookmarkspositionc           
         t        |t              r|}n!| j                  |      \  }}	t        |d      }|d}|)t        t	        dt        |j                                    }nt        |t              r4t        t	        |j                  t        |j                                     }n\t        |t              rnKt        |t              r t        |      dk  rt        t	        |       }nt        |t              st        d      i }
|D ]  }|j                  |   }|j                  J |8| j                  |t        |      dd	gz         |
|j                  j                  <   n=| j                  ||t        |      dd	gz         |
|j                  j                  <   |d
z  }||
|j                  j                     _         |j                   |_        |j"                  j%                         D ]  }|j&                  }t        |d   t(              r#|d   j                  j                  |
v s?|
|d   j                  j                     j                  |t+        d      <   | j-                  |d   |        |^t/        d| j1                  t3        |      t        |
j%                               d   j                  t4              j7                               }n| j9                         }t/        d|j:                  t<        j>                           }|rVt@        jB                  |v rD| jE                  |jG                  t@        jB                  d      |
|      }| jI                  ||d       d	|vrp|
j%                         D ]]  }| jK                  |j                  jG                  d	d      ||
|      }t        |      dkD  r||tM        d	      <   | jO                  |       _ d|vr| jQ                  d|
|       y)ae  
        Merge the pages from the given file into the output file at the
        specified page number.

        :param int position: The *page number* to insert this file. File will
            be inserted after the given number.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify a string to build an outline
            (aka 'bookmark') to identify the
            beginning of the included file.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            or a list of pages to be processed
            to merge only the specified range of pages from the source
            document into the output document.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.

        :param List excluded_fields: provide the list of fields/keys to be ignored
            if "/Annots" is part of the list, the annotation will be ignored
            if "/B" is part of the list, the articles will be ignored
        F)strictNr  r   rC  z:"pages" must be a tuple of (start, stop[, step]) or a list/Br  r   /Pager  rI   )r   r>   rj  ))r   r   r  r   r  r   rq   rL   indicesr   	TypeErrorr   r   r   r   original_pagenamed_destinations_namedDestsvaluesr   rC   rD   r  r   r  rH   r6   r   r  r,  r-  r.  rk   r  _get_filtered_outliner  _insert_filtered_outline_insert_filtered_annotationsrB   r  add_filtered_articles)rp   r  rW   r  rq   r  r  r  r]  r  srcpagesrx  pgr   arroutline_item_typ_ror  paglsts                       rs   r  zPdfWriter.merge	  s   N gy)F%)%8%8%A"FN ve4F" O=q#fll"345Ey)c&,,.? @ABEt$u%#e*/'EE5)L   	EAaB((448<_-y0AA9..445 9=8H8H$"74:K"K9..445 ABDHR**001?	E %% 	 &&--/ 		FD//C$w-4g11778C'/M44::($$ LO$ 00hE		F ##%%$\2*+A.AA  &  *,   $446%v~~bgg'>?bkkS000T*HfG )))4 O+( %77%%)))R8#x s8a<14C
9-.$% &&&r8V<ru   threadc           
      2   |j                  | dd      }| j                  j                  |j                         t	        d|d         }|}d}|| j                  t	        d|d         ||      }|B|Lt	        d| j                  t                     j                               }|}	|j                  |t        d      <   nat	        d| j                  t        t        d	      |j                  i            j                               }
|
j                  |t        d
      <   |
}||t        d      <   |j                  |t        d      <   |d   |t        d      <   t	        d|j                               }d|vrt               |t        d      <   t	        d|d         j                  |j                         t	        d|d
         }||k(  r2	j                  |t        d
      <   |j                  |	t        d	      <   d}||j                  J |j                  S )zE
        clone the thread with only the applicable articles

        T)r   )force_duplicateignore_fieldsr>   r   Nr   r  rE  z/N/Tz/Rr  r8   )r   r  r   r   r   _get_cloned_pagerd   r>   r   rB   r8   )rp   r  rq   r  nthreadfirst_articlecurrent_articlenew_articler  	new_firstnew_article2pag_objs               rs   _add_articles_threadzPdfWriter._add_articles_thread	  s!    ,,$g  
 	G667/>6C26)''\?4#895&C &"&*(()9);<GGI#K !,I0;0N0NGJt,-#'*((,!+D!1;3Q3Q R %*,$L 5A4S4SK
4 01".K03Jt,-070J0JJt,-0?0EJt,-|S^^-=>w&0;GJt,-]GDM29922 ##5t7LMO-/090L0LJt,-.9.L.L	*T*+"&I )J ))55)))ru   fltrc                    t        |t              rt        j                  |      }n%t        |t              st        j                  d      }|j                         D ]  }|j                  }|j                  dd      D ]o  }|j                         d   }|j                  j                  | j                  t        |         vsE|j                  |d   d         s]| j                  |||       q  y)z<
        Add articles matching the defined criteria
        rj  r  r  r  r=  r  N)r   r   recompiler   r  r  r  r   r   r   r^   r   searchr  )rp   r  rq   r  r   ppr  thrs           rs   r  zPdfWriter.add_filtered_articles	  s     dC ::d#DD'*::b>D 	BABVVD"% BllnT*))//t7J7JvJ8 kk#d)H"56--c5&AB	Bru   c                 R   t        |t              ry t        |t              r|j                  |   j                  }nDt        |t
              r"|j                  dd      dk(  r|j                  }nt        |t              r|}	 |j                     j                  S # t        $ r Y y w xY w)N/Typerj  r  )
r   rC   r   rq   r   r>   r  rA   r   r   )rp   r   rq   r  _is        rs   r  zPdfWriter._get_cloned_page	  s     dJ'dC d#66B ./DHHWb4IW4T((Bn-B	?555 		s   B 	B&%B&annotsc                    t               }t        |t              rt        d|j	                               }|D ]6  }t        d|j	                               }|d   dk7  sd|vst        d|d         d   dk7  sd|v rd|vr+|j                  |j                  |       j                         r|d   }t        |t              rGt        |      | j                         v s|j                  |j                  |       j                         t        d	|      }| j                  |d
   ||      }	|	|j                  | d      }
t        |	g|dd  z         |
t        d      <   |j                  |
j                         At        d|d         d   }t        |t              rIt        |      | j                         v s|j                  |j                  |       j                         t        d	|      }| j                  |d
   ||      }	|	|j                  | d      }
t        d|
      }
t        |	g|dd  z         t        d|
d         t        d      <   |j                  |
j                         9 |S )Nr   r>   r  r<  r  r   r  r  r8   r   )r  )r  r   r  )r  )r8   r   rA   r   r   r   r   r   r   r  r  rB   )rp   r  r   rq   r  outlistananor  r   ancs              rs   r  z&PdfWriter._insert_filtered_annotations 
  s8    -fn-&&"3"3"56F &	?B)2==?;CJ7*s?*CI6t<Gc>#%NN399T?#E#EFGA!!S)q6T%=%=%??#NN399T?+M+MN 2 11!A$vF="%))D
)"KC7BA312;7OC
7 34#NN3+A+AB+SY7=a%1v!9!9!;;syy'I'IJ]A.A--adE6BA}!iiGiD"#5s; (ae4 /T;&t,  s'='=>M&	?N ru   nodec                    g }|j                         }|j                  dd      dk(  sd|vr<|j                  dd      }|&|j                         }|| j                  |||      z  }|S ||j                         }t        d|j	                  |            }| j                  t        d|d	         ||      }|
t               }||t        d	      <   d|v r| j                  |d   ||      |_        ng |_        t        |d	   t              rt        |j                        d
kD  r|j                  |       |j                  dd      }||S )zEExtract outline item entries that are part of the specified page set.r  rj  	/Outlinesr  /FirstNr=   r   r  r   /Next)r   r  r  r   _build_outline_itemr  rC   rB   childsr   r   r   )rp   r  rq   r  new_outlineor  s          rs   r  zPdfWriter._get_filtered_outline3
  sM     88GR K/843G88Hd+D(t99$vNN"  "((B(B4(HI))$|QwZ*H%QWX9"A)**W%&t##99$x.%QWXAH!AH!!G*j9S]Q=N&&q)xx. " ru   c           
      h   t               }| j                  |       t        |d         |t        d      <   t	        |d   t
              s]|j                  9d|j                  v r+|j                  d   j                  |       |t        d      <   n|j                  |t        d      <   |j                  t        |j                  j                  dd            |t        d      <   t        |j                  j                  dt        d      t        d      t        d      g            |t        d      <   |S )	Nr  r  r  r  r   r   /Cg        )rI   rd   rH   rB   r   rC   r  r   r   rD   r  r8   r@   )rp   r   n_ols      rs   _clone_outlinezPdfWriter._clone_outlineS
  s    |%5d8n%EZ!"$w-4yy$):)-4)>)>t)DZ%& -1OOZ()99 %1$))--a2H%IDD!"%0		;s+[-={3?OP&DD!"
 ru   outlinesc                    |D ]{  }|j                  dd      dk(  sd|vr|}n@| j                  |      }t        t        |j	                               j                  |||        | j                  |j                  |d        } y )Nr  rj  r  r  )r  r  r   rI   r   r  r  r  )rp   r  r  r  r   nps         rs   r  z"PdfWriter._insert_filtered_outlinej
  s~      	AD xx$3xt7K((.Z!2!2!45BB2vtT))$++r4@	Aru   c                      y)z"To match the functions from MergerNr  rw   s    rs   rl  zPdfWriter.closez
  s    ru   c                 L   || j                         }nt        d|      }d}||j                  |k(  s|j                  dd       |k(  r|gS d|v r4| j	                  |t        t
        |d               }|rd|v r|g|z   S g |z   S d|v r|dz  }t        t        |d         }ny |y y )NrI   r   r  r  r  r   )r  r   r   r  find_outline_itemrR   rI   )rp   r  r  r  rx  ress         rs   r  zPdfWriter.find_outline_item
  s    
 <%%'A\4(Am$$4554(L8s
q=00$d;(&DC '/1}CC"CC!|QQwZ0# mru   c                 &    | j                  ||      S )zZ
        .. deprecated:: 2.9.0
            Use :meth:`find_outline_item` instead.
        )r  )rp   r  r  s      rs   find_bookmarkzPdfWriter.find_bookmark
  s     %%lD99ru   c                    |i | _         yt        |t              r	 | j                   t        |      = yt        |t
              r"	 | j                   t        |j                        = yt	        d      # t        $ r Y yw xY w# t        $ r Y yw xY w)a)  
        reset the translation table between reader and the writer object.
        late cloning will create new independent objects

        :param reader: PdfReader or IndirectObject refering a PdfReader object.
                       if set to None or omitted, all tables will be reset.
        Nzinvalid parameter {reader})r^   r   r   r   r   rA   r   r/  s     rs   reset_translationzPdfWriter.reset_translation
  s     >"$D	*''6
3 /''6::7 899  
  s#   A0  A? 0	A<;A<?	B
B)rj  )rX   rV   )NN)r  )rX   N)r   r  )NNr   r   )NNNN)NNFF/Fit)F)Nr  )NNTN)NNTr  )r  
__module____qualname____doc__r   rt   rx   r   r   BaseExceptionr   r~   propertyr   r   setterrE   rA   rd   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   rS  r   r   decimalDecimalr   r   r=   rH   r:   r   r   r   r  r
  r   r  r  OPTIONAL_READ_WRITE_FIELDr   r,   r(  r*  r0  r2  r4  r6  ALL_DOCUMENT_PERMISSIONSr  r5   r\  r   rh  r   r   r	   r}   rc  rd  re  r  r  r8   r9   r>   r@   rB   rD   rC   rb  r  r  r  rI   r  r  r  r  r  r  r  r  r  r#   rQ   r  r  r  r6   r?   r  rO   rT   r  r  r  r  r  r  r   r  r  r  r.  r1  r4  r6  rF   rH  rJ  rL  rX  rc  rP   r[  r_  rf  ri  rk  r`  ro  rz  rS   rt  rw  r|  r  rx  r  rU  r  r   r   r  rL   r   rM   r  r  r   r  r  r  r  r  r  rl  rR   r  r  r  r  ru   rs   rV   rV      sr   
&# &#T &#P
%4./% m$% M*	%
 
% E   "U "t " "&y &^ & @D(,;!$^";<; n%; 
	;2	$n,-	$		$ (*	   #~.45   }	 
 
 DN. (*@@  }@ 
	@( (*22  }2 
	2  ')	EE E  }	E
 
E$ ')	<< <  }	<
 
< NRJ#C=J=Ec]J	J.)# )* )0 0%S % @tJ' @ @
 HLe_5=e_	( HL	2e_	25=e_	2		2 ,0,0	( ) 	
 
: ,0,0	<(< )< 	<
 
< 	t["24DD	E < U4k:+M%N SW  & -  -  -D' ' 'PTs PT%U
2C PT PTd	1	1!&sEz!2	1		1 EI// $Hj\4-?$@A/ 
	/> EIAA $Hj\4-?$@AA 
	A& 5	?? S#X? 	?
 
?J 5	GG S#XG 	G
 
G L Lt L	0i 	0D 	0 EIAA $Hj\4-?$@AA 
	A. EICC $Hj\4-?$@AC 
	C" (,(,2J"&#'\ }\  !\  	\ 
 0\  3-\  C=\  
\ |C: C$ C4E$"34 tRx 4 J  49  .
 d3i TW .Z .D . 
1$sCx. 
1T 
1!c3h !D !O3	
O3 
O3b$,^ $, $,L ~ '	 'n '* +  ' ' ''
 '![ !F*+ * AE:>:>48#$j* <=#$ dJ67#$ dJ67	#$
 D*j01#$ 
#$P ;??J
*+? dJ67? 
	?  @D??(0(<?	? >2 ;?:>	V%V dJ67V dJ67	V
 
V 3V* >2LP@+@5=j5I@	@ 3@ >2LP@+@5=j5I@	@ 3@" ;?:>BF!%JOJO 4^S@AJO dJ67	JO
 dJ67JO eE5%$78#=>?JO JO JO JO #JO 
JO` ;?6:

 
 dJ67	

 eUE123
 
 
 
 
 

> ;?6:

 
 dJ67	

 eUE123
 
 
 
 
 

8

%49.+:U4V	" 15$($"9-$ y!$ 
	$<77	7  &*!%	'' c]' #	'
 
'R::#&:	:(#KCt KC KC\ .3	:&*	:		:*CT *Cd *CZ .3	8&*	8		8  )-!%IEIE IE 	IE
 %IE #IE 
IE` )-88 8 	8
 %8 
8( )-OO O 	O
 %O O O 
OH )-RR R 	R
 %R R R 
R&N(:"6 'x
3 'FuZ-C'D F FB&j &T &4	-J 	-4 	- 'Xj1 ' '0 &* & & &  HZ0     " " " "L 6 %Xl3 %G, G4 G 	! 	! 	! %8L1 % %, !l !t ! ! (<0   __\ d  )# )4S> )d )2uZ%?@ Z &"&T;	9:"&	vx
++	,"&R  #GK3{It343 y%S/5c33GcR
3 )U38_eCcM.BDIM
3 3 "%S	5c?(B"CD3 
3j >DTU
 '+)-#GI3- t[)34 sm	
 &  "%S	5c?(B"CD 
 VB7* 7* CO$7* 	7*
 
7*rBGSL!B CO$B 	B
 
B,D#~z:EF CO$ 	
 
.	!*1nd+;&<<=1 1 CO$	1
 1 
k	1f CO$ 	
 
k	@; : 6 ;?	A{#A j.01A dJ67	A
 
A  '+38n {# 
$s)		< >2 '+	:38n	: {#	: 
$s)			: 3	: @D:D)^;<:	:ru   rV   r   rX   c                    t        | t              r| S t        | t              r?t               }| j	                         D ]   \  }}t        |      }t        |      }|||<   " |S t        | t              r-t               }| D ]  }|j                  t        |              |S t        | t              r'| j                  d      rt        |       S t        |       S t        | t        t        f      rt        |       S t!        dt#        |        d      )Nr  z
type(obj)=z! could not be casted to PdfObject)r   rE   r  r>   r  rB   r  r   r8   r   r   
startswithrH   r   rS  r@   r  type)r   r  r[  r  name_keycasted_valuer  els           rs   r  r  
  s    #y!
#t!#))+ 	,JC!#H)%0L+F8	, 	C	m 	+BJJ~b)*	+
	C	>>#c?"#C((	C#u	&3!c#DE
 	
ru   r  r  r  r  r  c                     t               }| | |t        d      <   |j                  t        d      t        |      i       |rt	        |t
              rt        |      }t        j                  d      }|j                  t        d      t        |D cg c]/  }t        t        j                  |      j                  |            1 c}      i       |s|r5d}|r|dz  }|r|dz  }|j                  t        d      t        |      i       |S c c}w )	Nr  r  z1.00000r  r   r   r   r   )rI   rB   r_   rJ   r   r   rK   r  r  r8   r@   quantizerD   )	r  r  r  r  r  r  preccformat_flags	            rs   r  r  
  s    <L)3Z%&x "6u"=	

 eS!u%Ey)4 +MRS[!3!<!<T!BCS#	
 1K1KZ-|K/HIJ Ts   4Dc                   ,     e Zd Zdededdf fdZ xZS )PdfFileWriterr  kwargsrX   Nc                 >    t        ddd       t        |   |i | y )Nr  rV   r   )r$   superrt   )rp   r  r  r  s      rs   rt   zPdfFileWriter.__init__  s!    $_k7K$)&)ru   )r  r  r  r
   rt   __classcell__)r  s   @rs   r  r    s"    *c *S *T * *ru   r  )|rf   r  r  loggingrI  r  rt  rG  r   r   hashlibr   ior   r   r   pathlibr   typesr   typingr	   r
   r   r   r   r   r   r   r   r   r   r   r   r  r   _pager   r   _readerr   	_securityr   r   r   _utilsr   r   r    r!   r"   r#   r$   r%   	constantsr&   r'   r   r(   r)   rk   r*   rN  r+   r,   r-   r.   r/   r0   r  r1   r`   r2   rK  r3   r-  r4   r5   genericr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   	pagerangerL   rM   rN   rO   rP   rQ   rR   rS   rT   	getLoggerr  r   r  r  rV   r   r   r  rS  r  r  r  r  ru   rs   <module>r     s  <      	      & &       $ +  - -	 	 	 6 . ( ! 5  , , - ( =     0 0   
		8	$ &aL 0A {(: {(:|Q
d38nc3S	AB 
y 
8!dN*+!! ueU*+S$67! 	!
 ! !H*I *ru   