Preprocess

Fonctions de prétraitements des fichiers PDFs.

Convertir les fichiers PDF natifs en PDF/A

Utilise ocrmypdf sans appeler le moteur d'OCR.

process_files(df_meta, out_pdf_dir, redo=False, keep_pdfa=False, verbose=0)

Convertir les fichiers PDF natifs en PDF/A.

Parameters:
  • df_meta (DataFrame) –

    Liste de fichiers PDF à traiter, avec leurs métadonnées.

  • out_pdf_dir (Path) –

    Dossier de sortie pour les PDF/A.

  • redo (bool, default: False ) –

    Si True, réanalyse les fichiers déjà traités.

  • keep_pdfa (bool, default: False ) –

    Si True, n'efface pas les fichiers PDF générés par l'OCR.

  • verbose (int, default: 0 ) –

    Niveau de verbosité d'ocrmypdf (-1, 0, 1, 2): https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.Verbosity

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées des fichiers d'entrée et chemins vers les fichiers PDF/A.

Convertir un fichier PDF en PDF/A (archivable)

Utilise ocrmypdf.

NB: Certaines métadonnées du PDF sont perdues https://github.com/ocrmypdf/OCRmyPDF/issues/327.

convert_pdf_to_pdfa(fp_pdf_in, fp_pdf_out, verbose=0)

Convertir un PDF en PDF/A.

Utilise ocrmypdf sans appliquer d'OCR.

Parameters:
Returns:
  • returncode( int ) –

    0 si un fichier PDF/A a été produit, 1 sinon.

Sources de données

Déterminer le type des fichiers PDF

Un fichier peut être considéré PDF natif ("texte") ou non ("image").

Le type est déterminé pour le fichier entier, sans rentrer dans les cas particuliers commme un PDF texte dans lequel une page numérisée a été insérée en tant qu'image. Actuellement, de tels fichiers sont probablement considérés comme des fichiers PDF non natifs ("image"), en se basant sur les métadonnées du fichier PDF.

guess_pdf_type(df_row)

Devine le type de PDF: natif ("texte") ou non ("image")

Parameters:
  • df_row (NamedTuple) –

    Métadonnées et propriétés du fichier PDF.

Returns:
  • pdf_type( string, one of {"text", "image"} ) –

    Type de PDF: "text" pour les PDF natifs, "image" pour les autres qui devront être OCRisés.

process_files(df_meta)

Déterminer le type des fichiers PDF.

Un fichier PDF peut être natif ("texte") ou non ("image").

Parameters:
  • df_meta (DataFrame) –

    Liste de fichiers PDF à traiter, avec leurs métadonnées.

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées des fichiers d'entrée et chemins vers les fichiers PDF/A et TXT.

Extrait le texte natif des fichiers PDF avec pdfminer.six

Nécessite d'installer pdfminer.six.

Non utilisé pour le moment, faute d'avoir identifié les bonnes valeurs des paramètres utilisés pour l'analyse du layout, mais pourrait être utile pour ré-analyser les arrêtés de certaines communes avec une mise en page compliquée.

extract_native_text_pdfminer(fp_pdf_in, fp_txt_out, page_beg, page_end)

Extrait le texte natif d'un PDF avec pdfminer.six.

Si le texte extrait par pdfminer.six n'est pas vide alors un fichier TXT est produit, sinon aucun fichier TXT n'est produit et un code d'erreur est renvoyé.

Les pages sont séparées par un "form feed" (" ", " " en python).

Le texte est normalisé en forme NFC (NEW 2023-03-10, NFC plutôt que NFKC car ce dernier transforme "º" en "o").

Parameters:
  • fp_pdf_in (Path) –

    Fichier PDF d'entrée.

  • fp_txt_out (Path) –

    Fichier TXT produit par extraction directe du texte.

  • page_beg (int) –

    Numéro de la première page à traiter, la première page d'un PDF est supposée numérotée 1.

  • page_end (int) –

    Numéro de la dernière page à traiter (cette page étant incluse).

Returns:
  • returncode( int ) –

    0 si un fichier TXT a été produit, 1 sinon.

Extrait le texte natif des fichiers PDF avec pdftotext

https://github.com/jalan/pdftotext

Dépendances Windows (https://github.com/jalan/pdftotext#os-dependencies): * Microsoft Visual C++ Build Tools: https://visualstudio.microsoft.com/fr/visual-cpp-build-tools/ * poppler ( conda install -c conda-forge poppler )

extract_native_text_pdftotext(fp_pdf_in, fp_txt_out, page_beg, page_end)

Extrait le texte natif d'un PDF avec pdftotext.

Si le texte extrait par pdftotext n'est pas vide alors un fichier TXT est produit, sinon aucun fichier TXT n'est produit et un code d'erreur est renvoyé.

Les pages sont séparées par un "form feed" (" ", " " en python).

Le texte est normalisé en forme NFC (NEW 2023-03-10, NFC plutôt que NFKC car ce dernier transforme "º" en "o").

Parameters:
  • fp_pdf_in (Path) –

    Fichier PDF d'entrée.

  • fp_txt_out (Path) –

    Fichier TXT produit par extraction directe du texte.

  • page_beg (int) –

    Numéro de la première page à traiter, la première page d'un PDF est supposée numérotée 1.

  • page_end (int) –

    Numéro de la dernière page à traiter (cette page étant incluse).

Returns:
  • returncode( int ) –

    0 si un fichier TXT a été produit, 1 sinon.

Extraire le texte natif des fichiers PDF

Le texte natif est extrait avec le wrapper python de l'utilitaire "pdftotext" de poppler.

Le texte natif représente: * pour les PDF natifs ("PDF texte"), l'intégralité du texte ; * pour les PDF non-natifs ("PDF image"), du texte extrait par OCR (de qualité variable) ou des fragments de texte issus d'ajout d'objets natifs, eg. tampon, accusé de réception.

Le texte est normalisé en forme NFC: https://docs.python.org/3/howto/unicode.html#comparing-strings.

extract_native_text(df_row, fp_pdf_in, fp_txt_out)

Extrait le texte natif d'un PDF.

Parameters:
  • df_row (NamedTuple) –

    Métadonnées et informations sur le fichier PDF à traiter.

  • fp_pdf_in (Path) –

    Chemin du fichier PDF à traiter.

  • fp_txt_out (Path) –

    Chemin du fichier txt contenant le texte extrait.

Returns:
  • returncode( int ) –

    Code de retour de l'extraction: 0 si un fichier TXT a été produit, 1 sinon.

process_files(df_meta, out_dir_txt, redo=False)

Traiter un ensemble de fichiers PDF: convertir les PDF en PDF/A et extraire le texte.

Parameters:
  • df_meta (DataFrame) –

    Liste de fichiers PDF à traiter, avec leurs métadonnées.

  • out_dir_txt (Path) –

    Dossier de sortie pour les fichiers texte.

  • redo (bool, default: False ) –

    Si True, réanalyse les fichiers déjà traités.

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées des fichiers d'entrée, chemins vers les fichiers TXT produits et codes de retour de l'extraction de texte natif.

Extraire le texte de fichiers PDF par OCR

Utilise ocrmypdf.

extract_text_from_pdf_image(fp_pdf_in, fp_txt_out, fp_pdf_out, page_beg, page_end, redo_ocr=False, verbose=0)

Extraire le texte d'un PDF image et convertir le fichier en PDF/A.

Utilise ocrmypdf. On utilise "-l fra" pour améliorer la reconnaissance de: "à", "è", "ê", apostrophe, "l'", "œ", "ô" etc.

Parameters:
  • fp_pdf_in (Path) –

    Fichier PDF image à traiter.

  • fp_txt_out (Path) –

    Fichier TXT produit, contenant le texte extrait par OCR.

  • fp_pdf_out (Path) –

    Fichier PDF/A produit, incluant le texte océrisé.

  • page_beg (int) –

    Numéro de la première page à traiter, la première page d'un PDF est supposée numérotée 1.

  • page_end (int) –

    Numéro de la dernière page à traiter (cette page étant incluse).

  • redo_ocr (bool, default: False ) –

    Si True, refait l'OCR même si une couche d'OCR est détectée sur certaines pages.

  • verbose (int, default: 0 ) –

    Niveau de verbosité d'ocrmypdf (-1, 0, 1, 2): https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.Verbosity

Returns:

Le texte des PDF non-natifs ("PDF image") est extrait avec ocrmypdf.

ocrmypdf produit un fichier PDF/A incluant une couche de texte extrait par OCR, et un fichier "sidecar" contenant le texte extrait par l'OCR uniquement.

Le fichier PDF/A est effacé, sauf mention contraire explicite par l'option "keep_pdfa".

preprocess_pdf_file(df_row, fp_pdf_in, fp_pdf_out, fp_txt_out, verbose=0)

Extraire le texte par OCR et générer des fichiers PDF/A et txt.

Le fichier PDF est OCRisé avec ocrmypdf, qui crée un PDF/A et un fichier texte "sidecar".

La version actuelle est: ocrmypdf 14.0.3 / Tesseract OCR-PDF 5.2.0 (+ pikepdf 5.6.1).

Parameters:
  • df_row (NamedTuple) –

    Métadonnées et informations sur le fichier PDF à traiter.

  • fp_pdf_in (Path) –

    Chemin du fichier PDF à traiter.

  • fp_pdf_out (Path) –

    Chemin du fichier PDF converti en PDF/A (avec OCR le cas échéant).

  • fp_txt_out (Path) –

    Chemin du fichier txt contenant le texte extrait.

  • verbose (int, default: 0 ) –

    Niveau de verbosité d'ocrmypdf (-1, 0, 1, 2): https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.Verbosity

Returns:

process_files(df_meta, out_pdf_dir, out_txt_dir, redo=False, keep_pdfa=False, verbose=0)

Traiter un ensemble de fichiers PDF: convertir les PDF en PDF/A et extraire le texte.

Parameters:
  • df_meta (DataFrame) –

    Liste de fichiers PDF à traiter, avec leurs métadonnées.

  • out_pdf_dir (Path) –

    Dossier de sortie pour les PDF/A.

  • out_txt_dir (Path) –

    Dossier de sortie pour les fichiers texte.

  • redo (bool, default: False ) –

    Si True, réanalyse les fichiers déjà traités.

  • keep_pdfa (bool, default: False ) –

    Si True, n'efface pas les fichiers PDF générés par l'OCR.

  • verbose (int, default: 0 ) –

    Niveau de verbosité d'ocrmypdf (-1, 0, 1, 2): https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.Verbosity

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées des fichiers d'entrée et chemins vers les fichiers PDF/A et TXT.

Filtrer les fichiers PDF hors du champ de la base de données

Annexes des arrêtés: plan de périmètre de sécurité, rapports d'expertise etc.

TODO filtrer automatiquement à partir du texte

process_files(df_meta, df_txts)

Traiter un ensemble d'arrêtés: repérer des éléments de structure des textes.

Parameters:
  • df_meta (DataFrame) –

    Liste de métadonnées des fichiers à traiter.

  • df_txts (DataFrame) –

    Liste de pages de documents à traiter.

Returns:
  • df_mmod( DataFrame ) –

    Liste de métadonnées des fichiers, filtrés.

  • df_tmod( DataFrame ) –

    Liste de métadonnées des pages traitées, avec indications des éléments de structure détectés.

Indexer un ensemble de fichiers PDF

Calcule le hachage de chaque fichier et crée une copie du fichier dans un dossier de travail, en faisant précéder le nom du fichier par son hachage.

index_folder(in_dir, out_dir, index_csv, new_csv, recursive=True, digest='blake2b', verbose=False)

Indexer un dossier: hacher et copier les fichiers PDF qu'il contient.

Les copies sont renommées en préfixant le nom de chaque fichier par le hachage, afin d'éviter les conflits de noms de fichiers issus de dossiers différents.

Parameters:
  • in_dir (Path) –

    Dossier à traiter, contenant des PDF.

  • out_dir (Path) –

    Dossier de sortie, contenant les copies des PDF dont le nom est précédé par le hachage.

  • index_csv (Path) –

    Fichier d'index général des PDF.

  • new_csv (Path) –

    Fichier d'index des nouveaux PDF indexés par cette exécution.

  • recursive (bool, default: True ) –

    Si True, parcourt récursivement le dossier in_dir.

  • digest (str, defaults to "blake2b", default: 'blake2b' ) –
  • verbose (bool, default: False ) –

    Si True, des warnings sont émis à chaque anomalie constatée dans les métadonnées du PDF.

Extraire les métadonnées des fichiers PDF

Ce module utilise pikepdf.

get_pdf_info(fp_pdf, digest='blake2b', verbose=False)

Extraire les informations (dont métadonnées) d'un fichier PDF.

Utilise actuellement pikepdf.

Parameters:
  • fp_pdf (Path) –

    Chemin du fichier PDF à traiter.

  • digest (str, default: 'blake2b' ) –
  • verbose (bool, default: False ) –

    Si True, des warnings sont émis à chaque anomalie constatée dans les métadonnées du PDF.

Returns:
  • pdf_info( dict ) –

    Informations (dont métadonnées) du fichier PDF d'entrée

get_pdf_info_pikepdf(fp_pdf_in, verbose=False)

Renvoie les infos du PDF en utilisant pikepdf.

Les infos incluent un sous-ensemble des métadonnées du PDF.

Parameters:
  • fp_pdf_in (Path) –

    Chemin du fichier PDF à traiter.

  • verbose (bool, default: False ) –

    Si True, des warnings sont émis à chaque anomalie constatée dans les métadonnées du PDF.

Returns:
  • infos( dict ) –

    Dictionnaire contenant les infos du PDF.

Traiter les métadonnées des fichiers PDF

Les traitements permettent de: * détecter les fichiers doublons, * déterminer si le PDF est du texte ou image, * déterminer si le PDF contient des tampons de télétransmission en haut des pages, * déterminer si le PDF contient une dernière page qui est l'accusé de réception de la télétransmission.

La liste des tiers de transmission agréés pour @ctes est sur https://www.collectivites-locales.gouv.fr/sites/default/files/migration/2019_09_13_liste_operateurs_transmission_0.pdf .

guess_badocr(df_meta)

Détermine si le fichier contient une couche OCR de piètre qualité.

Arrive quand le champ "creatortool" vaut "Image Capture Plus".

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des fichiers PDF

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées enrichies d'une nouvelle colonne "guess_badocr"

guess_dernpage_transmission(df_meta)

Détermine si la dernière page est un accusé de réception de télétransmission.

Permet de traiter certains arrêtés recueillis après leur télétransmission.

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des fichiers PDF

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées enrichies d'une nouvelle colonne "guess_dernpage"

guess_duplicates_meta(df_meta, hash_fn='blake2b')

Détermine si les fichiers PDF sont des doublons à partir de leurs métadonnées.

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des fichiers PDF

  • hash_fn (str, default: 'blake2b' ) –

    Nom de la fonction de hachage, doit être un nom de colonne du DataFrame de métadonnées.

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées des fichiers PDF, avec des colonnes booléennes "dup_*" indiquant les fichiers doublons.

guess_pdftext(df_meta)

Détermine si le fichier est un PDF texte (ou "numérique natif").

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des fichiers PDF

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées enrichies d'une nouvelle colonne "guess_pdftext"

guess_tampon_transmission(df_meta)

Détermine si le haut des pages contient des tampons de transmission électronique.

Permet de traiter certains arrêtés recueillis après leur télétransmission.

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des fichiers PDF

Returns:
  • df_mmod( DataFrame ) –

    Métadonnées enrichies d'une nouvelle colonne "guess_tampon"

Charge le texte des documents dans un DataFrame

Chaque ligne correspond à une page d'un document.

create_pages_dataframe(df_meta)

Charger le texte des documents dans un DataFrame.

Une entrée par page de document.

Parameters:
  • df_meta (DataFrame) –

    Métadonnées des documents.

Returns:
  • df_txts( DataFrame ) –

    Tableau contenant le texte des documents, séparé par page.