
    :Qg1                       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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 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*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl0m2Z3 ddl0m4Z4 ddl0m5Z6 ddl0m7Z8 ddl0m9Z9m:Z:m;Z;m<Z<m=Z= ddl0m>Z? ddl0m@ZA ddl0mBZC ddl0mDZE ddl0mFZFmGZG ddlHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddlm]Z]m^Z^m_Z_m`Z`maZambZbmcZc  ej                  ee      Zf e:d       Zg eGd      Zh G d d      Zideeejef   ejekee   f   deVfdZldeRd ejd!eeemememf   ejdf   d"end#endeZfd$Zo G d% d&ei      Zpy)'    N)md5)BufferedReaderBufferedWriterBytesIOFileIO)Path)TracebackType)
AnyCallableDequeDictListOptionalTupleTypeUnioncast   )
PageObject_VirtualList)	PdfReader)_alg33_alg34_alg35)StrByteType
StreamType_get_max_pdf_version_headerb_deprecate_bookmarkdeprecate_with_replacementlogger_warning)AnnotationDictionaryAttributes)CatalogAttributes)CatalogDictionary)Core)EncryptionDictAttributes)FieldDictionaryAttributes	FieldFlag"FileSpecificationDictionaryEntriesGoToActionArgumentsInteractiveFormDictEntries)PageAttributes)PagesAttributes)StreamAttributes)TrailerKeys)TypFitArgumentsUserAccessPermissions)AnnotationBuilderArrayObjectBooleanObjectByteStringObjectContentStreamDecodedStreamObjectDestinationDictionaryObjectFloatObjectIndirectObject
NameObject
NullObjectNumberObject	PdfObjectRectangleObjectStreamObjectTextStringObject
TreeObjectcreate_string_object
hex_to_rgb)BorderArrayTypeFitType
LayoutTypeOutlineItemTypePagemodeTypeZoomArgsType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e   dee   defdZdedefdZdedeeegdf   ddfdZddZdeddfdZdeddfdZddededdfdZddededd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(jR                     d%ee(jR                     dedefd(Z*	 	 	 dd$ee(jR                     d%ee(jR                     dedefd)Z+ede,de-e.e/f   fd*       Z0e0j                  d+e,de1e-ef   ddfd,       Z0d-e1ddfd.Z2d-e1ddfd/Z3d0e1d1e,e1ef   ddfd2Z4d3e1d4e,e1ef   ddfd5Z5	 dd6e6d7eeegdf      ddfd8Z7	 dd6e6d7eeegdf      ddfd9Z8e9fded:e:e1ef   d;e;ddfd<Z<e9fded:e:e1ef   d;e;ddfd=Z=d6e6ddfd>Z>d6e6ddfd?Z?	 dd6e6d7eeegdf      ddfd@Z@	 dd6e6d7eeegdf      ddfdAZAdddBeBddfdCee1   dDee1   dEeCdFeDdGee1   dHee1   ddfdIZEdJeFddfdKZGdJe,eHef   deIeCe,eJeKeLeMf   f   fdLZNdJeFde#e   fdMZOdJeFdNe#e   defdOZPdJeFddfdPZQdQe:e1ef   ddfdRZRdQe:e1ef   ddfdSZSdTe,eTeUeVeWeeXeeYe.eZf
   ddfdUZ[d1edefdVZ\dedefdWZ]dedefdXZ^de_fdYZ`deTfdZZaedeTfd[       Zbde_fd\ZcdeTfd]ZddeTfd^Ze	 	 	 dd_e,dee_f   d`e,de_ef   d+e,dee_f   defdaZf	 dd+e,ee_f   d`e,de_ef   defdbZg	 dd+ed`ee_   defdcZh eidde      	 dddejd`ee_   defdf       Zk eidde      	 dddejd`ee_   defdg       Zl eidde      	 dddejd`ee_   defdh       Zm	 	 	 	 	 	 dddidje1dee   d`e,de_ef   dkee,eIe%e%e%f   e1f      dleCdmeCdnendoeodpee   defdqZp	 	 	 	 	 ddje1dped`e,de_ef   dkeeIe%e%e%f      dleCdmeCdnendoeodefdrZq	 	 	 	 	 ddje1dped`e,de_ef   dkeeIe%e%e%f      dleCdmeCdnendoeodefdsZrddtZs	 	 dd_ee   d+ee   defduZtd+edefdvZu	 	 ddje1dee   dpee   defdwZvdje1dpedefdxZwddyZxddzZydd{eCddfd|Zz	 dd}eCddfd~Z{dd{eCddfdZ|	 dd}eCddfdZ}	 	 ddede1de~deeT   dpee   ddfdZ	 ddpede1de~deeT   ddf
dZ	 	 ddped_ede~deeT   dnendoeoddfdZ	 	 ddped_ede~deeT   dnendoeoddfdZdZdee   fdZdee   fdZde,eXef   d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:e1e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           	      8   d| _         g | _        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	                  t        t        j                        t        t&        j(                        t        t&        j*                        | j                  i       d | _        || _        || _        d| _        y )Ns   %PDF-1.3z/Pagesr   z	/ProducerPyPDF2zutf-16beF)_header_objects_idnum_hashr9   updater<   PATYPECOUNTr>   KIDSr3   _add_object_pagesrD   codecsBOM_UTF16_BEencode_infoCOCATALOGPAGES_root_root_objectrO   with_as_usage)selfrO   pagesinforoots        K/var/www/html/answerous/venv/lib/python3.12/site-packages/PyPDF2/_writer.py__init__zPdfWriter.__init__   s6   ")+8: !"277#Z%9288$l1o277#[]	
 &&u-  !;')=''(//**EE*	
 %%d+
  !277#Z

%;288$dkk	
 04
 "    c                     d| _         | S )z+Store that writer is initialized by 'with'.T)rf   rg   s    rk   	__enter__zPdfWriter.__enter__   s    !rm   exc_typeexc	tracebackc                 T    | j                   r| j                  | j                          yy)zWrite data to the fileobj.N)rO   write)rg   rq   rr   rs   s       rk   __exit__zPdfWriter.__exit__   s      <<JJt||$ rm   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.
        rS   ro   s    rk   
pdf_headerzPdfWriter.pdf_header   s     ||rm   
new_headerc                     || _         y Nrx   )rg   rz   s     rk   ry   zPdfWriter.pdf_header   s	    !rm   objc                 x    | j                   j                  |       t        t        | j                         d|       S )Nr   )rT   appendr;   lenrg   r}   s     rk   r[   zPdfWriter._add_object   s,    S!c$--0!T::rm   indirect_referenceidoc                     |)|t        d      |}t        j                  dt               |J |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 3.0.0.zpdf must be selfr   )
ValueErrorwarningswarnDeprecationWarningpdfrT   idnum)rg   r   r   s      rk   
get_objectzPdfWriter.get_object   s~    
 ?!- ]  &)"]&
 *	
*!!T)/00}}/559::rm   c                 <    t        dd       | j                  |      S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        	getObjectr   )r    r   )rg   r   s     rk   r   zPdfWriter.getObject   s     	#;=s##rm   pageactionc                    t        t        |t        j                           t        j
                  k(  sJ |j                  Q|j                  j                  }t        |t              r|j                         }t        | j                  |      | _        | j                  |t        t        j                        <   | j                  |      }t        t        | j!                  | j                              } ||t        j"                     |       t        t$        |t        j&                           }t)        |dz         |t        t        j&                        <   y )Nr   )r   strrW   rX   ra   PAGEr   ry   
isinstancer_   r   r\   r<   PARENTr[   r9   r   rZ   intrY   r>   )rg   r   r   otherpage_indrh   
page_counts          rk   	_add_pagezPdfWriter._add_page   s     Cbgg'27722288HH''E%%9$//5QDO&*kkZ		"###D)%tt{{'CDuRWW~x(#uRXX/
&2:>&Bj"#rm   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 : )re   r$   	ACRO_FORMrV   r<   r;   r   rT   r+   NeedAppearancesr4   	Exceptionloggererrorrepr)rg   catalogneed_appearancesrr   s       rk   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                         y)a&  
        Add a page to 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. Should be
            an instance of :class:`PageObject<PyPDF2._page.PageObject>`
        N)r   listr   rg   r   s     rk   add_pagezPdfWriter.add_page  s     	tT[[)rm   c                 >    t        dd       | j                  |       y)zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        addPager   N)r    r   r   s     rk   r   zPdfWriter.addPage  s     	#9j9drm   indexc                 0    | j                  |fd       y)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     rk   <lambda>z'PdfWriter.insert_page.<locals>.<lambda>-  s    !((5!*< rm   N)r   rg   r   r   s     `rk   insert_pagezPdfWriter.insert_page%  s     	t<=rm   c                 @    t        dd       | j                  ||       y)zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        
insertPager   N)r    r   r   s      rk   r   zPdfWriter.insertPage/  s     	#<?u%rm   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   r\   r   rW   rZ   )rg   r   r   rh   s       rk   get_pagezPdfWriter.get_page8  s     !& !LMM&&(? %K:#5=>>T#s(^T__T[[%ABJbgg{ ; F F HIIrm   c                 <    t        dd       | j                  |      S )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        getPagezwriter.pages[page_number])r    r   )rg   r   s     rk   r   zPdfWriter.getPageO  s     	#9.IJ}}Z((rm   c                     t        t        t        t        f   | j	                  | j
                              }t        |t        d               S )Nz/Count)r   r   r   r
   r   r\   r   r<   )rg   rh   s     rk   _get_num_pageszPdfWriter._get_num_pagesX  s8    T#s(^T__T[[%AB5H-.//rm   c                 :    t        dd       | j                         S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        getNumPageszlen(writer.pages))r    r   ro   s    rk   r   zPdfWriter.getNumPages\  s     	#=2EF""$$rm   c                 B    t        | j                  | j                        S )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r   r   ro   s    rk   rh   zPdfWriter.pagese  s     D//??rm   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   )rg   r   r   r   s       rk   add_blank_pagezPdfWriter.add_blank_pagej  s)     ++D%@drm   c                 >    t        dd       | j                  ||      S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        addBlankPager   )r    r   )rg   r   r   s      rk   r   zPdfWriter.addBlankPage}  s"     	#>3CD""5&11rm   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   rh   mediaboxr   r   r   r   r   )rg   r   r   r   oldpager   s         rk   insert_blank_pagezPdfWriter.insert_blank_page  s{    & =FN0C0C0E0Ie/Sjj'G$$**E%%,,F++D%@u%rm   c                 @    t        dd       | j                  |||      S )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        insertBlankPager   )r    r   )rg   r   r   r   s       rk   r   zPdfWriter.insertBlankPage  s%     	##46IJ%%eVU;;rm   c                 "   d| j                   vry| j                   d   }t        |t        t        f      rt	        t        |            S t        |t
              r	 |dd \  }}|dd }t        d||g| S y# t        $ r t        d|       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 )re   r   r   bytesrD   r3   r8   r   )rg   oar   typarrays        rk   open_destinationzPdfWriter.open_destination  s      1 11}-b3,''B00K(=qG	c12"<sCUCC   ="6rd ;<<=s   A6 6Bdestc                    |	 | j                   d= y t        |t              r"t	        |      | j                   t        d      <   y t        |t              r#|j                  | j                   t        d      <   y t        |t              rWt        d|j                  |j                  n	t               t	        d            j                  | j                   t        d      <   y y # t        $ r Y y w xY w)Nr   Opening/Fit)re   KeyErrorr   r   rB   r<   r8   
dest_arrayr   r   r=   rg   r   s     rk   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)re   r9   r<   CANAMESr   r3   rV   rW   rX   rB   r   rD   r   uuiduuid4r[   )rg   r   namesjs_listjss        rk   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''+,rm   c                 <    t        dd       | j                  |      S )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        addJSr   )r    r   )rg   r   s     rk   r   zPdfWriter.addJS  s     	#7H5{{:&&rm   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)r7   set_datarV   r<   rW   rX   r9   r)   FrD   EFr   r   r3   re   )rg   r   r   
file_entryef_entryfilespecembedded_files_names_dictionaryembedded_files_dictionarys           rk   add_attachmentzPdfWriter.add_attachment  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Srm   fnamefdatac                 >    t        dd       | j                  ||      S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        addAttachmentr   )r    r   )rg   r   r   s      rk   r   zPdfWriter.addAttachment`  s"     	#?4DE""5%00rm   readerafter_page_appendc                    t        |j                        }t        | j                        }t        |      D ]H  }|j                  |   }| j                  |       | j                  ||z      }t	        |      sA ||       J 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   rh   ranger   callable)rg   r   r   reader_num_pageswriter_num_pagesreader_page_numberreader_pagewriter_pages           rk   append_pages_from_readerz"PdfWriter.append_pages_from_readerk  sz    & v||,tzz? #((8"9 	/ ,,'9:KMM+&**%58J%JKK)*!+.	/rm   c                 @    t        dd       | j                  ||       y)zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        appendPagesFromReaderr  N)r    r  rg   r   r   s      rk   r  zPdfWriter.appendPagesFromReader  s!     	##:<VW%%f.?@rm   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FTrV   r<   r"   ASVrB   Ffr>   )rg   r   r
  r  jwriter_annotwriter_parent_annotfields           rk   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 &	rm   c                 @    t        dd       | j                  |||      S )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        updatePageFormFieldValuesr  )r    r  )rg   r   r
  r  s       rk   r  z#PdfWriter.updatePageFormFieldValues  s)     	#')H	
 11$FFrm   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   r9   trailerTKROOTre   rg   r   s     rk   clone_reader_document_rootz$PdfWriter.clone_reader_document_root  s!     !!16>>"''3JKrm   c                 >    t        dd       | j                  |       y)ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        cloneReaderDocumentRootr"  N)r    r"  r!  s     rk   r$  z!PdfWriter.cloneReaderDocumentRoot  s"     	#%'C	
 	''/rm   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)r"  r  r	  s      rk   clone_document_from_readerz$PdfWriter.clone_document_from_reader  s#      	''/%%f.?@rm   c                 @    t        dd       | j                  ||       y)ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        cloneDocumentFromReaderr&  N)r    r&  r	  s      rk   r(  z!PdfWriter.cloneDocumentFromReader  s%     	#%'C	
 	''0ABrm   Tuser_passwordowner_password
use_128bitpermissions_flaguser_pwd	owner_pwdc           	      H   |$|t        d      t        j                  d       |}|t        d      |/|t        d      d}d}t        j                  | d| d	
       |}||}|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,        j.                        <   t	        |      |t#        t,        j0                        <   t	        |      |t#        t,        j2                        <   t)        |      |t#        t,        j4                        <   | j7                  |      | _        || _        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==3.0.0.zuser_password may not be NonezIThe argument owner_pwd of encrypt is deprecated. Use owner_password only.r.  r*  # is deprecated as an argument. Use  insteadmessager      g      0@r   g      @utf8Fz	/Standardz/V   )r   r   r   r   r5   r   r   r   timer_   digestrandomr3   _IDr   r   r9   r<   SAFILTERr>   LENGTHEDROUPr[   _encrypt_encrypt_key)rg   r)  r*  r+  r,  r-  r.  old_termnew_termr  revkeylenrB  r@  ID_1ID_2rA  keyencrypts                      rk   rL  zPdfWriter.encrypt  sd   8 ( = 
 (
 !) <== ) _  '+#*$GzQYZ
 "+!*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!8O8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rm   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
)hasattrrO  r!   namer  rd   r[   re   _sweep_indirect_references_write_header_write_xref_table_write_trailerru   r   )rg   rM  object_positionsxref_locations       rk   write_streamzPdfWriter.write_streamy  s    66"s&++'= &6 6 zz))$*;*;<DJ 	''

3--f5..v7GHF#R-i@ABrm   c                     d}|dk(  rt        d| d      t        |t        t        f      rt	        |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   rY  rf   close)rg   rM  my_files      rk   ru   zPdfWriter.write  sm     R<~fX[ABBfsDk*FD)FG&!LLNrm   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
rC  z<ir4  r   r         s   
endobj
)ru   ry   	enumeraterT   r   tellr   r   rQ  rC  r   structpackrD  r   r   r8  minwrite_to_stream)
rg   rM  rW  ir}   r   rK  pack1pack2md5_hashs
             rk   rT  zPdfWriter._write_header  sp   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C"3x0H"#HSS1B1B-Ca-G%HIC##FC0]+!	,"  rm   rW  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 
)rd  ru   r   r   rT   )rg   rM  rW  rX  offsets        rk   rU  zPdfWriter._write_xref_table  s    YR"S/!34B789R1T(!E#;e456& 	<FLLvdm1QsG59:;	<rm   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   r:  rC  )ru   r9   rV   r<   r  SIZEr>   r   rT   r   rd   INFOr`   rQ  r:  IDrC  ENCRYPTrh  )rg   rM  r  s      rk   rV  zPdfWriter._write_trailer  s    \""$277#\#dmm2Dq2H%I277#TZZ277#TZZ	
 4)-GJruu%&4$.2mmGJrzz*+-rm   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   itemsrD   r<   r   r`   rV   )rg   rv  argsrK  values        rk   add_metadatazPdfWriter.add_metadata  sW     u{{}- 	@JC$8$?DC!	@

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

            Use :meth:`add_metadata` instead.
        addMetadatar{  N)r    r{  )rg   rv  s     rk   r}  zPdfWriter.addMetadata  s     	#=.A% rm   rj   c                    t        j                         }g }d }g }d }|j                  ||||f       t        |      r|j	                         \  }}}}t        |t        t        f      r6|j                         D ]"  \  }}	|j                  |	|||||gz   ng f       $ nkt        |t              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   r3   r9   rx  r;   _resolve_indirect_objectr   r   rA   r[   
hash_valuerU   )rg   rj   stack
discoveredparentgrant_parents	key_or_idr   rK  rz  update_hashesgrant_parentold_hashr   indirect_reference_objs                  rk   rS  z$PdfWriter._sweep_indirect_references  s   ,  	 
)+	 	dFI}=>%j5:YY[2D&)] $.> ?@"&**, JCLL! 8>8JMVH4PR	 D.144T:t9J.%%c$i0LL$//"3T4!DE &#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	3M %jj@=s   .G4c                    t        |j                  d      rL|j                  j                  j                  r,t	        d|j                  j                  j
                         |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.
        rM  zI/O operation on closed file: zUnable to resolve [z: z], returning NullObject insteadr   )rQ  r   rM  closedr   rR  r   r!   	__class__r  r=   r  rU   r;   r   r[   )rg   r   real_objr  s       rk   r  z"PdfWriter._resolve_indirect_objectC  s    488X&488??+A+A=dhhoo>R>R=STUU 88&&t,%dnn&=&=%>b G/ /
 "|H((*
 )))##J//88t+9$**a+NDZ( ,0+;+;H+EDZ(
++rm   c                     | j                   j                  |      dz   }t        |d|       }|j                         |k(  sJ |S Nr   r   )rT   r   r;   r   )rg   r}   r   refs       rk   get_referencezPdfWriter.get_referencef  sC    ##C(1,UAt,~~3&&&
rm   c                 <    t        dd       | j                  |      S )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        getReferencer  )r    r  r   s     rk   r  zPdfWriter.getReferencel  s     	#>?C!!#&&rm   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  )ra   OUTLINESre   r   rC   rT   r   r;   r   rV   r[   r<   )rg   outliner   outline_refs       rk   get_outline_rootzPdfWriter.get_outline_rootu  s    ;;$+++:t'8'8'EFGMM''014E(48K))+w666  !lGNN2**73K9DDj56rm   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
        )ra   THREADSre   r   r3   r<   )rg   threadss     rk   get_threads_rootzPdfWriter.get_threads_root  s_     ::***;(9(9"**(EFG  "mG8?Dj45rm   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  ro   s    rk   r  zPdfWriter.threads  s     $$&&rm   c                 :    t        dd       | j                         S )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        getOutlineRootr  )r    r  ro   s    rk   r  zPdfWriter.getOutlineRoot  s     	##35GH$$&&rm   c                 J   t         j                  | j                  v rt        | j                  t         j                     t              rt        t        | j                  t         j                           }| j                  j                  |      dz   }t        |d|       }|j                         |k(  sJ t         j                  |v rt        |t         j                     t              rt        t        |t         j                           }| j                  j                  |      dz   }t        |d|       }|j                         |k(  s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   re   r   r9   r   rT   r   r;   r   DESTSr3   r<   r[   )rg   r   r   	names_refdests	dests_refnds          rk   get_named_dest_rootzPdfWriter.get_named_dest_root  s   88t(((Zbhh')9.
 )4+<+<RXX+FGEMM''.2E&ua6I'')U222xx5 ZbhhAQ%R-uRXX?++E2Q6*5!T:	 ++-66688u$k5?;B* 	' %B24E*RXX./$ 	! )* ,,U3	.7j*+ ].0j*+ 	 %&E((/I6?Dj23$&E((/I*3E*RXX&'B*,E*RXX&'	rm   c                 :    t        dd       | j                         S )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        getNamedDestRootr  )r    r  ro   s    rk   r  zPdfWriter.getNamedDestRoot  s     	##57LM''))rm   page_destinationr  c                 ,   ||t        d      |"d}d}t        j                  | d| d       |}|t        d      || j                         }t	        t
        |j                               }| j                  |      }|j                  ||        |S )Nz[The argument dest of add_outline_item_destination is deprecated. Use page_destination only.r   r  r0  r1  r2   page_destination may not be None)	r   r   r   r  r   rC   r   r[   	add_child)rg   r  r  r   rE  rF  page_destination_refs          rk   add_outline_item_destinationz&PdfWriter.add_outline_item_destination  s     'D,<m  H)HMMj CH:XV
  $#?@@>**,Fj&"3"3"56#//0@A-t4##rm   c                 >    t        dd       | j                  ||      S )zf
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_destination` instead.
        add_bookmark_destinationr  r    r  rg   r   r  s      rk   r  z"PdfWriter.add_bookmark_destination  s'     	#&(F	
 00v>>rm   c                 >    t        dd       | j                  ||      S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_destination` instead.
        addBookmarkDestinationr  r  r  s      rk   r  z PdfWriter.addBookmarkDestination  s'     	#$&D	
 00v>>rm   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)
rC   r   rx  r<   r   rV   r9   r   r[   r  )	rg   r  r  outline_item_objectkvr   a_dict
action_refs	            rk   add_outline_item_dictzPdfWriter.add_outline_item_dict  s     )l++-. 	8DAq67
3q6 23	8""<0<%'F*L,>?FV\\^, /1-.z#a&)*/))&1J4>
4 01001DfMMrm   c                 >    t        dd       | j                  ||      S )z_
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_dict` instead.
        add_bookmark_dictr  r    r  rg   r  r  s      rk   r  zPdfWriter.add_bookmark_dict#  s#     	##68OP)),??rm   c                 >    t        dd       | j                  ||      S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_dict` instead.
        addBookmarkDictr  r  r  s      rk   r  zPdfWriter.addBookmarkDict/  s#     	##46MN)),??rm   )pagenumtitlecolorbolditalicfitry  r  c          
      Z   ||t        d      |"d}
d}t        j                  |
 d| d       |}|t        d      t        |      }|	D cg c]  }|
t	               n
t        |       }}t        t        d|z   d	z         |t        |      g| }| j                  t        t        t        j                        |j                  t        t        j                        t        d
      i            }t        |||||      }|| j                         }| j                  ||      S c c}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 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 str fit: The fit of the destination page. See
            :meth:`add_link()<add_link>` for details.
        MThe argument pagenum of add_outline_item is deprecated. Use page_number only.r  r   r0  r1  r2  page_number may not be None/z outline item/GoTo)r   r   r   r>   r=   r8   r<   r[   r9   r*   Dr   S_create_outline_itemr  r  )rg   r  r   r  r  r  r  r  r  ry  rE  rF  page_refa	zoom_argsr   r  r  s                     rk   add_outline_itemzPdfWriter.add_outline_item;  sT   4 "w':_   H$HMMj CH:XV
 "K:;;,DH#
?@AIJL<?:#
	 #
 sU{_45sO
 	
 %%2445t2445z'7J

 ,JufdS>**,F00vFF-#
s   D(c           	      L    t        dd        | j                  |||||||g| S )zZ
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item` instead.
        add_bookmarkr  r    r  	rg   r  r  r  r  r  r  r  ry  s	            rk   r  zPdfWriter.add_bookmark}  s;      	#>3EF$t$$7FE4
?C
 	
rm   c           	      L    t        dd        | j                  |||||||g| S )z[
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item` instead.
        addBookmarkr  r  r  s	            rk   r  zPdfWriter.addBookmark  s;      	#=2DE$t$$7FE4
?C
 	
rm   c                     t        d      )NzIThis method is not yet implemented. Use :meth:`add_outline_item` instead.)NotImplementedErrorro   s    rk   add_outlinezPdfWriter.add_outline  s    !W
 	
rm   c                     ||t        d      |"d}d}t        j                  | d| d       |}|t        d      | j                  |      }| j	                         }|j                  |d   |g       |S )	Nz[The argument dest of add_named_destination_object is deprecated. Use page_destination only.r   r  r0  r1  r2  r  /Title)r   r   r   r[   r  extend)rg   r  r   rE  rF  r  r  s          rk   add_named_destination_objectz&PdfWriter.add_named_destination_object  s    
 'D,<m  H)HMMj CH:XV
  $#?@@#//0@A%%'
		#H-/CDE##rm   c                 <    t        dd       | j                  |      S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        addNamedDestinationObjectr  )r    r  r   s     rk   r  z#PdfWriter.addNamedDestinationObject  s%     	#')G	
 0066rm   c           
      P   ||t        d      |"d}d}t        j                  | d| d       |}|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%                         }	|	j'                  ||g       |S )
Nr  r  r   r0  r1  r2  r  i:  r  )r   r   r   r   r\   rW   rZ   r9   rV   r<   r*   r  r3   r0   FIT_Hr>   r  r[   r  r  )
rg   r  r   r  rE  rF  r  r   dest_refr  s
             rk   add_named_destinationzPdfWriter.add_named_destination  s    "w':_   H$HMMj CH:XV
 "K:;;??4;;/8E!.001;z/*?*?@,sBST4 .001:g3F		
 ##D)%%'
		5(#$rm   c                 >    t        dd       | j                  ||      S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        addNamedDestinationr  )r    r  )rg   r  r  s      rk   r  zPdfWriter.addNamedDestination  s#     	##8:QR))%99rm   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   r9   r   r\   r3   rW   rZ   r  r  )rg   pg_dictrh   r   r  s        rk   remove_linkszPdfWriter.remove_links  sn    ')EF['"''"23 	(D,dood.CDHyyH$RYY'	(rm   c                 :    t        dd       | j                         S )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        removeLinksr  )r    r  ro   s    rk   r  zPdfWriter.removeLinks  s     	#=.A  ""rm   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   r9   r   r\   r3   rW   rZ   r   r6   
operationsrB   r   r   r   __setitem__r<   )rg   r  r  rh   jump_operatorsr   r  content_operationsseq_graphicsoperandsoperatortextri  s                 rk   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rm   ignoreByteStringObjectc                 <    t        dd       | j                  |      S )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        removeImagesr  )r    r  rg   r  s     rk   r  zPdfWriter.removeImagesc  s      	#>?C!!"899rm   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   r9   r   r\   r   r;   rW   rZ   r   r   r6   r  rB   r5   r   r   r  r<   )rg   r  r  rh   r   r  r  r  r  r  ri  s              rk   remove_textzPdfWriter.remove_textn  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rm   c                 <    t        dd       | j                  |      S )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        
removeTextr   )r    r   r  s     rk   r"  zPdfWriter.removeText  s      	#<? 677rm   urirectborderc                 p   |t        j                  d       |}| 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,        j.                        t        t(        j0                        t        d      t        t(        j2                        |t        t(        j4                        |t        d	      t        d
      t        t(        j6                        t        |	      t        d      |i       | j9                  |      }t,        j.                  |v r#|t,        j.                     j                  |       yt        |g      |t        t,        j.                        <   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.
        NzKThe 'pagenum' argument of add_uri is deprecated. Use 'page_number' instead.r4     r   r   z/URI/Linkz/Hz/Ir  )r   r   r   r\   rW   rZ   r   r   r   r
   r<   r   r3   r   r>   r   r@   r9   rV   rB   r"   r   r  r  SubtyperB  RectBorderr[   )rg   r   r#  r$  r%  r  	page_linkr  n
border_arrdash_patternlnk2lnklnk_refs                 rk   add_urizPdfWriter.add_uri  s'   * MM] "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   >J.,J3c                 B    t        dd       | j                  ||||      S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        addURIr3  )r    r3  )rg   r  r#  r$  r%  s        rk   r5  zPdfWriter.addURI  s#     	#8Y7||GS$77rm   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                  |||||      }| j                  ||      S c c}w )	Nadd_link+add_annotation(AnnotationBuilder.link(...))r   ro  r   )r$  r%  target_page_indexr  fit_args)r   
annotation)r    r   r   stripr@   splitr   floatr2   linkadd_annotation)	rg   r  r  r$  r%  r  ry  numr<  s	            rk   r7  zPdfWriter.add_link  s     	#E	
 dC ::<"%D"'+zz#G#c(Q,sGD o."4(D&++.

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

            Use :meth:`add_link` instead.
        addLinkr8  r   )r    r7  )rg   r  r  r$  r%  r  ry  s          rk   rD  zPdfWriter.addLink  s5     	#Dg	
 t}}W&6fcQDQQrm   )z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 \    	 t        t        | j                  d         S # t        $ r Y y w xY w)N/PageLayout)r   rH   re   r   ro   s    rk   _get_page_layoutzPdfWriter._get_page_layout:  s1    	
D$5$5m$DEE 		    	++c                 :    t        dd       | j                         S )Y
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        getPageLayoutpage_layout)r    rG  ro   s    rk   rK  zPdfWriter.getPageLayout@  s     	#?MB$$&&rm   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: r[  rF  N)r   r<   _valid_layoutsr!   joinr  re   rV   rg   rM  s     rk   _set_page_layoutzPdfWriter._set_page_layoutI  sp    0 &*-T000/BGGD<O<O4P0P/QR  'F  *]";V!DErm   c                 <    t        dd       | j                  |      S )rJ  zwriter.setPageLayout(val)zwriter.page_layout = val)r    rR  rQ  s     rk   setPageLayoutzPdfWriter.setPageLayoutj  s%     	#')C	
 $$V,,rm   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
        )rG  ro   s    rk   rL  zPdfWriter.page_layoutu  s    . $$&&rm   c                 &    | j                  |       y r|   )rR  rQ  s     rk   rL  zPdfWriter.page_layout  s    f%rm   c                 2    t        dd       | j                  S )rJ  
pageLayoutrL  r    rL  ro   s    rk   rX  zPdfWriter.pageLayout  s     	#<?rm   c                 *    t        dd       || _        y)rJ  rX  rL  NrY  rQ  s     rk   rX  zPdfWriter.pageLayout  s     	#<?!rm   )z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 \    	 t        t        | j                  d         S # t        $ r Y y w xY w)N	/PageMode)r   rJ   re   r   ro   s    rk   _get_page_modezPdfWriter._get_page_mode  s1    	d&7&7&DEE 		rH  c                 :    t        dd       | j                         S )W
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        getPageMode	page_mode)r    r]  ro   s    rk   r`  zPdfWriter.getPageMode  s     	#=+>""$$rm   rO  c                     t        |t              r|}nE|| j                  vr,t        ddj	                  | j                         t
               t        |      }| j                  j                  t        d      |i       y)r_  zMode should be one of: z, r\  N)r   r<   _valid_modesr!   rP  r  re   rV   )rg   rO  	mode_names      rk   set_page_modezPdfWriter.set_page_mode  so     dJ'$(I4,,,-dii8I8I.J-KLh #4(I  *["99!EFrm   c                 >    t        dd       | j                  |       y)r_  zwriter.setPageMode(val)zwriter.page_mode = valN)r    re  rg   rO  s     rk   setPageModezPdfWriter.setPageMode  s     	##<>VW4 rm   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
        )r]  ro   s    rk   ra  zPdfWriter.page_mode  s    * ""$$rm   c                 &    | j                  |       y r|   )re  rg  s     rk   ra  zPdfWriter.page_mode  s    4 rm   c                 2    t        dd       | j                  S )r_  pageModera  r    ra  ro   s    rk   rl  zPdfWriter.pageMode  s     	#:{;~~rm   c                 *    t        dd       || _        y)r_  rl  ra  Nrm  rg  s     rk   rl  zPdfWriter.pageMode  s     	#:{;rm   r<  c                 P   t        t        t        |            }| j                  | j                        d   |   |t        d      <   | j                  |   }|j                  t               |t        d      <   |j                  J |j                  d      dk(  rat        d      |v rTt        t        |t        d               }t        t        d      |d   |d	   g|d
    }|j                  |t        d      <   | j                  |      }|j                  j                  |       y )Nz/Kidsz/Pz/Annotsz/Subtyper(  z/Destz	/LinkNamer:  r  r;  )r   r9   _pdf_objectifyr   r\   r<   rh   annotationsr3   r  dictr8   r   r[   r   )rg   r   r<  to_addr   tmpr   ind_objs           rk   rA  zPdfWriter.add_annotation  s   &z(BC#'??4;;#?#H#Uz$ zz+&#*5-DI&'+++ ::j!W,G1D1NtVJw$789C;''(E
 Z	D +///F:g&'""6*(rm   )r[  )rP   rN   )NN)rP   N)r   )NNr   r|   )NNN)NNNFFr   )NNFFr   )F)Nr   )r  
__module____qualname____doc__r   rl   rp   r   r   BaseExceptionr	   rv   propertyr   ry   setterr?   r;   r[   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   rh   r?  r   r   decimalDecimalr   r   r   r8   rB   r5   r   r   r   r   r   r   r   r  r  OPTIONAL_READ_WRITE_FIELDr   r(   r  r  r"  r$  r&  r(  ALL_DOCUMENT_PERMISSIONSboolr1   rL  r   rY  r   r   r   r   r   r   ru   rT  rU  rV  r{  r}  r3   r4   r9   r:   r<   r>   r=   rS  r  r  r  rC   r  r  r  r  r  r  r  r  r  r   rI   r  r  r  rG   rL   r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r@   r3  r5  r7  rD  rO  rH   rG  rK  rR  rT  rL  rX  rc  rJ   r]  r`  re  rh  ra  rl  rA   rm   rk   rN   rN   |   s2   
&# &#T &#P
%4./% m$% M*	%
 
% E   "U "t " ";y ;^ ; 8<(,;$^4; n%; 
	;.$^ $	 $CC(0#~1F1L(MC	C N(
*Z 
*D 
*J 4 >
 >3 >t >&z &# &d & 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/ 
	/D 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"&#'Z }Z  !Z  	Z 
 0Z  3-Z  C=Z  
Z xC: C$ C4D+-.	tU67NNJKK	L6 J  49  .
 d3i TW .Z .D . 
1$sCx. 
1T 
1!c3h !D !N3	
N3 
N3`!,^ !, !,F ~ '	 'n '* +  ' ' ''
 '%[ %N*+ * AE:>48	$j* <=$ dJ67$ D*j01	$
 
$F ;??J
*+? dJ67? 
	?  @D??(0(<?	? 0LPN+N5=j5IN	N 1N$ 0LP	@+	@5=j5I	@		@ 1	@ 0LP	@+	@5=j5I	@		@ 1	@ &*:>BF@G "&@G@G c]@G dJ67	@G
 eE5%$78#=>?@G @G @G @G @G #@G 
@GL ;?6:

 
 dJ67	

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

 eUE123
 
 
 
 
 

*
 15$($"9-$ y!$ 
	$677	7  &*!%	## c]# #	#
 
#J	:	:#&	:		:(#KCt KC KC\ .3	:&*	:		:*CT *Cd *CZ .3	8&*	8		8  )-!%GEGE GE 	GE
 %GE #GE 
GE\ )-88 8 	8
 %8 
8( )-OO O 	O
 %O O O 
OJ )-RR R 	R
 %R R R 
R&N(:"6 'x
3 'FuZ-C'D F FB	-J 	-4 	- 'Xj1 ' '0 &* & & &  HZ0     " " " "L 6 %Xl3 %G, G4 G ! ! ! %8L1 % %, !l !t ! ! (<0   __\ d  )# )4S> )d )rm   rN   r}   rP   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   r?   rr  r9   rx  r<   rp  r   r3   r   r   
startswithrB   r   r?  r:   r  type)r}   rs  rK  rz  name_keycasted_valuearrels           rk   rp  rp    s    #y!
#t!#))+ 	,JC!#H)%0L+F8	, 	C	m 	+BJJ~b)*	+
	C	>>#c?"#C((	C#u	&3!c#DE
 	
rm   r  r  r  r  r  c                    t               }|j                  t        d      | 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.00000z/Cr   r   r   r   )rC   rV   r<   rD   r   r   rE   r|  r}  r3   r:   quantizer>   )	r  r  r  r  r  r  preccformat_flags	            rk   r  r  ;  s     <Ltj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 )PdfFileWriterry  kwargsrP   Nc                 <    t        dd       t        |   |i | y )Nr  rN   )r    superrl   )rg   ry  r  r  s      rk   rl   zPdfFileWriter.__init___  s    "?K@$)&)rm   )r  rv  rw  r
   rl   __classcell__)r  s   @rk   r  r  ^  s"    *c *S *T * *rm   r  )qr]   r  r|  loggingr9  re  r7  r   r   hashlibr   ior   r   r   r   pathlibr   typesr	   typingr
   r   r   r   r   r   r   r   r   r   _pager   r   _readerr   	_securityr   r   r   _utilsr   r   r   r   r   r    r!   	constantsr"   r#   r   r$   r%   ra   r&   r>  r'   r(   r)   r*   r+   r,   r  r-   rW   r.   r;  r/   r  r0   r1   genericr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   	getLoggerr  r   r~  r  rN   r   r   rp  r?  r  r  r  r  rm   rk   <module>r     s}  <           > >     ,  - -   6 . ( ! 5  , , - ( =     ,   
		8	$ &aL 0A `) `)F=
d38nc3S	AB 
y 
8    ueU*+S$67  	 
    F*I *rm   