o
    Fzcņ                     @   sd  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlm  mZ d dlmZ d dlmZ d dlmZmZmZ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&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 zd dl3m4Z4m5Z5 d dl6m7Z7 W n e8y   dZ7dZ5Y nw e9dZ:dZ;dZ<G dd de=Z>G dd dZ?G dd deZ@G dd deZAdZBG dd  d eCZDG d!d" d"e e?ZEG d#d$ d$e"e?ZFG d%d& d&e-e?ZGG d'd( d(e!e?ZHG d)d* d*e&e?ZIG d+d, d,eZJG d-d. d.e$ZKG d/d0 d0eZLG d1d2 d2eZMG d3d4 d4e ZNdS )5    N)md5)escape)BytesIOStringIO)TA_RIGHT)ParagraphStyle)LazyImageReaderflatten
haveImagesopen_for_read)BaseDocTemplateIndexingFlowablePageTemplate)CondPageBreakFlowableKeepInFrameParagraphAndImage)TableOfContents)Table
TableStyle)register_reset)
WaterMarks)	Paragraph)getBorderStylegetUID)pisaTempFile)	renderPDFrenderPM)svg2rlgZ	xhtml2pdfgffffff?z3xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>c                   @      e Zd Zdd Zdd ZdS )PTCyclec                 C   s   d| _ d| _t|  d S Nr   )_restart_idxlist__init__self r(   !/xhtml2pdf/xhtml2pdf_reportlab.pyr%   9   s   zPTCycle.__init__c                 c   s6    	 | | j  V  |  j d7  _ | j t| kr| j| _ q)N   )r#   lenr"   r&   r(   r(   r)   cyclicIterator>   s   zPTCycle.cyclicIteratorN)__name__
__module____qualname__r%   r,   r(   r(   r(   r)   r    8   s    r    c                   @   r   )PmlMaxHeightMixInc                 C   sb   || _ |dk r#t| dr"t| jdsd| j_t|| jj | _ | j_n|| _ t| ds.d| _ | j S )Nip canvmaxAvailHeightValuer   availHeightValue)r3   hasattrr1   r2   max)r'   availHeightr(   r(   r)   setMaxHeightG   s   

zPmlMaxHeightMixIn.setMaxHeightc                 C   s   t | dsdS | jS )Nr3   r   )r4   r3   r&   r(   r(   r)   getMaxHeightX   s   
zPmlMaxHeightMixIn.getMaxHeightN)r-   r.   r/   r7   r8   r(   r(   r(   r)   r0   F   s    r0   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )
PmlBaseDoczj
    We use our own document template to get access to the canvas
    and set some informations once.
    c                 C   s   t | jjj_d S N)PRODUCERr1   Z_docinfoZproducerr&   r(   r(   r)   
beforePaged   s   zPmlBaseDoc.beforePagec                 C   s8   t |ddr| d|jtt|jd| jf d S d S )NoutlineFZTOCEntryr*   )getattrnotifyoutlineLevelhtml_escapecopydeepcopytextZpage)r'   Zflowabler(   r(   r)   afterFlowabley   s   
zPmlBaseDoc.afterFlowablec                 C   s8  |  |d }|  |d }|r|r|d |d g}	 t|trBt| dr'| `| jD ]}|j|kr;| j|| _ dS q*t	d| t|t
rSt| drN| `|| _dS t|ttfrt }|D ] }|dkrkt||_q_| jD ]}|j| kr~||  q_qnq_|st	d|jt|krt	d| | _dS td	)
zS
        if pt has also templates for even and odd page convert it to list
        _leftZ_right_nextPageTemplateCycleNzcan't find template('%s')*z No valid page templates in cyclezInvalid cycle restart positionz/Argument pt should be string or integer or list)_has_template_for_name
isinstancestrr4   rH   pageTemplatesidindexZ_nextPageTemplateIndex
ValueErrorintr$   tupler    r+   r"   stripappendr,   	TypeError)r'   ptZhas_left_templateZhas_right_templatetcZptnr(   r(   r)   handle_nextPageTemplate   sH   









z"PmlBaseDoc.handle_nextPageTemplatec                 C   s$   | j D ]}|j| kr dS qdS )NTF)rM   rN   rS   )r'   nametemplater(   r(   r)   rJ      s
   
z!PmlBaseDoc._has_template_for_nameN)r-   r.   r/   __doc__r=   rF   rY   rJ   r(   r(   r(   r)   r9   ^   s    .r9   c                   @   s@   e Zd ZdZdZeZdd Zdd Zdd Zd	d
 Z	dd Z
dS )PmlPageTemplateZportraitZ	landscapec                 K   sR   g | _ g | _d | _tj| fi | d| _d| _d | _d| _d| _	d| _
g | _d S )Nr   T)pisaStaticListpisaBackgroundListpisaBackgroundr   r%   _page_count_first_flowimgphhwbackgroundids)r'   kwr(   r(   r)   r%      s   
zPmlPageTemplate.__init__c                 C   s<   | j r| | jkrd| _ | j S | | _| |j_| j S NF)rb   getPageNumberra   _doctemplate)r'   canvasr(   r(   r)   isFirstFlow   s   
zPmlPageTemplate.isFirstFlowc                 C      | j | jkS r:   )pageorientationPORTRAITr&   r(   r(   r)   
isPortrait      zPmlPageTemplate.isPortraitc                 C   rn   r:   )ro   	LANDSCAPEr&   r(   r(   r)   isLandscape   rr   zPmlPageTemplate.isLandscapec                    sJ      z|jj| jvrKd }t| dr=| jr=| j s=| j dr2t	j
| j| j|  | jd}n| j}| j|jj |rK| j  || jf  fddz.  | jkrh  | _   j_| jD ]}t|}|j}| ||  qkW n ty   tjddd Y nw W    d S W    d S    w )	Nr`   zimage/)contextc                    sp   t | D ]1}t|tr$|jD ]&}|jrt|_q|jr#t jj	|_qt|t
r5dd |jD }| qd S )Nc                 S   s   g | ]	}|D ]}|qqS r(   r(   ).0Zsublistitemr(   r(   r)   
<listcomp>   s    zIPmlPageTemplate.beforeDrawPage.<locals>.pageNumbering.<locals>.<listcomp>)r	   rK   PmlParagraphfragsZ
pageNumberrL   rE   Z	pageCountrk   ra   PmlTableZ_cellvalues)ZobjListobjfragZ
flat_cellsrl   pageNumberingZ
pagenumberr(   r)   r      s   


z5PmlPageTemplate.beforeDrawPage.<locals>.pageNumberingr]   r*   exc_info)	saveStateZpageTemplaterN   rg   r4   r`   ZnotFoundZgetMimeType
startswithr   Zgenerate_pdf_backgroundZpagesizerq   ZbackgroundContextrT   r_   rj   ra   rk   r^   rC   rD   ZpisaStaticStoryZaddFromList	ExceptionlogdebugrestoreState)r'   rl   docr`   frameZstoryr(   r~   r)   beforeDrawPage   sB   





zPmlPageTemplate.beforeDrawPageN)r-   r.   r/   rp   rs   ro   r%   rm   rq   rt   r   r(   r(   r(   r)   r]      s    	r]   r*   c                   @   s\   e Zd ZdZi Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )PmlImageReaderz>
    Wraps up either PIL or Java to get data from bitmaps
    c           
   	   C   sF  t |tr|j| _d S || _d | _d | _d | _d | _d | _d}t	rIt |t	j
rI|| _t|dd | _z|| _W d S  tyH   dt|  | _Y d S w zt|d| _t | jt jrZd}|dkr| j }|d@ rsz| j  W n   Y |d@ r| jst| jj | jt| |}t|| _n|dkrt |tr| j  | `t| _tr| js| | j| _t| jdd d	kr| j| _ W d S W d S dd
l!m"} z|| j\| _| _}W n   t#d| j| _ | j | _d | _$| j%d W d S    t&' \}}}t(|dr"t|j)d d|  }	|j)d d |	f |_)t#d*||| )Nr   fpzPILIMAGE_%db      formatZJPEG)readJPEGInfozBImaging Library not available, unable to import bitmaps only jpegsargsz fileName=%rz{0} {1} {2})+rK   r   __dict__fileName_image_width_heightZ_transparent_dataPILImageImager?   r   AttributeErrorrN   r   r   	__class__readclose_cacher   clear
setdefaultr   digestr   rL   r   r
   _read_image_jpeg_fhjpeg_fhZreportlab.pdfbase.pdfutilsr   RuntimeError_dataAseeksysr   r4   r   r   )
r'   r   ZimageReaderFlagsdatar   rX   etZevtbar(   r(   r)   r%     sx   


zPmlImageReader.__init__c                 C   sR   t jdd dkr ddlm} ddlm} || }||S tr't|S d S )Nr   r   java)ByteArrayInputStream)ImageIO)	r   platformZjava.ior   Zjavax.imageior   r   r   open)r'   r   r   r   Zinput_streamr(   r(   r)   r   ^  s   

zPmlImageReader._read_imagec                 C   s   | j }|d |S r!   )r   r   )r'   r   r(   r(   r)   r   g  s   
zPmlImageReader._jpeg_fhc                 C      d S r:   r(   r&   r(   r(   r)   r   l     zPmlImageReader.jpeg_fhc                 C   s\   | j d u s
| jd u r(tjdd dkr | j | _ | j | _n| jj\| _ | _| j | jfS )Nr   r   r   )r   r   r   r   r   ZgetWidthZ	getHeightsizer&   r(   r(   r)   getSizeo  s   zPmlImageReader.getSizec              	   C   s^  | j du rd| _tjdd dkrkddl}ddlm} |  \}}||| d}|| j	dd|||d|}|
  g }|j}|D ]}	|t|	d? d@  |t|	d	? d@  |t|	d@  q@d
|| _ d| _| j S | j	}
|
j }| _|dkr|
  t|
 d | _|
d}
d| _n|dvr|
d}
d| _t|
dr|
 | _ | j S |
 | _ | j S )z'Return byte array of RGB data as stringNr   r   r   )PixelGrabberi          RGBZRGBA   )Lr   ZCMYKtobytes)r   r   r   r   jarrayZjava.awt.imager   r   zerosr   Z
grabPixelsrT   chrjoinmodeloadr   splitconvertr4   r   tostring)r'   r   r   widthheightbufferZpgZpixelsr   ZrgbZimr   r(   r(   r)   
getRGBDatax  sB   





zPmlImageReader.getRGBDatac                 C   s   |   \}}|||  fS r:   )r   r   )r'   r   r   r(   r(   r)   getImageData  s   zPmlImageReader.getImageDatac              
   C   s   t jdd dkrd S d| jjv rY| jjd d }| jj}t|dr&|j}nt|dr/|j}nd S zt|||d  W S  tyX } zt	j
t||d W Y d }~d S d }~ww d S )	Nr   r   r   transparencyr   paletter   r   )r   r   r   r<   r   r4   r   r$   r   r   r   rL   )r'   r   r   er(   r(   r)   getTransparent  s$   

zPmlImageReader.getTransparentc                 C   sF   z| j  }|st| }dt| W S    | j }|st| }| Y S )NzPmlImageObject_%s)r   r   rN   hash)r'   fnr(   r(   r)   __str__  s   
zPmlImageReader.__str__N)r-   r.   r/   r\   r   r%   r   r   r   r   r   r   r   r   r(   r(   r(   r)   r     s    F		(r   c                   @   sJ   e Zd ZdddZdd ZdddZd	d
 Zdd Zdd ZdddZ	dS )PmlImageNautoc           
      K   s   || _ d| _|| _t|tr| n|| _|| _|  }|r+|	 p#d\}}| _
| _n|  }	|	r9|	 \| _
| _|p=| j
| _|pC| j| _d S )NZCENTER)r   r   r   r   )rh   ZhAlign_maskrK   r   getvalue_imgdatamimetype
getDrawingZ	getBoundsZ
imageWidthZimageHeightgetImager   	drawWidth
drawHeight)
r'   r   r   r   maskr   rh   drawing_rc   r(   r(   r)   r%     s   zPmlImage.__init__c                 C   sp   |  |}t| j|}t|| j }t| j|t }t|| j }t||}| j| | _| j| | _| j| jfS )zS This can be called more than once! Do not overwrite important data like drawWidth N)r7   minr   floatr   MAX_IMAGE_RATIOdWidthdHeight)r'   
availWidthr6   r   wfactorr   hfactorfactorr(   r(   r)   wrap  s   

zPmlImage.wrapc                 C   s   t rTz	t t| j}W n
 ty   Y dS w |rTd}d}t| dddur0|du r+| j}||j }t| dddurD|du r?| j}||j }|dksL|dkrR|	|| |S dS )z[ If this image is a vector image and the library is available, returns a ReportLab Drawing.Nr*   r   r   )
r   r   r   r   r?   r   r   r   r   Zscale)r'   r   r   r   Zscale_xZscale_yr(   r(   r)   r     s*   

zPmlImage.getDrawingc                 C   s2   t rtr|  }|rt }tj||dd |S dS )zX If this image is a vector image and the libraries are available, returns a PNG raster. ZPNG)fmtN)r   r   r   r   Z
drawToFile)r'   Zsvgimgdatar(   r(   r)   getDrawingRaster  s   zPmlImage.getDrawingRasterc                 C   s"   |   }|p
t| j}t|}|S )z Returns a raster image. N)r   r   r   r   )r'   ZvectorRasterr   rc   r(   r(   r)   r     s   zPmlImage.getImagec                 C   s*   |   }| jj|dd| j| j| jd d S )Nr   )r   )r   r1   Z	drawImager   r   r   )r'   rc   r(   r(   r)   draw  s   
zPmlImage.drawc                 C   s   t | |}|S r:   )r   identity)r'   maxLenrr(   r(   r)   r   %  s   zPmlImage.identity)NNr   N)NNr:   )
r-   r.   r/   r%   r   r   r   r   r   r   r(   r(   r(   r)   r     s    


r   c                   @   r   )PmlParagraphAndImagec                 C   s"   | j | j_ t| ||}| j` |S r:   )r1   Ir   r   )r'   r   r6   resultr(   r(   r)   r   +  s   
zPmlParagraphAndImage.wrapc                 C   s.   t | ds| j||\| _| _t| ||S )NwI)r4   r   r   r   ZhIr   r   r'   r   r6   r(   r(   r)   r   1  s   
zPmlParagraphAndImage.splitN)r-   r.   r/   r   r   r(   r(   r(   r)   r   *  s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ry   c           
      C   s   d| _ | jD ]L}t|drR|jjdkrR|j}|jdkrR|jdkrRd| _ t|j|}t||j }t|j|t	 }t||j }t||}	| j|	9  _| j|	9  _qd S )NFcbDefnrc   r   T)
Z	hasImagesrz   r4   r   kindr   r   r   r   r   )
r'   r   r6   r}   rc   r   r   r   r   r   r(   r(   r)   _calcImageMaxSizes9  s   

zPmlParagraph._calcImageMaxSizesc                 C   s   |  |}| j}|j|j |j |j | _|j|j |j	 |j
 | _|| j8 }|| j8 }| || t| || | j| j | _| j| j | _| j| jfS r:   )r7   stylepaddingLeftZpaddingRightborderLeftWidthborderRightWidth
deltaWidth
paddingTopZpaddingBottomborderTopWidthborderBottomWidthdeltaHeightr   r   r   r   r   )r'   r   r6   r   r(   r(   r)   r   H  s   


zPmlParagraph.wrapc                 C   sJ   t | jdkr	g S t| ds| || || j8 }|| j8 }t| ||S )Nr   r  )r+   rz   r4   r   r  r  r   r   r   r(   r(   r)   r   e  s   


zPmlParagraph.splitc              	      s  t | ddrQt | jddd }|| jk r2t }| j| | j| j||| j  |d7 }|| jk s| j| j_t }| j| | j| j|| j| j  |d7 }| j | j	j
}j}d}|| }| }| j|j  d|  }| jd|  }	|r    |  j||||	ddd    d _
    jj djj   t|     |_
    fd	d
}
|
jjj|||||	  |
jjj|| ||| ||	  |
jjj |||	 || ||	  |
j!j"j#|||| |    d S )Nr>   FoutlineLastr   r*   r   r   )fillZstrokec                    sV   |r%t | r'|d u rj}|d ur) |  |  |||| d S d S d S d S r:   )r   Z	textColorZsetStrokeColorZsetLineWidthline)Zbstyler   Zcolorx1y1Zx2y2rl   r   r(   r)   _drawBorderLine  s   

z*PmlParagraph.draw.<locals>._drawBorderLine)$r?   r1   rA   r   ZbookmarkPageZaddOutlineEntryrE   ZoutlineOpenr  r   Z	backColor
leftIndentr   ZrightIndentr   r   ZsetFillColorrectr   	translater   r   r  r  r   r   ZborderLeftStyleZborderLeftColorZborderRightStyler   ZborderRightColorZborderTopStyleZborderTopColorZborderBottomStyler  ZborderBottomColor)r'   lastkeybgr  Zbpxyrf   re   r  r(   r  r)   r   s  s   






zPmlParagraph.drawN)r-   r.   r/   r   r   r   r   r(   r(   r(   r)   ry   8  s
    ry   c                   @      e Zd Zdd ZdS )PmlKeepInFramec                 C   s4   t |d}t |d}|| _| || _t| ||S )Ng      ?)r5   ZmaxWidthr7   Z	maxHeightr   r   r   r(   r(   r)   r     s
   

zPmlKeepInFrame.wrapNr-   r.   r/   r   r(   r(   r(   r)   r        r  c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
r{   c                 C   sH   t |t dkr|d t|dd  }n
|du s|dkr|}t||S )z4
        Helper for calculating percentages
        r   g      Y@Nr   rI   )typer   r   )r'   rf   Zmaxwr(   r(   r)   
_normWidth  s
   
zPmlTable._normWidthN@ c              	   C   s,   |dkr
|   p	|}tj| ||||||dS )Nr  )WHaH)r8   r   _listCellGeom)r'   Vrf   sr  r  r  r(   r(   r)   r     s   zPmlTable._listCellGeomc                 C   s4  |  | z| j W n   || _Y | | j|}|}d}| j}t|D ]!\}}|d us0|dkr;| ||}||8 }n|d7 }d }|||< q$|d }	|dkrdt|D ]\}}|d u rct|	|| ||< qRt||kr|t| }
tt|D ]
}|| |
 ||< qvt|| }|dkr|d  |8  < t	
| ||S )Nr   rI   r*   g{Gz?)r7   
totalWidthr  Z
_colWidths	enumerater5   sumranger+   r   r   )r'   r   r6   r#  ZremainingWidthZremainingColsZnewColWidthsr   ZcolWidthZminCellWidthZquotientZdiffr(   r(   r)   r     s<   



zPmlTable.wrap)NNr  )r-   r.   r/   r  r   r   r(   r(   r(   r)   r{     s    

r{   c                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
PmlPageCountc                 C   s   t |  d| _d S ri   )r   r%   second_roundr&   r(   r(   r)   r%   &  s   

zPmlPageCount.__init__c                 C   s   | j }d| _ |S )NT)r(  )r'   r"  r(   r(   r)   isSatisfied*  s   zPmlPageCount.isSatisfiedr   c                 C   r   r:   r(   )r'   rl   r  r  Z_sWr(   r(   r)   drawOn/  r   zPmlPageCount.drawOnN)r   )r-   r.   r/   r%   r)  r*  r(   r(   r(   r)   r'  %  s    r'  c                   @   r  )PmlTableOfContentsc              	   C   s
  || j  | j f}t| jdkrdg}n| j}d}g }g d}t|D ]E\}}	|	dd \}
}}| j|
 }|rG|dd|fd|ft||jf |j}t	d|
 |dt
d	}t||}tt||}|||g q"t||t|d
| _| j| j||\| _| _| j| jfS )z>
        All table properties should be known by now.
        r   )r   z!Placeholder for table of contentsr   ))ZVALIGNr   r   r   r   ZTOP)ZLEFTPADDINGr,  r-  r   )ZRIGHTPADDINGr,  r-  r   )
TOPPADDINGr,  r-  r   )ZBOTTOMPADDINGr,  r-  r   Nr   r.  r   zleftColLevel%d)rZ   parentr  	alignment)Z	colWidthsr   )ZrightColumnWidthr+   Z_lastEntriesr$  ZlevelStylesrT   r5   ZspaceBeforeZ
spaceAfterr   r   r   rL   r   r   Z_tableZwrapOnr1   r   r   )r'   r   r6   ZwidthsZ_tempEntriesZ
lastMarginZ	tableDataZ
tableStyler   entrylevelrE   ZpageNumZleftColStyleZrightColStyleZleftParaZ	rightParar(   r(   r)   r   4  sD   


zPmlTableOfContents.wrapNr  r(   r(   r(   r)   r+  3  r  r+  c                   @   r   )PmlRightPageBreakc                 C   r   r:   r(   r&   r(   r(   r)   r%   k  r   zPmlRightPageBreak.__init__c                 C   s2   | j  d s|| _|| _||fS d | _| _dS Nr   r   r,  r1   rj   r   r   r   r(   r(   r)   r   n     zPmlRightPageBreak.wrapNr-   r.   r/   r%   r   r(   r(   r(   r)   r3  j      r3  c                   @   r   )PmlLeftPageBreakc                 C   r   r:   r(   r&   r(   r(   r)   r%   x  r   zPmlLeftPageBreak.__init__c                 C   s2   | j  d r|| _|| _||fS d | _| _dS r4  r5  r   r(   r(   r)   r   {  r6  zPmlLeftPageBreak.wrapNr7  r(   r(   r(   r)   r9  w  r8  r9  c                   @   s*   e Zd Z		dddZdd	 Zd
d ZdS )PmlInputrE   
   r   Nr   c                 C   s:   || _ || _|| _|| _|| _|d ur|ng | _|| _d S r:   )r   r   r  rZ   defaultoptions	multiline)r'   rZ   Z
input_typer   r   r<  r=  r>  r(   r(   r)   r%     s   
zPmlInput.__init__c                 G   s   | j | jfS r:   )r   r   )r'   r   r(   r(   r)   r     rr   zPmlInput.wrapc              
   C   s  | j }|  |dd | jdkr-tj|| jdd| j| j| j	d |
dd| j| j nX| jdkr=|
dd| j| j nH| jdkre| jrPt|| jddd n
t|| jd	dd |
dd| j| j n | jd
krt|| j| j| jdd| j| j |
dd| j| j |  d S )NZ	Helveticar;  rE   r   )r>  ZradioZcheckboxZYesZOffselect)r1   r   ZsetFontr  pdfformZtextFieldRelativerZ   r   r   r>  r  r<  ZbuttonFieldRelativeZselectFieldRelativer=  r   )r'   rX   r(   r(   r)   r     s"   
 


"zPmlInput.draw)rE   r;  r;  r   Nr   )r-   r.   r/   r%   r   r   r(   r(   r(   r)   r:    s    

r:  )OrC   loggingr   Zhashlibr   htmlr   rB   ior   r   Z	PIL.Imager   r   Zreportlab.pdfbase.pdfformZpdfbaser@  Zreportlab.lib.enumsr   Zreportlab.lib.stylesr   Zreportlab.lib.utilsr   r	   r
   r   Zreportlab.platypus.doctemplater   r   r   Zreportlab.platypus.flowablesr   r   r   r   Z"reportlab.platypus.tableofcontentsr   Zreportlab.platypus.tablesr   r   Zreportlab.rl_configr   Zxhtml2pdf.builders.watermarksr   Zxhtml2pdf.reportlab_paragraphr   Zxhtml2pdf.utilr   r   Zxhtml2pdf.filesr   Zreportlab.graphicsr   r   Zsvglib.svglibr   ImportError	getLoggerr   r   r;   r$   r    r0   r9   r]   Z_ctrobjectr   r   r   ry   r  r{   r'  r+  r3  r9  r:  r(   r(   r(   r)   <module>   s`   
XY 7b "	C7