Lorsque vous travaillez avec des documents papier, vous devez repérer et corriger les erreurs ou les modifications apportées intentionnellement. Utilisez l’API Document Comparison pour rechercher ces modifications rapidement et efficacement.Ce scénario permet de comparer des documents particulièrement importants, tels que des contrats et des documents bancaires, avec leurs copies. Le résultat de la comparaison contient des informations sur les différences de type de contenu (texte uniquement), de type de modification (supprimé, inséré ou modifié) et sur leur emplacement dans l’original et dans la copie. Vous pouvez obtenir la liste des différences détectées ou la région de n’importe quelle modification, puis enregistrer le résultat de la comparaison dans un fichier externe pour un traitement ultérieur ou un stockage à long terme.Pour comparer des documents ou des pages, les fichiers obtenus par numérisation ou enregistrés au format électronique passent généralement par plusieurs étapes de traitement, chacune présentant ses propres particularités :
Prétraitement des fichiers numérisés ou des images
Les fichiers et leurs copies nécessitent un certain prétraitement avant la reconnaissance s’ils comportent des défauts ou des annotations ajoutées intentionnellement, telles que des signatures ou des tampons.
Reconnaissance avec restauration complète de la structure et de la mise en forme du document
Lors de la reconnaissance d’un document, divers éléments de mise en page (texte, tableaux, images, Separator, etc.) du document sont identifiés. Au cours de la synthèse du document, la structure logique du document est restaurée, tandis que la synthèse de la page permet de restituer entièrement la mise en forme du document (polices, styles, etc.)
Comparaison des documents ou des pages
Pour comparer des documents ou des pages avec leurs copies, utilisez les fichiers reconnus à l’aide d’ABBYY FineReader Engine. Vous pouvez utiliser les deux versions d’un document dans des formats différents. Après la comparaison, vous obtenez un résultat contenant la liste des modifications ; utilisez-le pour récupérer les informations sur l’emplacement des modifications. Si vous utilisez une vérification manuelle, servez-vous de ces informations pour mettre en évidence les modifications dans le texte, afin de faciliter le travail de l’opérateur.
Exportation vers un format externe
Vous pouvez également enregistrer le résultat de la comparaison aux formats XML et DOCX.La procédure décrite ci-dessous est également illustrée par l’exemple Document Comparison pour Linux et macOS, ainsi que par l’outil de démonstration Windows Document Comparison.
Les exemples de code fournis dans cette rubrique sont spécifiques à Windows.
Vous trouverez ci-dessous une description détaillée de la méthode recommandée pour utiliser ABBYY FineReader Engine dans ce scénario.
Étape 1. Chargement d’ABBYY FineReader Engine
Pour commencer à travailler avec ABBYY FineReader Engine, vous devez créer l’objet Engine. L’objet Engine est l’objet racine de la hiérarchie des objets d’ABBYY FineReader Engine et fournit différents paramètres globaux, certaines méthodes de traitement, ainsi que des méthodes permettant de créer les autres objets.Pour créer l’objet Engine, vous pouvez utiliser la fonction InitializeEngine. Voir aussi d’autres façons de charger l’objet Engine (Win).
public class EngineLoader : IDisposable{ public EngineLoader() { // Initialisez ces variables avec le chemin complet vers FREngine.dll, votre Customer Project ID, // et, le cas échéant, le chemin vers votre fichier de jeton de licence en ligne et le mot de passe de la licence en ligne string enginePath = ""; string customerProjectId = ""; string licensePath = ""; string licensePassword = ""; // Charger la bibliothèque FREngine.dll dllHandle = LoadLibraryEx(enginePath, IntPtr.Zero, LOAD_WITH_ALTERED_SEARCH_PATH); try { if (dllHandle == IntPtr.Zero) { throw new Exception("Can't load " + enginePath); } IntPtr initializeEnginePtr = GetProcAddress(dllHandle, "InitializeEngine"); if (initializeEnginePtr == IntPtr.Zero) { throw new Exception("Can't find InitializeEngine function"); } IntPtr deinitializeEnginePtr = GetProcAddress(dllHandle, "DeinitializeEngine"); if (deinitializeEnginePtr == IntPtr.Zero) { throw new Exception("Can't find DeinitializeEngine function"); } IntPtr dllCanUnloadNowPtr = GetProcAddress(dllHandle, "DllCanUnloadNow"); if (dllCanUnloadNowPtr == IntPtr.Zero) { throw new Exception("Can't find DllCanUnloadNow function"); } // Convertir les pointeurs en délégués initializeEngine = (InitializeEngine)Marshal.GetDelegateForFunctionPointer( initializeEnginePtr, typeof(InitializeEngine)); deinitializeEngine = (DeinitializeEngine)Marshal.GetDelegateForFunctionPointer( deinitializeEnginePtr, typeof(DeinitializeEngine)); dllCanUnloadNow = (DllCanUnloadNow)Marshal.GetDelegateForFunctionPointer( dllCanUnloadNowPtr, typeof(DllCanUnloadNow)); // Appeler la fonction InitializeEngine // en passant le chemin vers le fichier de licence en ligne et le mot de passe de la licence en ligne int hresult = initializeEngine(customerProjectId, licensePath, licensePassword, "", "", false, ref engine); Marshal.ThrowExceptionForHR(hresult); } catch (Exception) { // Libérer la bibliothèque FREngine.dll engine = null; // Suppression de tous les objets avant l’appel à FreeLibrary GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); FreeLibrary(dllHandle); dllHandle = IntPtr.Zero; initializeEngine = null; deinitializeEngine = null; dllCanUnloadNow = null; throw; } } // Fonctions de Kernel32.dll [DllImport("kernel32.dll")] private static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr reserved, uint flags); private const uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008; [DllImport("kernel32.dll")] private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); [DllImport("kernel32.dll")] private static extern bool FreeLibrary(IntPtr hModule); // Fonctions de FREngine.dll [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] private delegate int InitializeEngine(string customerProjectId, string licensePath, string licensePassword, string tempFolder, string dataFolder, bool isSharedCPUCoresMode, ref FREngine.IEngine engine); [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate int DeinitializeEngine(); [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate int DllCanUnloadNow(); // Variables privées private FREngine.IEngine engine = null; // Handle de FREngine.dll private IntPtr dllHandle = IntPtr.Zero; private InitializeEngine initializeEngine = null; private DeinitializeEngine deinitializeEngine = null; private DllCanUnloadNow dllCanUnloadNow = null;}
Étape 2. Chargement et prétraitement des fichiers et images
ABBYY FineReader Engine fournit l’objet FRDocument, qui permet de traiter des documents multipages. L’utilisation de cet objet vous permet de préserver l’organisation logique du document en conservant le texte et les colonnes d’origine, les polices, les styles, etc. Utilisez l’objet FRPage si vous souhaitez comparer des pages.Pour charger les images d’un même document et les prétraiter, vous devez créer l’objet FRDocument et y ajouter les images. Vous pouvez procéder de l’une des façons suivantes :
Créez l’objet FRDocument à l’aide de la méthode CreateFRDocumentFromImage de l’objet Engine. Cette méthode crée l’objet FRDocument et charge les images à partir du fichier spécifié.
// Créez l’objet FRDocument à partir d’un fichier imageFREngine.IFRDocument frDocument = engine.CreateFRDocumentFromImage( "C:\\MyImage.tif", null );
Étape 3. Reconnaissance du document
Pour reconnaître un document, nous vous recommandons d’utiliser les méthodes d’analyse et de reconnaissance de l’objet FRDocument. Cet objet fournit toute une série de méthodes pour l’analyse, la reconnaissance et la synthèse de documents. La méthode la plus pratique, qui combine l’analyse, la reconnaissance et la synthèse du document en une seule opération, est la méthode Process. Elle exploite également de la manière la plus efficace les fonctionnalités de traitement simultané des systèmes multiprocesseurs et multicœurs. Toutefois, vous pouvez aussi exécuter successivement le prétraitement, l’analyse, la reconnaissance et la synthèse à l’aide des méthodes Preprocess, Analyze, Recognize et Synthesize. Vous pouvez définir les paramètres de reconnaissance de vos documents en chargeant un profil prédéfini approprié (consultez Working with Profiles pour plus d’informations).
// Traitez le document avec les paramètres par défaut// Vous pouvez les modifier si nécessaire, par exemple en chargeant un profil au préalablefrDocument.Process( null );
Étape 4. Comparaison des documents ou des pages
Pour comparer les documents ou les pages à leurs copies :
Assurez-vous que votre licence ABBYY FineReader Engine prend en charge le module Compare Documents.
[facultatif] Utilisez l’objet ComparisonParams pour définir les propriétés selon les valeurs souhaitées.
Appelez la méthode CompareDocuments de l’objet Comparator pour comparer le document original à sa copie. Vous recevrez un objet ComparisonResult contenant des informations sur les modifications détectées.
// Effectuer la comparaison des documents FREngine.IComparator comparator = engine.CreateComparator();FREngine.IComparisonResult comparatorResult = comparator.CompareDocuments( referenceFRDocument, userFRDocument, null, null );
Étape 5. Exploitation des modifications détectées
L’objet ComparisonResult contient la liste complète des différences et fournit des méthodes permettant d’obtenir les différences pour des pages individuelles. Vous pouvez accéder aux modifications du document original et de sa copie à l’aide des méthodes GetChangesForReferencePage et GetChangesForUserPage. Utilisez l’objet ChangeLocation pour obtenir des informations sur l’emplacement de la modification, ainsi que sa propriété RegionForPage pour obtenir la région de la modification sur la page spécifiée.
// Obtenir les informations sur la modification détectée et son emplacement dans le document originalFREngine.IChanges changes = comparatorResult.Changes;foreach( FREngine.IChange change in changes ) { FREngine.ModificationTypeEnum modificationType = change.ModificationType; FREngine.IChangeLocation referenceLocation = change.ReferenceLocation; // Vous pouvez maintenant mettre ces modifications en surbrillance sur la page pour qu’un opérateur les vérifie ... }
Étape 6. Exportation du résultat de la comparaison
Pour exporter le résultat de la comparaison, appelez la méthode Export de l’objet ComparisonResult et transmettez le chemin d’accès du fichier comme paramètre d’entrée. Les données peuvent être enregistrées dans un fichier XML ou DOCX avec suivi des modifications.C#
// Enregistrer au format XMLcomparisonResult.Export( "C:\\ComparisonResult.xml", FREngine.ComparatorExportFormatEnum.CEF_Xml, null );
Étape 7. Déchargement d’ABBYY FineReader Engine
Une fois que vous avez fini d’utiliser ABBYY FineReader Engine, vous devez décharger l’objet Engine. Pour cela, utilisez la fonction exportée DeinitializeEngine.
Vous pouvez utiliser le fichier FREngineDistribution.csv pour générer automatiquement une liste des fichiers nécessaires au fonctionnement de votre application. Pour le traitement dans ce scénario, sélectionnez dans la colonne 5 (RequiredByModule) les valeurs suivantes :CoreCore.ResourcesOpeningOpening, ProcessingProcessingProcessing.OCRProcessing.OCR, Processing.ICRProcessing.OCR.NaturalLanguagesProcessing.OCR.NaturalLanguages, Processing.ICR.NaturalLanguagesExportExport, ProcessingSi vous modifiez le scénario standard, adaptez les modules requis en conséquence. Vous devez également spécifier les langues de l’interface, les langues de reconnaissance et toutes les fonctionnalités supplémentaires utilisées par votre application (par exemple, Opening.PDF si vous devez ouvrir des fichiers PDF, ou Processing.OCR.CJK si vous devez reconnaître des textes en langues CJK). Consultez Utilisation du fichier FREngineDistribution.csv pour plus de détails.
Optimisations supplémentaires pour des tâches spécifiques
Vous trouverez ci-dessous un aperçu des rubriques d’aide contenant des informations complémentaires sur la personnalisation des paramètres aux différentes étapes du traitement :
Numérisation - Windows uniquement
Numérisation Description du scénario ABBYY FineReader Engine pour la numérisation de documents.
Objet PageProcessingParams Cet objet permet de personnaliser les paramètres d’analyse et de reconnaissance. À l’aide de cet objet, vous pouvez indiquer quelles caractéristiques de l’image et du texte doivent être détectées (image inversée, orientation, codes-barres, langue de reconnaissance, marge d’erreur de reconnaissance).
Objet SynthesisParamsForPage Cet objet inclut les paramètres permettant de restaurer la mise en forme d’une page lors de la synthèse.
Objet SynthesisParamsForDocument Cet objet permet de personnaliser la synthèse du document : restauration de sa structure et de sa mise en forme.
Objet MultiProcessingParams - Disponible sous Linux et Windows Le traitement simultané peut être utile lors du traitement d’un grand nombre d’images. Dans ce cas, la charge de traitement est répartie entre les cœurs du processeur pendant l’ouverture et le prétraitement des images, l’analyse de la mise en page, la reconnaissance et l’exportation, ce qui permet d’accélérer le traitement. Les modes de traitement (simultané ou séquentiel) sont définis à l’aide de la propriété MultiProcessingMode. La propriété RecognitionProcessesCount contrôle le nombre de processus pouvant être démarrés.