
    j5j                    V   d Z ddlmZ ddlZddlZddlmZ ddl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 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  ej<                  e      Z  G d de      Z!ed        Z"ed        Z#ed        Z$e	 	 	 	 	 	 	 	 	 	 	 	 dd       Z%edd       Z&y)z3Built-in plugin to implement PDF page optimization.    )annotationsN)Sequence)Path)	Annotated)	BaseModelFieldmodel_validator)Executor
PdfContexthookimpl)jbig2encpngquant)get_pdf_save_settings)numericoptimize)check_external_programc                      e Zd ZU dZdZded<   dZded<   dZded	<   d
Zded<   e	ddd       Z
 ed      d        Z	 	 	 	 ddZy)OptimizeOptionsz%Options specific to PDF optimization.   zkAnnotated[int, Field(ge=0, le=3, description='Optimization level (0=none, 1=safe, 2=lossy, 3=aggressive)')]levelr   zVAnnotated[int, Field(ge=0, le=100, description='JPEG quality level for optimization')]jpeg_qualityzUAnnotated[int, Field(ge=0, le=100, description='PNG quality level for optimization')]png_quality333333?z\Annotated[float, Field(ge=0.4, le=0.9, description='JBIG2 symbol classification threshold')]jbig2_thresholdc           	     b   |j                  dd      }|j                  ddt        t        dd      dd	       |j                  d
t	        t        dd      ddd       |j                  dt	        t        dd      dddt
        j                         |j                  dt	        t        dd      ddd       |j                  ddt
        j                         |j                  dt	        t        dd      ddt
        j                         |j                  dt	        t        dd      ddd       y )!a  Add optimization-specific arguments to the argument parser.

        Args:
            parser: The argument parser to add arguments to
            namespace: The namespace prefix for argument names
                (not used for optimize for backward compatibility)
        zOptimization optionsz*Control how the PDF is optimized after OCRz-Oz
--optimizer      r   a  Control how PDF is optimized after processing:0 - do not optimize; 1 - do safe, lossless optimizations (default); 2 - do lossy JPEG and JPEG2000 optimizations; 3 - do more aggressive lossy JPEG and JPEG2000 optimizations. To enable lossy JBIG2, see --jbig2-lossy.)typechoicesdefaulthelpz--jpeg-qualityd   QzAdjust JPEG quality level for JPEG optimization. 100 is best quality and largest output size; 1 is lowest quality and smallest output; 0 uses the default.)r   r    metavarr!   z--jpg-qualityr   )r   r    r$   destr!   z--png-qualityzeAdjust PNG quality level to use when quantizing PNGs. Values have same meaning as with --jpeg-qualityz--jbig2-lossy
store_true)actionr!   z--jbig2-page-group-sizei'  Nz--jbig2-thresholdg?g?r   TzSAdjust JBIG2 symbol code classification threshold (default 0.85), range 0.4 to 0.9.N)add_argument_groupadd_argumentintranger   argparseSUPPRESSfloat)clsparser	namespace
optimizings       W/var/www/html/qr/venv/lib/python3.12/site-packages/ocrmypdf/builtin_plugins/optimize.pyadd_arguments_to_parserz'OptimizeOptions.add_arguments_to_parser/   sd    .."$P

 	!QK< 	  	
 	a%& 	  	
 	a%"" 	  	
 	a%B 	  		
 	"" 	  	

 	%a'"" 	  	
 	S)4 	  		
    after)modec                    | j                   dk(  r<t        | j                  dkD  | j                  dkD  g      rt        j                  d       | S )z-Validate optimization options are consistent.r   zTThe arguments --png-quality and --jpeg-quality will be ignored because --optimize=0.)r   anyr   r   logwarning)selfs    r5   !validate_optimization_consistencyz1OptimizeOptions.validate_optimization_consistency   sI     ::?sD$4$4q$8$:K:Ka:O#PQKK8 r7   c                    | j                   dk\  rP|j                  dd      st        j                  d       |j                  dd      st        j                  d       yyy)zValidate options that require external context.

        Args:
            external_programs_available: Dict of program name -> availability
           r   Fz>pngquant is not available, so PNG optimization will be limitedr   z@jbig2enc is not available, so JBIG2 optimization will be limitedN)r   getr<   r=   )r>   external_programs_availables     r5   validate_with_contextz%OptimizeOptions.validate_with_context   sZ     ::?.22:uET /22:uEV F r7   Nr   )r3   str)rC   zdict[str, bool]returnNone)__name__
__module____qualname____doc__r   __annotations__r   r   r   classmethodr6   r	   r?   rD    r7   r5   r   r      s    / 	
 
  
 	
   

 	
   
 	   
 N
 N
` '" #+:	r7   r   c                     dt         iS )z#Register optimization option model.r   )r   rN   r7   r5   register_optionsrP      s     ((r7   c                .    t         j                  |        y )N)r   r6   )r2   s    r5   add_optionsrR      s     ++F3r7   c                H   t        | dd      rt        j                  d       t        | dd      dvrt        j                  d       | j                  dk\  rt	        d	d	t
        j                  d
d       | j                  dk\  r t	        ddt        j                  ddd       yy)z-Check external dependencies for optimization.jbig2_lossyFzThe --jbig2-lossy option is deprecated and will be ignored. Lossy JBIG2 compression has been removed due to risks of character substitution errors.jbig2_page_group_sizer   )r   NzEThe --jbig2-page-group-size option is deprecated and will be ignored.rA   r   z2.12.2z--optimize {2,3})programpackageversion_checkerneed_versionrequired_forjbig2r   z0.28T)rV   rW   rX   rY   rZ   recommendedN)getattrr<   r=   r   r   r   versionr   )optionss    r5   check_optionsr`      s     wu--	

 w/39DS	
 1$,,!+	
 1 	$,,+	
 r7   c                   t        dd|it        |j                  j                        }t	        | ||||      }g }|j                  j                  dk(  r|j                  d       ||fS t        j                         t        j                         d}|j                         D ]  \  }	}
|
r	|j                  d|	 d        ||fS )N	linearizer   zOptimization was disabled.)r[   r   zThe optional dependency 'zD' was not found, so some image optimizations could not be attempted.rN   )
dictr   r_   output_typer   appendr   	availabler   items)	input_pdf
output_pdfcontextexecutorrb   save_settingsresult_pathmessagesimage_optimizersnamerf   s              r5   optimize_pdfrq      s      
 ; ;
<M 9j'=(SKH1$45    '') **,
  0557 	OD)/v 6< =	   r7   c                4    | j                   j                  dk7  S )Nr   )r_   r   )rj   s    r5   is_optimization_enabledrs      s    ??##q((r7   )rh   r   ri   r   rj   r   rk   r
   rb   boolrF   ztuple[Path, Sequence[str]])rj   r   rF   rt   )'rK   
__future__r   r.   loggingcollections.abcr   pathlibr   typingr   pydanticr   r   r	   ocrmypdfr
   r   r   ocrmypdf._execr   r   ocrmypdf._pipeliner   ocrmypdf.clir   ocrmypdf.optimizer   ocrmypdf.subprocessr   	getLoggerrH   r<   r   rP   rR   r`   rq   rs   rN   r7   r5   <module>r      s    : "   $   6 6 3 3 - 4   & 6g!Ai AH 
) 
)
 
4 
4
 
!
 
!
H 
!!! ! 	!
 !  ! 
!: 
) 
)r7   