)EjsUddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZddlmZdd lmZdd lmZmZmZmZdd lm Z dd l!m"Z" dd l#m$Z$m%Z%m&Z&m'Z(n#e)$r dZ$dZ%dZ&dZ(YnwxYw ddl*m+Z+e+j,Z-n#e)e.f$rdZ-YnwxYwe r ddl*m$Z/ddl0m1Z1neZ/ee2d< ddl3Z3n #e)$rdZ3YnwxYweGddZ4ej5e6Z7dZ8e4Z9gdZ:dZ;dZ dd)dd2ePdzd3ePdzdeBfd4ZQd5eeMdeBfd6ZRde?eSeBeMfeMeMeMffd7ZTd)dd,ed8edeBfd9ZU d>d)dd2ePdzd3ePdzdeBfd:ZVd)ddeDfd;ZWdS)?N) dataclass)BytesIO)ceil)Path) TYPE_CHECKINGAnyBinaryIOIterableOptional TypeAlias TypeGuardUnion no_type_check)urlopen) FPDFException) ImageCache ImageFilterRasterImageInfoVectorImageInfo) SVGObject) ImageType)ImageImageCmsTiffImagePluginfeatures) Resampling)r)ImageCmsProfilePILImageceZdZUdZeed<dS) ImageSettingscompression_levelN)__name__ __module__ __qualname__r#int__annotations__DC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fpdf/image_parsing.pyr!r!>s% sr*r!)AUTO FlateDecode DCTDecode JPXDecode LZWDecode(r@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~rA!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_?irr` image_cachenamedimsreturnct|ttfrt|dr_ t t|t t||S#t $r}td||d}~wwxYwt|trEt| r$t dtj ||St|tj rEt| rt d||St|tr|d}}nt|rV|}t!jdd}||||}}nt|ttj frt|tj r| n|}| }t!jdd}||||}}nt|d}}|j|}||d d z|d <nt-|||j|}t1|jd z|d <d |d <d|d <|d } | ]t2d|| |jvr|j| |d <n#t1|j} | |j| <| |d <d|d <||j|<|||fS)ao Read an image and load it into memory. For raster images: following this call, the image is inserted in `image_cache.images`, and following calls to `fpdf.fpdf.FPDF.image()` will re-use the same cached values, without re-reading the image. For vector images: the data is loaded and the metadata extracted. Args: image_cache: an `ImageCache` instance, usually the `.image_cache` attribute of a `FPDF` instance. name: either a string representing a file path to an image, an URL to an image, an io.BytesIO, or a instance of `PIL.Image.Image`. dims (tuple[int, int]): optional dimensions as a tuple (width, height) to resize the image (raster only) before storing it in the PDF. Returns: A tuple, consisting of 3 values: the name, the image data, and an instance of a subclass of `ImageInfo`. z.svgr0zCould not parse file: N vector_imagemd5F)usedforsecurityusagesriiccp_iiccpzHICC profile found for image %s - It will be inserted in the PDF document) isinstancestrrendswith get_svg_info load_image Exception ValueErrorbytes_is_svgstripiorgetvalue _is_pil_imagetobyteshashlibnewupdate hexdigestimagesget get_img_info image_filterlenLOGGERdebug icc_profiles) r0r1r2error raster_nameimgbytes_img_hashinfor<r;s r+ preload_imager]nsl8$d $$IT););F)C)CI ID :c$ii00k  I I Irrer_r_decode_base64_imageopen)rcurl_file local_files r+rArAs(Wb&7BCCx  (HsDk)J)J(x}}'''(D!!!x==233.X   ,(8==??++ , , , , , , , , , , , , , , , , ,   W % %.#H--- h  *z(())******************s$?!C--C14C1-!EE"E base64Imagec|d}t|dkrtd|d}tj|}t |S)z7Decode the base 64 image string into an io byte stream.zbase64,rpz!Unsupported non-base64 image datar)splitrSNotImplementedErrorbase64 b64decoder)rmfrags imageData decodedDatas r+ririsZ   i ( (E 5zzQ!"EFFFaI"9--K ;  r*r<cH tjt|}n1#tj$rtd|YdSwxYwt |jj }|dvrtd||dSdS)z%Checks the validity of an ICC profilezInvalid ICC Profile in file %sF)GRAYRGBzEUnsupported color space %s in ICC Profile of file %s - cf. issue #711T) rgetOpenProfiler PyCMSErrorrTr\r>profile xcolor_spacerF)r<rcr{ color_spaces r+ is_iccp_validr~s%-%rArjrIrrDresizeRESAMPLEformatmode PIL_featurescheckconvertsizerr\r~rCrrMrerStag_v2r STRIPOFFSETSSTRIPBYTECOUNTSPHOTOMETRIC_INTERPRETATIONccitt_payload_location_from_pilrP FILLORDER bytearray enumerateTIFFBitRevTablelower_to_dataslice _has_alphapalettesetattrclose)rcrYrRr2 is_pil_imgkeep_bytes_io_open jpeg_inverted img_raw_data img_alteredrrr\r<rrcolspacephotoroffsetlength ccittrawdata fillorderr:n alpha_channelrs r+rQrQs }RSSSJM'+L  *S4+.. !(++ j&& 3  'W55 c5 ! ! "3<!>_,LL(L x;<=#@#@kk&!! xIIIkk&!!  x=  \[%@%@kk%   d   ; ;kk# 8DAq   D D  -0( ; ; +8M*D  :  LK$?$?x?**%6"S((V##%7"S( $ S%7"S(( !FCH!F!FGGG   a KK(--//" % -E3EE!EE     K J&  000'833CJ;<==BBCJ>?@@AEEJIJEHzz! R5RR=SAANFF   f % % %.:.?.?.G.GL '@AAI INNa(66 %l3399DAq&5a&8LOO$\22  !F9!F!FGGG!3 Ch KK( "% -_sx<'8'8'>'>'@'@__A__\]__     KL x3/S(\22V S/S(\22V T  /S(aq)) \ NNNV c?? T|4   %S,]SSSDM S,S(\22V -0[-Dck))$U  8<< - - 9lS ? ? % F##\aq@Q@QDM T  ,S(-0[-Dck))$U aq)) \ NNNV c?? T|4   %S,]SSSDM V  /S(\22V U  .S(\22V .S(aq)) \ NNNV c?? T|4   %S,]SSSDM 4# 4 4 4 4B x3 ; ; ; ; ;    Ct $ $ $ $ IIKKKKK%     Kr*cFeZdZdZdededefdZd dZd ed ed eddfd ZdS) temp_attrzM temporary change the attribute of an object using a context manager r`fieldvaluecL||_||_||_d|_d|_dS)NF)r`rrexists old_value)selfr`rrs r+__init__ztemp_attr.__init__s)   "r*r3Nct|j|jr&d|_t |j|j|_t |j|j|jdS)NT)rhr`rrgetattrrrr)rs r+ __enter__ztemp_attr.__enter__ sR 48TZ ( ( ;DK$TXtz::DN$*dj11111r*exctypeexcinstexctbc|jr"t|j|j|jdSt |j|jdSrb)rrr`rrdelattr)rrrrs r+__exit__ztemp_attr.__exit__sD ; * DHdj$. 9 9 9 9 9 DHdj ) ) ) ) )r*)r3N) r$r%r&__doc__rr>rrrr)r*r+rrs#C##C####2222 **c*#*$******r*rc|jtj}|jtj}t |dkst |dkrt d||c\}\}||fS)z[ returns the byte offset and length of the CCITT payload in the original TIFF data rz;Transcoding multiple strips not supported by the PDF format)rrrrrSrp)rY strip_offsets strip_bytesrrs r+rrsJ;r*c>t}tjjj}jddzdzjdzt tdrGttd5| |ddd d d n #1swxYwYnytj j d td td tffd }ttj d|5| |ddd d d n #1swxYwY|dtj|}t#|\}}||||S)zN Convert the open PIL.Image imgdata to compressed CCITT Group4 data. rrr@r STRIP_SIZErr)rrNrtagr3ctjjdtjgtjdgi}||||S)Nrr)r ROWSPERSTRIPrrrrP)rr overridesrYpillow__getitem__tmp_strip_sizes r+ __getitem__z)transcode_monochrome..__getitem__VsQ,chqk/.1A,qcI ==&7&7c&B&BCC Cr*r)rr frombytesrrrJrhrrsaveImageFileDirectory_v2rrr'objectrrjrre) rYnewimgioimg2rnewimgrrrrs ` @@r+transcode_monochromer8s@yyH ?38SXs{{}} = =DhqkAo!+chqk9N --E  n E E E E IIhv8I D D D E E E E E E E E E E E E E E E ,AM Dc D D D D D D D D D D  1=+   E E IIhv8I D D D E E E E E E E E E E E E E E E  MM! Z ! !F4V<))m>S.S.S" "#}"4!9 v!n"45=>>> ==r*crdtdD}tdz}t}d|zdz }||||fS)zK Reset the encoding table and coding state to initial conditions. c0i|]}t|g|Sr))rD).0r:s r+ zclear_table..s" / / /qUA3ZZ / / /r*r/r)rrLZW_INITIAL_BITS_PER_CODE)rrrrs r+rrsJ 0 /E#JJ / / /E"I-M=(A-N )]N ::r*kwargsc |dkr t|fi|S|dkrt|S|dkr t|fi|S|jdkr|d}|jdkr|d}|dkr9t }||d |S|d kr9t }||d |Std |d)Nr-rr0rrrrxr.r)rr/JPEG2000zUnsupported image filter: "") _to_zdatarr rrrrrHr)rYrRrcompressed_bytess r+rrs0}$$''''''''#C((({""3))&))) x4kk# x6kk%  {"""99 !&111((***{"""99 !*555((*** ElEEE F FFr*c2t|}|r||=|r||}|jdkrt|jddz }n;t ||jd|jdzz}|jd|z}t}t dt ||D]7}|d|||||z8tj |tj S)Nrrr@rr)level) rrJrrrrSrrzlibcompressSETTINGSr#)rYrrrrrrr:s r+r r s  S[[]] # #D  "L! x3 a((Tsx{SXa['@A8A;/!  1c$ii * *99  '''  a!h,&6!78888 =*(2L M M MMr*c>|d}|\}}|dkr|dkrdS||krdSt*tj|dkSt d|DS)a Return True if the image has any non-opaque alpha channel values. For the alpha band, `getextrema()` yields the min & max values across all pixels: - (255, 255): every pixel is fully opaque, so we can fast-return False. - (x, x) where x != 255: the channel is a flat non-opaque mask, so True. Otherwise we need to scan for any value different from 255 (using NumPy if available). Ar.FTNc3"K|] }|dkV dS)r.Nr))rcs r+ z_has_alpha..,s&99AqCx999999r*) getchannel getextremarasarrayanyrJ)rYrlohis r+rrsNN3''M  % % ' 'FB SyyR3YYu Rxxt  m,,388::: 99!6!6!8!8999 9 99r*rb)Nr,N)NN)XrqrKrGloggingr$ dataclassesrrmathrpathlibrtypingrrr r r r r rrurllib.requestrerrorsrimage_datastructuresrrrrrrutilrPILrrrrr ImportError PIL.ImagerLANCZOSrAttributeErrorr PIL.ImageCmsrr(rr! getLoggerr$rTSUPPORTED_IMAGE_FILTERSr&rrrrrtuplefloatr>rDr]boolrErIrArir~r@rQrr'rrrr rdictrrr rr)r*r+rGs   !!!!!!                      #"""""!!!!!! NNNNNNNNNNNNN EHOLLL  $$$$$$!HH^$HHH++++++,,,,,,,HiLLLL EEE           8 $ $X =??< +/U"U"U" U" 5& 'U"  )Z$ <=o%' U"U"U"U"pGEGdGGGG>s>y2>>>>*th.*8****4 c g    t$ /9 3 ? *+(@D &*. ggC4'(g z5(D#t; <gg 5& ' g  ggggT********2c3h<2!j2!U2!2!2!2!n"&!%=/=/ =/$,=/$,=/ =/=/=/=/@(#(5((((V ;U4s +S#s:; ; ; ; ;G*GKG3G5GGGG>"&!%NN N$,N$,N NNNN2:J:4::::::s6) A66 BB B B$#B$>CC  C