U
    :vh1                     @   s   d Z ddlmZmZmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ zddlmZ W n ek
rx   d	ZY nX d
ZdZdZdZG dd de
ZG dd deZG dd de	ZG dd deZd	S )z
This module is in work-in-progress state.
Hint tables / hint streams have not been implemented yet,
and there are a few "TODO" comment remaining.
cf. https://github.com/py-pdf/fpdf2/issues/62
   )ContentWithoutIDOutputProducer	PDFHeader)sign_content)PDFArrayPDFContentStream	PDFObject)iobj_ref)buffer_subst    )signerNz0%1%2%3%4%5%6%7%8%9%a%b%c%dz1%2%3%4%5%6%z2%3%4%5%6%7%z3%4%5%6%7%8%c                       s   e Zd Z fddZ  ZS )PDFLinearizationc                    s8   t    d| _|| _t| _d | _t| _t	| _
t| _d S )N1)super__init__Z
linearizedn%HINT_STREAM_OFFSET_LENGTH_PLACEHOLDERho!FIRST_PAGE_END_OFFSET_PLACEHOLDERe&MAIN_XREF_1ST_ENTRY_OFFSET_PLACEHOLDERtFILE_LENGTH_PLACEHOLDERl)selfpages_count	__class__ 6/tmp/pip-unpacked-wheel-dvf6lv8i/fpdf/linearization.pyr      s    
zPDFLinearization.__init____name__
__module____qualname__r   __classcell__r   r   r   r    r      s   r   c                   @   s:   e Zd ZdZdd Zedd Zedd Zdd	d
ZdS )PDFXrefAndTrailerz0%1*2+3-2/1^c                 C   s:   || _ |jd | _d| _d | _d | _d | _d | _d | _d S )Nr   )	output_builderobj_idcountstart_obj_idcatalog_objinfo_obj
first_xref	main_xref	startxref)r   r'   r   r   r    r   *   s    zPDFXrefAndTrailer.__init__c                 C   s
   t | jS N)boolr.   r   r   r   r    is_first_xref6   s    zPDFXrefAndTrailer.is_first_xrefc                 C   s
   t | jS r0   )r1   r-   r2   r   r   r    is_main_xref:   s    zPDFXrefAndTrailer.is_main_xrefNc                 C   s  | j }g }tt|j| _| jr<t|j| j| jdd|_|	d |	| j
dkrXdn| j
 d| j  | js||	d t|jdkstdt| j
| j
| j D ]}|	|j| dd	 q|	d
 |	d | jr|	d| j| jj   n| jr*|	d| jj  |	d| j  n|	d| j  |	dt| jj  |	dt| jj  |j}| }|dkr||j}|r|	d| d |	d |	d | j}| jr| jj}| jrd}|	| |	d d|S )N    xrefr   r   z0000000000 65535 f z<TODO: how to know the offsets in the 1st xref at this stage?Z010z	 00000 n trailerz<<z/Size z/Prev z/Root z/Info z/ID []z>>r/   0z%%EOF
)r'   strlenbufferr/   r4   r
    PREV_MAIN_XREF_START_PLACEHOLDERrjustappendr*   r)   r3   offsetsAssertionErrorranger-   r.   pdf_refr+   idr,   fpdffile_idZ_default_file_idjoin)r   Z_security_handlerZbuilderoutr(   rH   rI   r/   r   r   r    	serialize>   sZ    
&







zPDFXrefAndTrailer.serialize)N)	r"   r#   r$   r@   r   propertyr3   r4   rL   r   r   r   r    r&   '   s   

r&   c                       s   e Zd Zd fdd	Z  ZS )PDFHintStreamFc                    sV   t  j||d d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d S )N)contentscompress)r   r   sr   r   ar   vicr   rb)r   rO   rP   r   r   r    r   p   s    zPDFHintStream.__init__)Fr!   r   r   r   r    rN   o   s   rN   c                   @   s   e Zd Zdd ZdS )LinearizedOutputProducerc           "   
   C   s4  | j }| jt|j t|j}| | t| }| j| | 	 }t
d}| j| | tdd}| jd |_t| j}d| _|| tdd  |  }|  }	|  }
|  }|  }|  }|  }| |
||||}|jD ]}| |d q|  }|  \}}|  }|  }t| }| j| | jd |_|D ]2}t|t sH||k	rH|  jd7  _| j|_qH|  jd7  _| j|_!|d j!|_"t#||_$| j%|||d |	|||d g }|D ]f}||_&||_'|j(D ]>}|j)r||j) |j*rt+|j*dr||j*j) q|j(sd |_(q|D ]}||j) q8|D ]}t,||j-d  j!|_.qP|j/j0j1D ]}||- d  |_2qx||_3||_4||fD ]}||_5||_6q| j7rt8d| j7 | j9rt8dt:| j9 | jD ]r}t|t r
d }n t:| j7| j9|j!< | j;<|j!}|rV| =| | >|?  W 5 Q R X n| >|?  q| @  | j9|j! } t:|? }!tA| j7tBd	| d
d|!d
d| _7tA| j7tC| j9|d j!d  d
| _7tA| j7tD| j9|j d
| _7tA| j7tEt:| j7d
| _7|jFr.tGtH| j7|jF|jI|jJ|jK|jL| _7| j7S )N r   r   embedded_files)pages_root_objZfirst_page_objsig_annotation_objxmp_metadata_objstruct_tree_root_objoutline_dict_objdestz@Nothing should have been appended to the .buffer at this stage: z.No offset should have been set at this stage: [z 12dr6   r:   )MrH   Zpdf_objsrB   r   Zpdf_versionr   r   Z_add_pdf_objr&   Z_add_catalogrN   Z
_add_pagesslicer(   r)   listextendZ_add_pages_rootZ_add_annotations_as_objectsZ
_add_fontsZ_add_imagesZ_add_gfxstatesZ_add_shadingsZ_add_patternsZ_add_resources_dictrZ   Z_add_structure_treeZ_add_document_outlineZ_add_xmp_metadataZ	_add_infor*   
isinstancer   rG   r   r   ZkidsZ_finalize_catalogparent	resourcesZannotsr`   rR   hasattrrF   Zpage_numberZpage_refZstruct_builderZdoc_struct_elemkZpgr-   r.   r+   r,   r?   rD   rC   r>   Ztrace_labels_per_obj_idgetZ_trace_sizeZ_outrL   Z_log_final_sections_sizesr
   r   r   r   r   Z	_sign_keyr   r   Z
_sign_certZ_sign_extra_certsZ_sign_hashalgoZ
_sign_time)"r   rH   Zlinearization_objr-   r+   Zhint_stream_objZ	page_objsZfirst_xref_pdf_objsr[   r\   Zfont_objs_per_indexZimg_objs_per_indexZgfxstate_objs_per_nameZshading_objs_per_nameZpattern_objs_per_nameZresources_dict_objZembedded_filer^   r_   Zoutline_itemsr]   r,   r.   Zpdf_objZdestsZpage_objZannotZoutline_itemr`   Zstruct_elemr7   Ztrace_labelZ
hs1_offsetZ
hs1_lengthr   r   r    	bufferize   s   




	





z"LinearizedOutputProducer.bufferizeN)r"   r#   r$   rk   r   r   r   r    rX      s   rX   )__doc__outputr   r   r   signr   Zsyntaxr   r   r   r	   rF   utilr
   Zendesiver   ImportErrorr   r   r   r   r   r&   rN   rX   r   r   r   r    <module>   s"   
H