
    TAiHU                       S r SSKJr  SSKJrJr  SSKJrJr  SSK	J
r
Jr  SSKJr  SSKJr  SSKJrJr  SS	KrSS
KJrJr  SSKJr  SSKJr  \(       a  SSKJr  SSKJr  SSKJ r   \RB                  " S5      r"\"" SS9S&S j5       r#\"S'S j5       r$\"S(S j5       r%\"S)S j5       r&\"" SS9S*S j5       r'\"" SS9S+S j5       r(\"S,S j5       r)\"" SS9                    S-S j5       r*\"" SS9S.S j5       r+\"" SS9S/S j5       r,\"" SS9S0S j5       r- " S S\5      r. " S  S!\5      r/\"" SS9S1S" j5       r0\"" SS9                  S2S# j5       r1\"" SS9            S3S$ j5       r2\"" SS9S4S% j5       r3g	)5z%OCRmyPDF pluggy plugin specification.    )annotations)ABCabstractmethod)ArgumentParser	Namespace)SequenceSet)Handler)Path)TYPE_CHECKING
NamedTupleN)Executor
PdfContext)ProgressBar)
Resolution)Image)PageContext)PdfInfoocrmypdfT)firstresultc                     g)zReturns a custom logging handler.

Generally this is necessary when both logging output and a progress bar are both
outputting to ``sys.stderr``.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
N r       O/var/www/html/land-ocr/venv/lib/python3.13/site-packages/ocrmypdf/pluginspec.pyget_logging_consoler   $       r   c                    g)a  Called when this plugin is first loaded into OCRmyPDF.

The primary intended use of this is for plugins to check compatibility with other
plugins and possibly block other blocks, a plugin that wishes to block ocrmypdf's
built-in optimize plugin could do:

.. code-block::

    plugin_manager.set_blocked('ocrmypdf.builtin_plugins.optimize')

It would also be reasonable for an plugin implementation to check if it is unable
to proceed, for example, because a required dependency is missing. (If the plugin's
ability to proceed depends on options and arguments, use ``validate`` instead.)

Raises:
    ocrmypdf.exceptions.ExitCodeException: If options are not acceptable
        and the application should terminate gracefully with an informative
        message and error code.

Note:
    This hook will be called from the main process, and may modify global state
    before child worker processes are forked.
Nr   )plugin_managers    r   
initializer   0   r   r   c                    g)a  Allows the plugin to add its own command line and API arguments.

OCRmyPDF converts command line arguments to API arguments, so adding
arguments here will cause new arguments to be processed for API calls
to ``ocrmypdf.ocr``, or when invoked on the command line.

Note:
    This hook will be called from the main process, and may modify global state
    before child worker processes are forked.
Nr   )parsers    r   add_optionsr"   K   r   r   c                    g)a  Called to ask the plugin to check all of the options.

The plugin may check if options that it added are valid.

Warnings or other messages may be passed to the user by creating a logger
object using ``log = logging.getLogger(__name__)`` and logging to this.

The plugin may also modify the *options*. All objects that are in options
must be picklable so they can be marshalled to child worker processes.

Raises:
    ocrmypdf.exceptions.ExitCodeException: If options are not acceptable
        and the application should terminate gracefully with an informative
        message and error code.

Note:
    This hook will be called from the main process, and may modify global state
    before child worker processes are forked.
Nr   optionss    r   check_optionsr&   Y   r   r   c                    g)aw  Called to obtain an object that manages parallel execution.

This may be used to replace OCRmyPDF's default parallel execution system
with a third party alternative. For example, you could make OCRmyPDF run in a
distributed environment.

OCRmyPDF's executors are analogous to the standard Python executors in
``conconcurrent.futures``, but they do not work the same way. Executors may
be reused for different, unrelated batch operations, since all of the context
for a given job are passed to :meth:`Executor.__call__`.

Should be of type :class:`Executor` or otherwise conforming to the protocol
of that call.

Arguments:
    progressbar_class: A progress bar class, which will be created when

Note:
    This hook will be called from the main process, and may modify global state
    before child worker processes are forked.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )progressbar_classs    r   get_executorr)   p   r   r   c                     g)a  Called to obtain a class that can be used to monitor progress.

OCRmyPDF will call this function when it wants to display a progress bar.
The class returned by this function must be compatible with the
:class:`ProgressBar` protocol.

Example:
    Here is how OCRmyPDF will use the progress bar:

    .. code-block:: python

        pbar_class = pm.hook.get_progressbar_class()
        with pbar_class(**progress_kwargs) as pbar:
            ... # do some work
            pbar.update(1)
Nr   r   r   r   get_progressbar_classr+      r   r   c                    g)a  Called to give a plugin an opportunity to review *options* and *pdfinfo*.

*options* contains the "work order" to process a particular file. *pdfinfo*
contains information about the input file obtained after loading and
parsing. The plugin may modify the *options*. For example, you could decide
that a certain type of file should be treated with ``options.force_ocr = True``
based on information in its *pdfinfo*.

Raises:
    ocrmypdf.exceptions.ExitCodeException: If options or pdfinfo are not acceptable
        and the application should terminate gracefully with an informative
        message and error code.

Note:
    This hook will be called from the main process, and may modify global state
    before child worker processes are forked.
Nr   )pdfinfor%   s     r   validater.      r   r   c	                    g)a  Rasterize one page of a PDF at resolution raster_dpi in canvas units.

The image is sized to match the integer pixels dimensions implied by
raster_dpi even if those numbers are noninteger. The image's DPI will
be overridden with the values in page_dpi.

Args:
    input_file: The PDF to rasterize.
    output_file: The desired name of the rasterized image.
    raster_device: Type of image to produce at output_file.
    raster_dpi: Resolution in dots per inch at which to rasterize page.
    pageno: Page number to rasterize (beginning at page 1).
    page_dpi: Resolution, overriding output image DPI.
    rotation: Cardinal angle, clockwise, to rotate page.
    filter_vector: If True, remove vector graphics objects.
    stop_on_soft_error: If there is an "soft error" such that PDF page image
        generation can proceed, but may visually differ from the original,
        the implementer of this hook should raise a detailed exception. If
        ``False``, continue processing and report by logging it. If the hook
        cannot proceed, it should always raise an exception, regardless of
        this setting. One "soft error" would be a missing font that is
        required to properly rasterize the PDF.

Returns:
    Path: output_file if successful

Note:
    This hook will be called from child processes. Modifying global state
    will not affect the main process or other child processes.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )	
input_fileoutput_fileraster_device
raster_dpipagenopage_dpirotationfilter_vectorstop_on_soft_errors	            r   rasterize_pdf_pager9      r   r   c                    g)aM  Called to filter the image before it is sent to OCR.

This is the image that OCR sees, not what the user sees when they view the
PDF. In certain modes such as ``--redo-ocr``, portions of the image may be
masked out to hide them from OCR.

The main uses of this hook are expected to be hiding content from OCR,
conditioning images to OCR better with filters, and adjusting images to
match any constraints imposed by the OCR engine.

The input image may be color, grayscale, or monochrome, and the
output image may differ. For example, if you know that a custom OCR engine
does not care about the color of the text, you could convert the image to
it to grayscale or monochrome.

Generally speaking, the output image should be a faithful representation of
of the input image. You *may* change the pixel width and height of the
the input image, but you must not change the aspect ratio, and you must
calculate the DPI of the output image based on the new pixel width and
height or the OCR text layer will be misaligned with the visual position.

The built-in Tesseract OCR engine uses this hook itself to downsample
very large images to fit its constraints.

Note:
    This hook will be called from child processes. Modifying global state
    will not affect the main process or other child processes.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )pageimages     r   filter_ocr_imager=      r   r   c                    g)a#  Called to filter the whole page before it is inserted into the PDF.

A whole page image is only produced when preprocessing command line arguments
are issued or when ``--force-ocr`` is issued. If no whole page is image is
produced for a given page, this function will not be called. This is not
the image that will be shown to OCR.

If the function does not want to modify the image, it should return
``image_filename``. The hook may overwrite ``image_filename`` with a new file.

The output image should preserve the same physical unit dimensions, that is
``(width * dpi_x, height * dpi_y)``. That is, if the image is resized, the DPI
must be adjusted by the reciprocal. If this is not preserved, the PDF page
will be resized and the OCR layer misaligned. OCRmyPDF does nothing
to enforce these constraints; it is up to the plugin to do sensible things.

OCRmyPDF will create the PDF page based on the image format used (unless the
hook is overridden). If you convert the image to a JPEG, the output page will
be created as a JPEG, etc. If you change the colorspace, that change will be
kept. Note that the OCRmyPDF image optimization stage, if enabled, may
ultimately chose a different format.

If the return value is a file that does not exist, ``FileNotFoundError``
will occur. The return value should be a path to a file in the same folder
as ``image_filename``.

Note:
    This hook will be called from child processes. Modifying global state
    will not affect the main process or other child processes.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )r;   image_filenames     r   filter_page_imager@     r   r   c                    g)a  Called to convert a filtered whole page image into a PDF.

A whole page image is only produced when preprocessing command line arguments
are issued or when ``--force-ocr`` is issued. If no whole page is image is
produced for a given page, this function will not be called. This is not
the image that will be shown to OCR. The whole page image is filtered in
the hook above, ``filter_page_image``, then this function is called for
PDF conversion.

This function will only be called when OCRmyPDF runs in a mode such as
"force OCR" mode where rasterizing of all content is performed.

Clever things could be done at this stage such as segmenting the page image into
color regions or vector equivalents.

The provider of the hook implementation is responsible for ensuring that the
OCR text layer is aligned with the PDF produced here, or text misalignment
will result.

Currently this function must produce a single page PDF or the pipeline will
fail.  If the intent is to remove the PDF, then create a single page empty
PDF.

Args:
    page: Context for this page.
    image_filename: Filename of the input image used to create output_pdf,
        for "reference" if recreating the output_pdf entirely.
    output_pdf: The previous created output_pdf.

Returns:
    output_pdf

Note:
    This hook will be called from child processes. Modifying global state
    will not affect the main process or other child processes.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )r;   r?   
output_pdfs      r   filter_pdf_pagerC   ,  r   r   c                  .    \ rS rSr% SrS\S'   S\S'   Srg)	OrientationConfidenceiW  aF  Expresses an OCR engine's confidence in page rotation.

Attributes:
    angle: The clockwise angle (0, 90, 180, 270) that the page should be
        rotated. 0 means no rotation.
    confidence: How confident the OCR engine is that this the correct
        rotation. 0 is not confident, 15 is very confident. Arbitrary units.
intanglefloat
confidencer   N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r   r   r   rE   rE   W  s     Jr   rE   c                     \ rS rSrSr\\SS j5       5       r\\SS j5       5       r\S 5       r	\\SS j5       5       r
\\SS j5       5       r\SS j5       r\\          SS	 j5       5       r\\          SS
 j5       5       rSrg)	OcrEngineie  zA class representing an OCR engine with capabilities similar to Tesseract OCR.

This could be used to create a plugin for another OCR engine instead of
Tesseract OCR.
c                     g)z&Returns the version of the OCR engine.Nr   r   r   r   versionOcrEngine.versionl  r   r   c                    g)a  Returns the creator tag to identify this software's role in creating the PDF.

This tag will be inserted in the XMP metadata and DocumentInfo dictionary
as appropriate. Ideally you should include the name of the OCR engine and its
version. The text should not contain line breaks. This is to help developers
like yourself identify the software that produced this file.

OCRmyPDF will always prepend its name to this value.
Nr   r$   s    r   creator_tagOcrEngine.creator_tagq  r   r   c                    g)zReturns name of OCR engine and version.

This is used when OCRmyPDF wants to mention the name of the OCR engine
to the user, usually in an error message.
Nr   )selfs    r   __str__OcrEngine.__str__~  r   r   c                    g)zReturns the set of all languages that are supported by the engine.

Languages are typically given in 3-letter ISO 3166-1 codes, but actually
can be any value understood by the OCR engine.
Nr   r$   s    r   	languagesOcrEngine.languages  r   r   c                    g)z%Returns the orientation of the image.Nr   r0   r%   s     r   get_orientationOcrEngine.get_orientation  r   r   c                    g)z2Returns the deskew angle of the image, in degrees.g        r   ra   s     r   
get_deskewOcrEngine.get_deskew  s     r   c                    g)a  Called to produce a hOCR file from a page image and sidecar text file.

A hOCR file is an HTML-like file that describes the position of text on a
page. OCRmyPDF can create a text only PDF from the hOCR file and graft it
onto the output PDF.

This function executes in a worker thread or worker process. OCRmyPDF
automatically parallelizes OCR over pages. The OCR engine should not
introduce more parallelism.

Args:
    input_file: A page image on which to perform OCR.
    output_hocr: The expected name of the output hOCR file.
    output_text: The expected name of a text file containing the
        recognized text.
    options: The command line options.
Nr   )r0   output_hocroutput_textr%   s       r   generate_hocrOcrEngine.generate_hocr  r   r   c                    g)a}  Called to produce a text only PDF from a page image.

A text only PDF should contain no visible material of any kind, as it
will be grafted onto the input PDF page. It must be sized to the
exact dimensions of the input image.

This function executes in a worker thread or worker process. OCRmyPDF
automatically parallelizes OCR over pages. The OCR engine should not
introduce more parallelism.

Args:
    input_file: A page image on which to perform OCR.
    output_pdf: The expected name of the output PDF.
    output_text: The expected name of a text file containing the
        recognized text.
    options: The command line options.
Nr   )r0   rB   ri   r%   s       r   generate_pdfOcrEngine.generate_pdf  r   r   r   N)returnstr)r%   r   ro   rp   )r%   r   ro   zSet[str])r0   r   r%   r   ro   rE   )r0   r   r%   r   ro   rH   )
r0   r   rh   r   ri   r   r%   r   ro   None)
r0   r   rB   r   ri   r   r%   r   ro   rq   )rJ   rK   rL   rM   rN   staticmethodr   rT   rW   r[   r^   rb   re   rj   rm   rP   r   r   r   rR   rR   e  s'    5  5 	  	      4  4   '+:>IR	  * &*9=HQ	  r   rR   c                     g)zReturns an OcrEngine to use for processing this file.

The OcrEngine may be instantiated multiple times, by both the main process
and child process.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   r   r   r   get_ocr_enginert     r   r   c                    g)at  Generate a PDF/A.

This API strongly assumes a PDF/A generator with Ghostscript's semantics.

OCRmyPDF will modify the metadata and possibly linearize the PDF/A after it
is generated.

Arguments:
    pdf_pages: A list of one or more filenames, will be merged into output_file.
    pdfmark: A PostScript file intended for Ghostscript with details on
        how to perform the PDF/A conversion.
    output_file: The name of the desired output file.
    context: The current context.
    pdf_version: The minimum PDF version that the output file should be.
        At its own discretion, the PDF/A generator may raise the version,
        but should not lower it.
    pdfa_part: The desired PDF/A compliance level, such as ``'2b'``.
    progressbar_class: The class of a progress bar, which must implement
        the ProgressBar protocol. If None, no progress is reported.
    stop_on_soft_error: If there is an "soft error" such that PDF/A generation
        can proceed and produce a valid PDF/A, but output may be invalid or
        may not visually resemble the original, the implementer of this hook
        should raise a detailed exception. If ``False``, continue processing
        and report by logging it. If the hook cannot proceed, it should always
        raise an exception, regardless of this setting.

Returns:
    Path: If successful, the hook should return ``output_file``.

Note:
    This is a :ref:`firstresult hook<firstresult>`.

Note:
    Before version 15.0.0, the ``context`` was not provided and ``compression``
    was provided instead. Plugins should now read the context object to determine
    if compression is requested.
Nr   )	pdf_pagespdfmarkr1   contextpdf_version	pdfa_partr(   r8   s           r   generate_pdfar{     r   r   c                    g)a  Optimize a PDF after image, OCR and metadata processing.

If the input_pdf is a PDF/A, the plugin should modify input_pdf in a way
that preserves the PDF/A status, or report to the user when this is not possible.

If the implementation fails to produce a smaller file than the input file, it
should return input_pdf instead.

A plugin that implements a new optimizer may need to suppress the built-in
optimizer by implementing an ``initialize`` hook.

Arguments:
    input_pdf: The input PDF, which has OCR added.
    output_pdf: The requested filename of the output PDF which should be created
        by this optimization hook.
    context: The current context.
    executor: An initialized executor which may be used during optimization,
        to distribute optimization tasks.
    linearize: If True, OCRmyPDF requires ``optimize_pdf`` to return a linearized,
        also known as fast web view PDF.

Returns:
    Path: If optimization is successful, the hook should return ``output_file``.
        If optimization does not produce a smaller file, the hook should return
        ``input_file``.
    Sequence[str]: Any comments that the plugin wishes to report to the user,
        especially reasons it was not able to further optimize the file. For
        example, the plugin could report that a required third party was not
        installed, so a specific optimization was not attempted.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )	input_pdfrB   rx   executor	linearizes        r   optimize_pdfr     r   r   c                    g)ar  For a given PdfContext, OCRmyPDF asks the plugin if optimization is enabled.

An optimization plugin might be installed and active but could be disabled by
user settings.

If this returns False, OCRmyPDF will take certain actions to finalize the PDF.

Returns:
    True if the plugin's optimization is enabled.

Note:
    This is a :ref:`firstresult hook<firstresult>`.
Nr   )rx   s    r   is_optimization_enabledr   1  r   r   )ro   r
   )r   zpluggy.PluginManagerro   rq   )r!   r   ro   rq   )r%   r   ro   rq   )r(   type[ProgressBar]ro   r   )ro   r   )r-   r   r%   r   ro   rq   )r0   r   r1   r   r2   rp   r3   r   r4   rF   r5   zResolution | Noner6   z
int | Noner7   boolr8   r   ro   r   )r;   r   r<   Image.Imagero   r   )r;   r   r?   r   ro   r   )r;   r   r?   r   rB   r   ro   r   )ro   rR   )rv   z
list[Path]rw   r   r1   r   rx   r   ry   rp   rz   rp   r(   ztype[ProgressBar] | Noner8   r   ro   r   )r}   r   rB   r   rx   r   r~   r   r   r   ro   ztuple[Path, Sequence[str]])rx   r   ro   r   )4rN   
__future__r   abcr   r   argparser   r   collections.abcr   r	   loggingr
   pathlibr   typingr   r   pluggyr   r   r   ocrmypdf._progressbarr   ocrmypdf.helpersr   PILr   ocrmypdf._jobcontextr   ocrmypdf.pdfinfor   HookspecMarkerhookspecr   r   r"   r&   r)   r+   r.   r9   r=   r@   rC   rE   rR   rt   r{   r   r   r   r   r   <module>r      s   , " # . )   ,  ) - ' 1(   , 
d  
 
4 

 

 
 
, 
d 6 
d & 
 
( 
d+++ + 	+
 +  + + + + 
+ +\ 
d D 
d! !H 
d' 'TJ ` `F 
d  
d... . 	.
 . . 0. . 
. .b 
d''' ' 	'
 '  ' 'T 
d r   