Couches de texte OCR consultables

HotPDF peut rendre les pages chargées sélectionnées pour un moteur OCR fourni par l'application et ajouter atomiquement un texte Unicode invisible consultable aligné sur chaque mot reconnu

La démo console SearchableOCR fournit un flux exécutable : générez un échantillon de trois pages images seules avec --create-sample, choisissez la reconnaissance OCR intégrée, RapidOCR ou Tesseract DLL/CLI, sélectionnez les pages, configurez la confiance et les limites de ressources, puis enregistrez une copie consultable avec des statistiques de conversion

Intégration du moteur

Implémentez IHPDFOCREngine avec tout fournisseur OCR synchrone disponible pour l'application

Le moteur reçoit un TBitmap emprunté, la DPI demandée, la rotation de page normalisée, les coordonnées de zone média, les budgets restants de mots et de UTF-16 et le jeton d'annulation effectif via THPDFOCRRequest

Les boîtes de mots et lignes de base facultatives utilisent des coordonnées de pixels de bitmap en haut à gauche, et le moteur ne doit ni conserver ni libérer le bitmap emprunté après que Recognize retourne

Moteurs locaux optionnels

La version 2.754.0 ajoute des fabriques explicites Tesseract et RapidOCR renvoyant IHPDFOCREngine sous Windows ; la surcharge sans moteur sélectionne toujours le moteur intégré existant

Installez et provisionnez localement le moteur choisi avant de créer son adaptateur, puis transmettez cet adaptateur à la surcharge moteur de ApplyLoadedOCRTextLayer ; les exécutables, paquets Python et modèles d’OCR sont des dépendances externes optionnelles et ne sont pas livrés avec HotPDF

Tesseract

L'adaptateur Tesseract DLL natif optionnel ajoute une segmentation de page et des modes de moteur configurables, une reconnaissance multilingue et des lignes de base de mots natives via HPDFCreateTesseractDLLOCREngine et THPDFTesseractOptions

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

La déclaration se trouve dans HPDFTesseractRecognition ; fournissez un exécutable Tesseract capable de sortie TSV et un dossier de données contenant le modèle de langue demandé, tel que chi_sim.traineddata pour chi_sim

La surcharge à options accepte THPDFTesseractOptions.Default avec segmentation de page explicite, mode de moteur de reconnaissance, délai d'attente et limite de pixels d'entrée ; choisissez tpsSingleLine, tpsSingleWord ou tpsSparseText selon la disposition de l'entrée, comme montré dans Tesseract OCR Adapters

Cet exemple suppose que l’exécutable et les données sont déjà installés aux chemins montrés et que PDF est une instance THotPDF chargée

uses SysUtils, HPDFDoc, HPDFTesseractRecognition;

procedure AddTesseractText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateTesseractOCREngine(
    'C:\OCR\Tesseract\tesseract.exe',
    'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

RapidOCR

L'adaptateur RapidOCR DLL natif reconnaît des instantanés mémoire avec des modèles ONNX CPU persistants en process via HPDFCreateRapidOCRDLLOCREngine, avec classification d'angle optionnelle et annulation coopérative dans les builds Delphi, C++Builder et FPC/Lazarus Windows

L'adaptateur RapidOCR à modèles locaux fournit aussi une surcharge THPDFRapidOCROptions pour des chemins de modèles ONNX explicites, une classification d'angle optionnelle, des dictionnaires et polices locaux, des limites de threads CPU et un budget de pixels d'entrée dans les builds Delphi, C++Builder et FPC/Lazarus

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;

La déclaration se trouve dans HPDFRapidOCRRecognition ; provisionnez Python avec rapidocr et onnxruntime, le pont tools/OCR/rapidocr_tsv.py fourni, et ces trois modèles locaux

Le pont exige aussi %WINDIR%\Fonts\arial.ttf pour le conteneur de résultats de RapidOCR, désactive les téléchargements automatiques et utilise un thread ONNX par pool d’exécution configuré ; des modèles, paquets ou la police locale manquants font échouer la reconnaissance

Le pont actuel utilise la configuration de modèles de chinois simplifié et préserve la ponctuation reconnue sans substitution pleine largeur ou demi-largeur

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\RapidOCR\models', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

Les deux fabriques valident les chemins d’exécutables et de données existants et acceptent un délai d’attente de 1 à 3 600 000 millisecondes, 60 000 par défaut ; une configuration invalide lève EArgumentException

L’adaptateur partagé lance un processus local masqué avec des chemins entre guillemets et des handles hérités restreints, scrute l’annulation, le délai d’attente et les tailles de sortie toutes les 25 millisecondes, et termine le processus en cas d’échec avant de nettoyer les fichiers temporaires

La sortie TSV est limitée à 64 Mio et la sortie du fichier de diagnostic à 1 Mio, les diagnostics renvoyés étant tronqués à 4 096 caractères ; les mots reconnus doivent aussi tenir dans les budgets de mots et d’UTF-16 de la requête et dans des bornes de bitmap valides

La sortie TSV de reconnaissance doit être un UTF-8 valide sans octet NUL ni caractères de contrôle C0/C1 dans les mots reconnus ; une sortie malformée fait échouer toute la demande de reconnaissance même lorsque des mots valides précèdent l’erreur

Ce sont des limites de sortie et de requête, pas un plafond strict de la consommation mémoire du moteur externe ; l’annulation et les échecs de moteur reviennent via le statut de couche de texte sans publier de pages partielles

Preuves et limites de reconnaissance

La baseline locale RapidOCR 3.8.4 a passé les 15 répétitions sur cinq régions de scans de chinois fixes : deux régions claires à 300 DPI et trois régions de pression basse résolution à 150 DPI, évaluées contre les transcriptions de référence actuelles avec un taux d’erreur de caractères d’au plus 5 % et un taux de suppression d’au plus 2 %

Toutes les répétitions ont passé les contrôles d’ordre de lecture, 5 190 contrôles de coordonnées de mots ou de caractères au total, et l’égalité des pixels visibles à 72 DPI ; les deux régions claires avaient zéro erreur de caractère contre ces références

Deux revues visuelles par IA concordent sur le texte et les nombres chinois, mais certains points de code de ponctuation dans le raster restent ambigus et l’arbitrage humain est en attente ; les différences de ponctuation comptent toujours comme des erreurs et ces résultats sont des preuves de corpus, pas une garantie générale de précision

Géométrie et texte de recherche

HotPDF inverse la transformée de page du moteur de rendu afin que les lignes de base des mots restent alignées sur les pages pivotées de 0, 90, 180 ou 270 degrés

Chaque mot accepté est écrit avec le mode de rendu de texte 3 Tr, une échelle de texte horizontale ajustée et une matrice de texte sensible à la rotation, laissant le raster de page inchangé tout en préservant l'ordre du contenu sélectionnable

Une police Type 0 Identity-H partagée attribue des CID bornés locaux au document aux scalaires Unicode et écrit une carte ToUnicode complète, y compris les cibles de paires de substitution UTF-16 pour les caractères supplémentaires

Les mots latins et cyrilliques adjacents sur la même ligne de base reçoivent une espace Unicode explicite lorsque leur géométrie indique un écart entre mots ; les mots CJK adjacents conservent leur texte d'origine sans espaces insérés

Traitement d'un PDF scanné

L'exemple de console Demo/Delphi/SearchableOCR/SearchableOCR.dpr charge un PDF scanné, exécute RapidOCR natif avec un profil de langue local explicite, publie du texte Unicode invisible sur toutes les pages éligibles et enregistre un nouveau PDF sans ouvrir de visionneuse

SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300

Utilisez --language ch pour le chinois simplifié ou --language chinese_cht pour le chinois traditionnel ; la DLL doit correspondre à l'architecture de l'exécutable et le paquet de modèles local sélectionné doit être installé

L'exemple refuse d'écraser un fichier de sortie existant et accepte --replace-ocr lors de la mise à jour d'une couche OCR HotPDF marquée

Le décodage des scans JPEG par le FPC Windows dessine dans le format de pixel bitmap final avant la reconnaissance afin que la conversion de format LCL conserve l'image décodée

Mise à jour d'une couche OCR existante

Définissez THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer à True pour remplacer les flux OCR HotPDF marqués générés précédemment sur les pages reconnues, dans la même transaction que le nouveau texte

Cela contourne SkipPagesWithText uniquement sur les pages marquées et fonctionne après enregistrement et rechargement ; THPDFOCRTextLayerInfo.ReplacedPageCount indique le nombre de pages remplacées

Les échecs de reconnaissance et les pages sans mots acceptés préservent l'ancienne couche de texte ; les flux non marqués, y compris l'OCR tiers et les couches générées par des versions antérieures de HotPDF, sont préservés

Le remplacement déconnecte les anciens flux de contenu OCR mais ne supprime pas les ressources de polices ni les groupes de contenu optionnel qui peuvent encore être référencés ailleurs ; l'enregistrement incrémental peut conserver les objets remplacés des révisions précédentes

Le comportement par défaut reste d'ignorer toute page avec du texte extractible, y compris un numéro de page ou un en-tête au-dessus d'un scan ; la désactivation de SkipPagesWithText reconnaît toute la page et peut dupliquer le texte natif existant, donc les pages mixtes exigent un traitement sélectionné par l'application

Limites, annulation et atomicité

THPDFOCRTextLayerOptions.Default active la reconnaissance à 300 DPI, ignore les pages qui exposent déjà du texte et limite le nombre de pages, les pixels, les mots, les unités UTF-16 et les octets de contenu générés

HotPDF valide chaque résultat de moteur et construit tout le contenu de page avant de démarrer une transaction de graphe copy-on-write, de sorte que les échecs de moteur, la géométrie invalide, les budgets épuisés, l'annulation ou les erreurs de validation laissent le graphe d'objets chargé inchangé

Un tableau d'index de pages vide sélectionne chaque page chargée, tandis que les index de pages en double sont reconnus une fois dans l'ordre de première apparition

MaxTotalWords compte tous les mots reçus, y compris les mots à faible confiance ou invalides abandonnés ensuite, et chaque demande de page ne reçoit que le reliquat de l'allocation

Lorsque le budget de mots ou d'UTF-16 est épuisé alors qu'une autre page éligible subsiste, le traitement renvoie otlsBudgetExceeded avant de rendre ou de reconnaître cette page et ne publie aucun des layers de texte planifiés ; les pages ignorées pour texte existant n'exigent aucun budget de reconnaissance restant

Regroupement de contenu optionnel

Définissez UseOptionalContentGroup pour lier tout le texte généré à une couche nommée via le dictionnaire Resources/Properties de chaque page

Cette option exige PDF 1.5 et suit StrictVersionLock ; la valeur par défaut conserve le texte invisible hors d'un groupe de contenu optionnel pour une compatibilité maximale

Note de conformité

La couche consultable générée utilise intentionnellement une police synthétique non imbriquée car le mode de rendu 3 ne peint jamais de glyphes

Cette API ne produit pas à elle seule une sortie OCR conforme PDF/A, de sorte qu'un flux de travail PDF/A devrait utiliser un chemin de couche de texte à police imbriquée et exécuter la validation de conformité demandée avant la publication

API principales

Rendu progressif et annulation · ExtractLoadedPageText Method