o
    h                    @   sJ  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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"m#Z#m$Z$ dd
l%m&Z& ddl%m'Z( ddl%m)Z) ddl%m*Z+ ddl%m,Z- ddl%m.Z.m/Z/m0Z0m1Z1m2Z2 ddl%m3Z4 ddl%m5Z6 ddl%m7Z8 ddl%m9Z: ddl%m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZVmWZWmXZX eYeZZ[e/d Z\e<dZ]G dd dZ^deee_ef e_e`ee f deJfddZaG dd de^ZbdS )     N)md5)	AnyCallableDequeDictListOptionalTupleUnioncast)PdfReadWarning   )
PageObject_VirtualList)	PdfReader)_alg33_alg34_alg35)
StreamType_get_max_pdf_version_headerb_deprecate_with_replacement)AnnotationDictionaryAttributes)CatalogAttributes)CatalogDictionary)Core)EncryptionDictAttributes)FieldDictionaryAttributes	FieldFlag"FileSpecificationDictionaryEntriesGoToActionArgumentsInteractiveFormDictEntries)PageAttributes)PagesAttributes)StreamAttributes)TrailerKeys)TypFitArgumentsUserAccessPermissions)ArrayObjectBooleanObjectByteStringObjectContentStreamDecodedStreamObjectDestinationDictionaryObjectFloatObjectIndirectObject
NameObject
NullObjectNumberObject	PdfObjectRectangleObjectStreamObjectTextStringObject
TreeObject_create_bookmarkcreate_string_object)BookmarkTypesBorderArrayTypeFitType
LayoutTypePagemodeTypeZoomArgsTypeZoomArgTypeic                   @   s  e Zd ZdZdddZedefddZejdeddfd	dZd
e	e
 defddZdede
fddZdede
fddZdedeeegdf ddfddZdddZdeddfddZdeddfddZddededdfddZddededdfd d!Z	dd"e	e d#e	e defd$d%Zd#edefd&d'Zdefd(d)Zdefd*d+Zedee fd,d-Z	dd.e	e d/e	e defd0d1Z 	dd.e	e d/e	e defd2d3Z!			dd.e	e"j# d/e	e"j# dedefd4d5Z$			dd.e	e"j# d/e	e"j# dedefd6d7Z%d8e&ddfd9d:Z'd8e&ddfd;d<Z(d=e&d>e)e&ef ddfd?d@Z*dAe&dBe)e&ef ddfdCdDZ+	ddEe,dFe	eegdf  ddfdGdHZ-	ddEe,dFe	eegdf  ddfdIdJZ.e/fdedKe0e&ef dLe1ddfdMdNZ2e/fdedKe0e&ef dLe1ddfdOdPZ3dEe,ddfdQdRZ4dEe,ddfdSdTZ5	ddEe,dFe	eegdf  ddfdUdVZ6	ddEe,dFe	eegdf  ddfdWdXZ7ddYe8fdZe&d[e	e& d\e9d]e:ddf
d^d_Z;d`e<ddfdadbZ=d`e<dee fdcddZ>d`e<deee defdfdgZ?d`e<ddfdhdiZ@dje0e&ef ddfdkdlZAdje0e&ef ddfdmdnZBdoe)eCeDeEeFeeGe
eHeIeJf
 ddfdpdqZKd>edefdrdsZLd
e
defdtduZMd
e
defdvdwZNdeOfdxdyZPdeOfdzd{ZQdeCfd|d}ZRdeCfd~dZS	dde)eeOf de)deOef defddZT	ddede	eO defddZU	ddeVde	eO defddZW	ddeVde	eO defddZX					dde&dede)deOef de	eYeeef  de9de9deZde[defddZ\					dde&dede)deOef de	eYeeef  de9de9deZde[defddZ]de
defddZ^de
defddZ_de&dedefddZ`de&dedefddZadddZbdddZcdde9ddfddZd	dde9ddfddZedde9ddfddZf	dde9ddfddZg	ddede&dehde	eC ddf
ddZi	ddede&dehde	eC ddf
ddZj		ddededehde	eC deZde[ddfddZk		ddededehde	eC deZde[ddfddZldZmde	en fddZode	en fddZpde)eGenf ddfddZqdenddfddÄZrede	en fddńZsesjdenddfddńZsede	en fddȄZtetjdenddfddȄZtdZude	ev fdd̄Zwde	ev fdd΄ZxdevddfddфZydevddfddӄZzede	ev fddՄZ{e{jdevddfddՄZ{ede	ev fdd؄Z|e|jdevddfdd؄Z|d"ede0e&ef ddfdd܄Z}dS )	PdfWriterz
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
    returnNc                 C   s   d| _ g | _i | _t }|ttjtdttjt	dttj
t i | || _t }|tdttjdd i | || _t }|ttjttjttj| ji d | _|| _d S )Ns   %PDF-1.3z/Pagesr   z	/ProducerZPyPDF2zutf-16be)_header_objects_idnum_hashr.   updater1   PATYPECOUNTr3   KIDSr(   _add_object_pagesr:   codecsBOM_UTF16_BEencode_infoCOZCATALOGZPAGES_root_root_object)selfpagesinforoot rY   V/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/PyPDF2/_writer.py__init__|   s6   
zPdfWriter.__init__c                 C   s   | 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.
        rD   rU   rY   rY   rZ   
pdf_header   s   	zPdfWriter.pdf_header
new_headerc                 C   s
   || _ d S Nr\   )rU   r_   rY   rY   rZ   r^      s   
objc                 C   s   | j | tt| j d| S )Nr   )rE   appendr0   lenrU   ra   rY   rY   rZ   rL      s   zPdfWriter._add_objectidoc                 C   s"   |j | kr	td| j|jd  S )Nzpdf must be selfr   )pdf
ValueErrorrE   idnumrU   re   rY   rY   rZ   
get_object   s   
zPdfWriter.get_objectc                 C      t dd | |S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        	getObjectrj   )r   rj   ri   rY   rY   rZ   rl         

zPdfWriter.getObjectpageactionc                 C   s   |t j tjks
J |jd ur#|jj}t|tr| }t	| j|| _| j
|tt j< | |}tt| | j
}||t j | tt|t j }t|d |tt j< d S )Nr   )rH   rI   rR   ZPAGErf   r^   
isinstancestrrP   r   rM   r1   PARENTrL   r   r.   rj   rK   intrJ   r3   )rU   rn   ro   otherZpage_indrV   Z
page_countrY   rY   rZ   	_add_page   s   


zPdfWriter._add_pagec              
   C   s   z,| j }tj|vr| j ttjtt| jd| i ttj	}t
d| j tj |< W d S  tyG } ztdt| W Y d }~d S d }~ww )Nr   Tz&set_need_appearances_writer() catch : )rT   r   Z	ACRO_FORMrG   r1   r0   rc   rE   r!   ZNeedAppearancesr)   	Exceptionloggererrorrepr)rU   catalogZneed_appearancesexcrY   rY   rZ   set_need_appearances_writer   s   


z%PdfWriter.set_need_appearances_writerc                 C   s   |  |tj dS )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)ru   listrb   rU   rn   rY   rY   rZ   add_page   s   
zPdfWriter.add_pagec                 C      t dd | | dS )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        addPager   N)r   r   r~   rY   rY   rZ   r         
zPdfWriter.addPager   indexc                    s   |  | fdd dS )aw  
        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.  This
            argument should be an instance of :class:`PageObject<PyPDF2._page.PageObject>`.
        :param int index: Position at which the page will be inserted.
        c                    s   |   |S r`   )insert)lpr   rY   rZ   <lambda>  s    z'PdfWriter.insert_page.<locals>.<lambda>N)ru   rU   rn   r   rY   r   rZ   insert_page   s   	zPdfWriter.insert_pagec                 C      t dd | || dS )zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        
insertPager   N)r   r   r   rY   rY   rZ   r     s   
zPdfWriter.insertPagepage_number
pageNumberc                 C   sl   |dur|durt dtddd |}|du r |du r t dttttf | | j}|t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*
        Nz)Please only use the page_number parameterzget_page(pageNumber)zget_page(page_number)z4.0.0zPlease specify the page_number)
rg   r   r   r   rq   r   rj   rM   rH   rK   )rU   r   r   rV   rY   rY   rZ   get_page  s   
zPdfWriter.get_pagec                 C   rk   )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        getPagezwriter.pages[page_number])r   r   )rU   r   rY   rY   rZ   r   )  rm   zPdfWriter.getPagec                 C   s*   t tttf | | j}t|td S )Nz/Count)r   r   rq   r   rj   rM   rs   r1   )rU   rV   rY   rY   rZ   _get_num_pages2  s   zPdfWriter._get_num_pagesc                 C      t dd |  S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        getNumPageszlen(writer.pages))r   r   r]   rY   rY   rZ   r   6     
zPdfWriter.getNumPagesc                 C   s   t | j| jS )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r   r   r]   rY   rY   rZ   rV   ?  s   zPdfWriter.pageswidthheightc                 C   s   t | ||}| | |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   )rU   r   r   rn   rY   rY   rZ   add_blank_pageD  s   
zPdfWriter.add_blank_pagec                 C      t dd | ||S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        addBlankPager   )r   r   )rU   r   r   rY   rY   rZ   r   W     
zPdfWriter.addBlankPagec                 C   sX   |du s|du r|   d |kr| j| }|jj}|jj}t| ||}| || |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.
        Nr   )r   rV   Zmediaboxr   r   r   r   r   )rU   r   r   r   Zoldpagern   rY   rY   rZ   insert_blank_pageb  s    
zPdfWriter.insert_blank_pagec                 C      t dd | |||S )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        insertBlankPager   )r   r   )rU   r   r   r   rY   rY   rZ   r   }  s   
zPdfWriter.insertBlankPage
javascriptc                 C   s   t  }|ttjtdtdtdtdtd| di | |}tt }t  }|tdt tt	j
tt||gii | | | jtd|tt	j
|i dS )	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/Action/Sz/JavaScriptz/JS()z/OpenActionN)r.   rG   r1   rH   rI   rL   rq   uuiduuid4CANAMESr(   r:   rT   )rU   r   jsZjs_indirect_objectZjs_string_nameZjs_name_treerY   rY   rZ   add_js  s2   	




zPdfWriter.add_jsc                 C   rk   )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        addJSr   )r   r   )rU   r   rY   rY   rZ   r     rm   zPdfWriter.addJSfilenamedatac                 C   s   t  }|| |ttjtdi t }|td|i t }|ttjtdttjt	|ttj
|i t }|ttjtt	||gi t }|td|i | jttj|i dS )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/EmbeddedFilez/Fz	/Filespecz/EmbeddedFilesN)r,   set_datarG   r1   rH   rI   r.   r   Fr:   ZEFr   r   r(   rT   )rU   r   r   Z
file_entryZef_entryZfilespecZembedded_files_names_dictionaryZembedded_files_dictionaryrY   rY   rZ   add_attachment  s4   





zPdfWriter.add_attachmentfnamefdatac                 C   r   )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        addAttachmentr   )r   r   )rU   r   r   rY   rY   rZ   r     r   zPdfWriter.addAttachmentreaderafter_page_appendc                 C   sX   t |j}t | j}t|D ]}|j| }| | | j||  }t|r)|| qdS )aO  
        Copy pages from reader to writer. Includes an optional callback parameter
        which is invoked after pages are appended to the writer.

        :param reader: a PdfReader object from which to copy page
            annotations to this writer object.  The writer's annots
            will then be updated
        :callback after_page_append (function): Callback function that is invoked after
            each page is appended to the writer. Callback signature:
        :param writer_pageref (PDF page reference): Reference to the page
            appended to the writer.
        N)rc   rV   ranger   callable)rU   r   r   Zreader_num_pagesZwriter_num_pagesZrpagenumZreader_pageZwriter_pagerY   rY   rZ   append_pages_from_reader  s   



z"PdfWriter.append_pages_from_readerc                 C   r   )zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        appendPagesFromReaderr   N)r   r   rU   r   r   rY   rY   rZ   r   :  s   

zPdfWriter.appendPagesFromReaderfieldsflagsc                 C   s   |    tt|tj D ]m}|tj |  }i }tj|v r$|tj }|D ]S}|tj	|krc|tj
dkrF|ttjt|| i |ttjt|| i |rb|ttjt|i q&|tj	|kry|ttjt|| i q&qdS )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 page: Page reference from PDF writer where the annotations
            and field data will be updated.
        :param fields: a Python dictionary of field names (/T) and text
            values (/V)
        :param 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/BtnN)r|   r   rc   PGANNOTSrj   rr   getr   TZFTrG   r1   r   ZASVr7   ZFfr3   )rU   rn   r   r   jZwriter_annotZwriter_parent_annotfieldrY   rY   rZ   update_page_form_field_valuesG  sP   





z'PdfWriter.update_page_form_field_valuesc                 C   r   )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        updatePageFormFieldValuesr   )r   r   )rU   rn   r   r   rY   rY   rZ   r     s   z#PdfWriter.updatePageFormFieldValuesc                 C   s   t t|jtj | _dS )z
        Copy the reader document root to the writer.

        :param reader:  PdfReader from the document root should be copied.
        :callback after_page_append:
        N)r   r.   trailerTKROOTrT   rU   r   rY   rY   rZ   clone_reader_document_root  s   z$PdfWriter.clone_reader_document_rootc                 C   r   )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        cloneReaderDocumentRootr   N)r   r   r   rY   rY   rZ   r     s   z!PdfWriter.cloneReaderDocumentRootc                 C   s   |  | | || dS )a2  
        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.
        :callback after_page_append (function): Callback function that is invoked after
            each page is appended to the writer. Signature includes a reference to the
            appended page (delegates to appendPagesFromReader). Callback signature:

            :param writer_pageref (PDF page reference): Reference to the page just
                appended to the document.
        N)r   r   r   rY   rY   rZ   clone_document_from_reader  s   
z$PdfWriter.clone_document_from_readerc                 C   r   )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        cloneDocumentFromReaderr   N)r   r   r   rY   rY   rZ   r     s   
z!PdfWriter.cloneDocumentFromReaderTuser_pwd	owner_pwd
use_128bitpermissions_flagc                 C   sv  |du r|}|rd}d}t d}nd}d}t d}|}tt||||}	tttt d }
tttt d }t	|
|f| _
|dkrWt||	||
\}}n|dks]J t||||	||
d\}}t }td	|ttj< t||td
< |dkrt|d |ttj< t||ttj< t|	|ttj< t||ttj< t||ttj< | || _|| _dS )a  
        Encrypt this PDF file with the PDF Standard encryption handler.

        :param str user_pwd: The "user password", which allows for opening
            and reading the PDF file with the restrictions provided.
        :param str owner_pwd: 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.
        N      g      0@r   g      @utf8Fz	/Standardz/V   )rs   r*   r   r   ry   timerP   digestrandomr(   _IDr   r   r.   r1   SAZFILTERr3   ZLENGTHEDROUPrL   _encrypt_encrypt_key)rU   r   r   r   r   r   revZkeylenr   r   ZID_1ZID_2r   keyencryptrY   rY   rZ   r     s:   

zPdfWriter.encryptstreamc                 C   s   t |drd|jvrtd|j d | js| | j| _| | j | 	|}| 
||}| | |td| d dS )z
        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 must support
            the write method and the tell method, similar to a file object.
        modebzFile <zH> to write to is not in binary mode. It may not be written to correctly.z
startxref
z
%%EOF
N)hasattrr   warningswarnnamerS   rL   rT   _sweep_indirect_references_write_header_write_xref_table_write_trailerwriter   )rU   r   object_positionsxref_locationrY   rY   rZ   r     s   


zPdfWriter.writec           
      C   s   g }| | jd  | d t| jD ]y\}}| j| }|d ur|d }||  | tt|d  d }t| dr|| j	j
krtd|d d d }tddd d	 }| j| | }t|t| jd
 ksnJ t| }	|	d tdt| jd
  }||| | d q|S )N   
s   %
r   s    0 obj
r   z<ir   r   r         s   
endobj
)r   r^   	enumeraterE   rb   tellr   rq   r   r   rh   structpackr   rc   r   r   minwrite_to_stream)
rU   r   r   ira   rh   r   Zpack1Zpack2Zmd5_hashrY   rY   rZ   r   %  s*   


zPdfWriter._write_headerr   c                 C   s|   |  }|d |tdt| jd  d |tddddd	d
 |D ]}|t|dddd	d q*|S )Ns   xref
z0 r   
r   z0>10 i  z0>5z f 
z n 
)r   r   r   rc   rE   )rU   r   r   r   offsetrY   rY   rZ   r   <  s   
  zPdfWriter._write_xref_tablec                 C   s   | d t }|ttjtt| jd ttj	| j
ttj| ji t| dr2| j|ttj< t| dr?| j|ttj< ||d  d S )Ns   trailer
r   r   r   )r   r.   rG   r1   r   ZSIZEr3   rc   rE   r   rS   INFOrQ   r   r   IDr   ZENCRYPTr   )rU   r   r   rY   rY   rZ   r   E  s   


zPdfWriter._write_trailerinfosc                 C   s@   i }t | D ]\}}t||t|< q| | j| dS )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}   itemsr:   r1   rj   rQ   rG   )rU   r   argsr   valuerY   rY   rZ   add_metadataU  s   zPdfWriter.add_metadatac                 C   r   )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        addMetadatar  N)r   r  )rU   r   rY   rY   rZ   r  a  r   zPdfWriter.addMetadatarX   c                 C   sr  t  }g }d }g }d }|||||f t|r| \}}}}t|ttfrD| D ]\}}	||	|||d ur>||g ng f q,n"t|t	rf| 
|}t||vrf|t| || d d g f t|ttfrt|trz| 
| |}g }
|| |kr| gdd |D  }
|||< |
D ]}| j|d }|d ur| }|d ur|| j| < qt|sd S d S )Nc                 S   s   g | ]}|  qS rY   )
hash_value).0Zgrant_parentrY   rY   rZ   
<listcomp>  s    z8PdfWriter._sweep_indirect_references.<locals>.<listcomp>)collectionsdequerb   rc   poprp   r(   r.   r  r0   _resolve_indirect_objectrq   rj   r6   rL   r  rF   )rU   rX   stackZ
discoveredparentZgrant_parentsZ	key_or_idr   r   r  Zupdate_hashesZold_hashZindirect_refZindirect_ref_objrY   rY   rZ   r   j  sX   
	

z$PdfWriter._sweep_indirect_referencesc                 C   s   t |jdr|jjjrtd|jjj |j|}|du r1td|j	j
 d| dt t }| }|| jv r?| j| S |j| krOt|jd| | j|< n| || 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: NzUnable to resolve [z: z], returning NullObject insteadr   )r   rf   r   closedrg   r   rj   r   r   	__class____name__r   r2   r  rF   r0   rh   rL   )rU   r   Zreal_objr  rY   rY   rZ   r    s    



z"PdfWriter._resolve_indirect_objectc                 C   s0   | j |d }t|d| }| |ksJ |S Nr   r   )rE   r   r0   rj   )rU   ra   rh   refrY   rY   rZ   get_reference  s   zPdfWriter.get_referencec                 C   rk   )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        getReferencer  )r   r  rd   rY   rY   rZ   r    rm   zPdfWriter.getReferencec                 C   s|   t j| jv r'tt| jt j }| j|d }t|d| }| |ks%J |S t }|	i  | 
|}|| jtt j< |S r  )rR   ZOUTLINESrT   r   r8   rE   r   r0   rj   rG   rL   r1   )rU   outlinerh   Zoutline_refrY   rY   rZ   get_outline_root  s   

zPdfWriter.get_outline_rootc                 C   r   )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        getOutlineRootr  )r   r  r]   rY   rY   rZ   r    r   zPdfWriter.getOutlineRootc                 C   st  t j| jv rt| jt j trtt| jt j }| j|d }t|d| }|	 |ks.J t j
|v rtt|t j
 trttt|t j
 }| j|d }t|d| }|	 |ksYJ t j|v rhtt|t j }|S t }||tt j< |S t }| |}||tt j
< t }||tt j< |S t }| |}|| jtt j< t }| |}||tt j
< t }||tt j< |S r  )r   r   rT   rp   r.   r   rE   r   r0   rj   ZDESTSr(   r1   rL   )rU   namesrh   Z	names_refZdestsZ	dests_refndrY   rY   rZ   get_named_dest_root  sB   



zPdfWriter.get_named_dest_rootc                 C   r   )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        getNamedDestRootr  )r   r  r]   rY   rY   rZ   r  +  r   zPdfWriter.getNamedDestRootdestr  c                 C   s8   |d u r|   }tt| }| |}|||  |S r`   )r  r   r8   rj   rL   Z	add_child)rU   r  r  dest_refrY   rY   rZ   add_bookmark_destination4  s   
z"PdfWriter.add_bookmark_destinationc                 C   r   )zc
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark_destination` instead.
        addBookmarkDestinationr  )r   r  )rU   r  r  rY   rY   rZ   r   B  r   z PdfWriter.addBookmarkDestinationbookmarkc           	      C   s   t  }t| D ]\}}||tt|< q	|| d|v rGt }tt|d }t| D ]\}}||tt|< q/| |}||td< | 	||S )N/A)
r8   r}   r  r1   rq   rG   r.   r   rL   r  )	rU   r!  r  Zbookmark_objkvro   Za_dict
action_refrY   rY   rZ   add_bookmark_dictM  s   

zPdfWriter.add_bookmark_dictc                 C   r   )z\
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark_dict` instead.
        addBookmarkDictr&  )r   r&  )rU   r!  r  rY   rY   rZ   r'  _  r   zPdfWriter.addBookmarkDictF/Fittitlepagenumcolorbolditalicfitr  c                 G   s   t |}	dd |D }
ttd| d |	t|g|
R  }| tttj|jttjtdi}t	|||||}|du rA| 
 }| ||S )aG  
        Add a bookmark to this PDF file.

        :param str title: Title to use for this bookmark.
        :param int pagenum: Page number this bookmark will point to.
        :param parent: A reference to a parent bookmark to create nested
            bookmarks.
        :param tuple color: Color of the bookmark as a red, green, blue tuple
            from 0.0 to 1.0
        :param bool bold: Bookmark is bold
        :param bool italic: Bookmark is italic
        :param str fit: The fit of the destination page. See
            :meth:`addLink()<addLink>` for details.
        c                 S   "   g | ]}|d u rt  nt|qS r`   r2   r3   r  arY   rY   rZ   r        z*PdfWriter.add_bookmark.<locals>.<listcomp>/z	 bookmark/GoToN)r3   r-   r1   rL   r.   r    D
dest_arraySr9   r  r  )rU   r)  r*  r  r+  r,  r-  r.  r  page_ref	zoom_argsr  r%  r!  rY   rY   rZ   add_bookmarkj  s(   zPdfWriter.add_bookmarkc           	      G   s(   t dd | j|||||||g|R  S )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark` instead.
        addBookmarkr;  )r   r;  )	rU   r)  r*  r  r+  r,  r-  r.  r  rY   rY   rZ   r<    s   
zPdfWriter.addBookmarkc                 C   s(   |  |}|  }||d |g |S )Nz/Title)rL   r  extend)rU   r  r  r  rY   rY   rZ   add_named_destination_object  s   
z&PdfWriter.add_named_destination_objectc                 C   rk   )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        addNamedDestinationObjectr>  )r   r>  )rU   r  rY   rY   rZ   r?    s   
z#PdfWriter.addNamedDestinationObjectc                 C   sv   |  | jtj | }t }|ttjt	|tt
jtdgttjtdi | |}|  }|||g |S )Ni:  r5  )rj   rM   rH   rK   r.   rG   r1   r    r6  r(   r&   ZFIT_Hr3   r8  rL   r  r=  )rU   r)  r*  r9  r  r  r  rY   rY   rZ   add_named_destination  s   

	zPdfWriter.add_named_destinationc                 C   r   )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        addNamedDestinationr@  )r   r@  )rU   r)  r*  rY   rY   rZ   rA    r   zPdfWriter.addNamedDestinationc                 C   sR   t t| | j}t t|tj }|D ]}t t| |}tj|v r&|tj= qdS )z.Remove links and annotations from this output.N)	r   r.   rj   rM   r(   rH   rK   r   r   )rU   pg_dictrV   rn   r9  rY   rY   rZ   remove_links  s   
zPdfWriter.remove_linksc                 C   r   )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        removeLinksrC  )r   rC  r]   rY   rY   rZ   rD    r   zPdfWriter.removeLinksignore_byte_string_objectc                 C   sf  t t| | j}t t|tj }d}|D ]}t t| |}|d  }t|ts/t||}g }d}	|j	D ]n\}
}|dv rO|
d }|rNt|t
sNt
 |
d< n6|dkrd|
d }|rct|t
sct
 |
d< n!|dkrtt|
d D ]}|rt|
d | t
st
 |
d |< qp|d	krd
}	|dkrd}	|	r||v rq6|dkrq6||
|f q6||_	|td| qdS )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.   rj   rM   r(   rH   rK   rp   r+   
operationsr7   r   rc   rb   __setitem__r1   )rU   rE  rB  rV   Zjump_operatorsrn   r9  contentZ_operationsZseq_graphicsoperandsoperatortextr   rY   rY   rZ   remove_images  sX   



zPdfWriter.remove_imagesignoreByteStringObjectc                 C   rk   )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        removeImagesrg  )r   rg  rU   rh  rY   rY   rZ   ri  =     

zPdfWriter.removeImagesc                 C   s|  t t| | j}t tt |tj }|D ]}t tt	t
f | |}|d  }t|ts3t||}|jD ]|\}}|dv r\|d }	|sOt|	trNt |d< q6t|	ttfr[t |d< q6|dkr~|d }	|sqt|	trpt |d< q6t|	ttfr}t |d< q6|dkrtt|d D ]'}
|st|d |
 trt |d |
< qt|d |
 ttfrt |d |
< qq6|td| qdS )z
        Remove text from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        rZ  r[  r   r]  r   r^  N)r   r.   rj   rM   r   r0   rH   rK   r   rq   r   rp   r+   ra  r7   r*   r   rc   rb  r1   )rU   rE  rB  rV   rn   r9  rc  rd  re  rf  r   rY   rY   rZ   remove_textH  sN   







zPdfWriter.remove_textc                 C   rk   )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        
removeTextrl  )r   rl  rj  rY   rY   rZ   rm  t  rk  zPdfWriter.removeTexturirectborderc                 C   s|  |  | jtj | }ttttf |  |}|dur=dd |dd D }t|dkr<t	dd |d D }|
| ntdgd }t|trNt|}n
t|trTnt|}t }	|	tdtd	td	t|i t }
|
ttjttjttjtd
ttj|ttj|tdtdttjt	|td|	i | |
}tj|v r|tj 
| dS t	|g|ttj< dS )a  
        Add an URI from a rectangular area to the specified page.
        This uses the basic structure of :meth:`add_link`

        :param int pagenum: index of the page on which to place the URI action.
        :param str uri: URI of resource to link to.
        :param 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 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.
        Nc                 S      g | ]}t |qS rY   r1   r  nrY   rY   rZ   r        z%PdfWriter.add_uri.<locals>.<listcomp>r      c                 S   rq  rY   rr  rs  rY   rY   rZ   r    ru  r   r   z/URI/Linkz/Hz/Ir"  )rj   rM   rH   rK   r   r   rq   r   rc   r(   rb   r3   rp   r1   r5   r.   rG   r7   r   Typer   r   ZSubtyper   ZRectZBorderrL   )rU   r*  rn  ro  rp  	page_linkr9  
border_arrdash_patternZlnk2lnklnk_refrY   rY   rZ   add_uri  sJ   








zPdfWriter.add_uric                 C   s   t dd | ||||S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        addURIr~  )r   r~  )rU   r*  rn  ro  rp  rY   rY   rZ   r    s   
zPdfWriter.addURIpagedestc                 G   s  t tttf | | j}|tj | }|tj | }	t tttf | |}
|durMdd |dd D }t|dkrLt	dd |d D }|
| ntdgd }t|tr^t|}n
t|trdnt|}dd |D }ttd	|	t|g|R  }ttd
ttjtdtdtd|td|tdt	|td|ji}| |}tj|
v r|
tj 
| dS t	|g|
ttj< dS )a  
        Add an internal link from a rectangular area to the specified page.

        :param int pagenum: index of the page on which to place the link.
        :param int pagedest: index of the page to which the link should go.
        :param 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 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.
        :param str fit: Page fit or 'zoom' option (see below). Additional arguments may need
            to be supplied. Passing ``None`` will be read as a null value for that coordinate.

        .. list-table:: Valid ``zoom`` arguments (see Table 8.2 of the PDF 1.7 reference for details)
           :widths: 50 200

           * - /Fit
             - No additional arguments
           * - /XYZ
             - [left] [top] [zoomFactor]
           * - /FitH
             - [top]
           * - /FitV
             - [left]
           * - /FitR
             - [left] [bottom] [right] [top]
           * - /FitB
             - No additional arguments
           * - /FitBH
             - [top]
           * - /FitBV
             - [left]
        Nc                 S   rq  rY   rr  rs  rY   rY   rZ   r    ru  z&PdfWriter.add_link.<locals>.<listcomp>r   rv  c                 S   rq  rY   rr  rs  rY   rY   rZ   r    ru  r   c                 S   r/  r`   r0  r1  rY   rY   rZ   r    r3  z	/LinkNamez/Typez/Subtyperw  /Pz/Rectz/Borderz/Dest)r   r   rq   r   rj   rM   rH   rK   rc   r(   rb   r3   rp   r1   r5   r-   r.   r   r   r7  rL   )rU   r*  r  ro  rp  r.  r  Z	pages_objry  Z	page_destr9  rz  r{  r:  r  r|  r}  rY   rY   rZ   add_link  sJ   +







zPdfWriter.add_linkc                 G   s$   t dd | j|||||g|R  S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_link` instead.
        addLinkr  )r   r  )rU   r*  r  ro  rp  r.  r  rY   rY   rZ   r  )  s   
zPdfWriter.addLink)z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 C   (   z	t t| jd W S  ty   Y d S w )N/PageLayout)r   r>   rT   KeyErrorr]   rY   rY   rZ   _get_page_layoutD  
   zPdfWriter._get_page_layoutc                 C   r   )Y
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        getPageLayoutpage_layout)r   r  r]   rY   rY   rZ   r  J  r   zPdfWriter.getPageLayoutlayoutc                 C   sP   t |ts|| jvrtddd| jf  t|}| jtd|i dS )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  N)rp   r1   _valid_layoutsr   r   joinrT   rG   rU   r  rY   rY   rZ   _set_page_layoutS  s   

zPdfWriter._set_page_layoutc                 C   rk   )r  zwriter.setPageLayout(val)zwriter.page_layout = val)r   r  r  rY   rY   rZ   setPageLayouts  s   
zPdfWriter.setPageLayoutc                 C      |   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  r]   rY   rY   rZ   r  ~  s   zPdfWriter.page_layoutc                 C      |  | d S r`   )r  r  rY   rY   rZ   r       c                 C      t dd | jS )r  
pageLayoutr  r   r  r]   rY   rY   rZ   r       
zPdfWriter.pageLayoutc                 C      t dd || _dS )r  r  r  Nr  r  rY   rY   rZ   r       

)z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 C   r  )N	/PageMode)r   r?   rT   r  r]   rY   rY   rZ   _get_page_mode  r  zPdfWriter._get_page_modec                 C   r   )W
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        getPageMode	page_mode)r   r  r]   rY   rY   rZ   r    r   zPdfWriter.getPageModer   c                 C   sR   t |tr|}n|| jvrtdd| j  t|}| jtd|i dS )r  zMode should be one of: z, r  N)rp   r1   _valid_modesr   r   r  rT   rG   )rU   r   Z	mode_namerY   rY   rZ   set_page_mode  s   

zPdfWriter.set_page_modec                 C   r   )r  zwriter.setPageMode(val)zwriter.page_mode = valN)r   r  rU   r   rY   rY   rZ   setPageMode  r   zPdfWriter.setPageModec                 C   r  )a   
        Page mode property.

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

           * - /UseNone
             - Do not show outlines or thumbnails panels
           * - /UseOutlines
             - Show outlines (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        )r  r]   rY   rY   rZ   r    s   zPdfWriter.page_modec                 C   r  r`   )r  r  rY   rY   rZ   r    r  c                 C   r  )r  pageModer  r   r  r]   rY   rY   rZ   r    r  zPdfWriter.pageModec                 C   r  )r  r  r  Nr  r  rY   rY   rZ   r    r  
annotationc                 C   st   t tt|}| | jd | |td< | j| }|jd u r&t |td< |jd us-J | 	|}|j
| d S )Nz/Kidsr  z/Annots)r   r.   _pdf_objectifyrj   rM   r1   rV   annotationsr(   rL   rb   )rU   r   r  to_addrn   Zind_objrY   rY   rZ   add_annotation  s   


zPdfWriter.add_annotation)rC   N)r   )NN)NNr   r`   )NNFFr(  )F)Nr(  )~r  
__module____qualname____doc__r[   propertybytesr^   setterr   r4   r0   rL   rj   rl   r   r   r   ru   r|   r   r   rs   r   r   r   r   r   r   r   rV   floatr   r   decimalDecimalr   r   rq   r   r   r
   r   r   r   r   r   OPTIONAL_READ_WRITE_FIELDr   r   r   r   r   r   r   r   ALL_DOCUMENT_PERMISSIONSboolr'   r   r   r   r   r   r   r  r  r(   r)   r.   r/   r1   r3   r7   r2   r   r  r  r  r8   r  r  r  r  r  r   r;   r&  r'  r	   r=   rA   r;  r<  r>  r?  r@  rA  rC  rD  rg  ri  rl  rm  r5   r~  r  r  r  r  r>   r  r  r  r  r  r  r  r?   r  r  r  r  r  r  r  rY   rY   rY   rZ   rB   v   s   
&
	

	

		



+	R


!


B

	


:		
P#		'




	

3	





		N
-

H

]

	 						"	rB   ra   rC   c                 C   s   t | tr| S t | tr&t }|  D ]\}}t|}t|}|||< q|S t | tr<t }| D ]	}|	t| q0|S t | t
rN| drJt| S t| S t | ttfrYt| S tdt|  d)Nr4  z
type(obj)=z! could not be casted to PdfObject)rp   r4   dictr.   r  r1   r  r}   r(   rb   rq   
startswithr7   rs   r  r/   NotImplementedErrortype)ra   r  r   r  Zname_keyZcasted_valueZarrelrY   rY   rZ   r    s.   





r  c                       s*   e Zd Zdededdf fddZ  ZS )PdfFileWriterr  kwargsrC   Nc                    s    t dd t j|i | d S )Nr  rB   )r   superr[   )rU   r  r  r  rY   rZ   r[   7  s   
zPdfFileWriter.__init__)r  r  r  r   r[   __classcell__rY   rY   r  rZ   r  6  s    "r  )crN   r	  r  loggingr   r   r   r   r   hashlibr   typingr   r   r   r   r   r   r	   r
   r   ZPyPDF2.errorsr   Z_pager   r   _readerr   Z	_securityr   r   r   Z_utilsr   r   r   r   	constantsr   r   r   r   r   rR   r   r   r   r   r   r    r!   r"   r   r#   rH   r$   r   r%   r   r&   r'   Zgenericr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   typesr;   r<   r=   r>   r?   r@   rA   	getLoggerr  rw   r  r  rB   rq   rs   r  r  rY   rY   rY   rZ   <module>   s`   ,T$

             *1