> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Document Conversion

> Convert document images to editable formats (RTF, DOCX, ODT) with ABBYY FineReader Engine while preserving original layout, fonts, tables, and document structure.

The result of this scenario is an editable version of a document.

In this scenario, document images are recognized, retaining all the original formatting intact, and the data are saved to an editable file format. As a result, you get editable versions of your documents, which can be easily checked for errors and modified. You will also be able to copy all or some of the text for reuse.

A document goes through several processing steps, which are in some ways slightly different from the other common scenarios:

1. Preprocessing of scanned images or photos

   Images you get by means of a scanner or a digital camera may need some tweaking before they can be optically recognized. For example, noisy images or images with distorted text lines will need some correction for optical recognition to be successful.

2. Recognition with full restoration of document structure and formatting

   When recognizing a document, various layout elements (text, tables, images, separators, etc.) of the document are identified. In the course of the document synthesis, the logical structure of the document is restored, while the page synthesis enables one to fully restore the document formatting (fonts, styles, etc.).

3. Export to an editable format

   The recognized document is saved to an editable format, such as RTF, DOCX.

## Scenario implementation

<Note>
  The code samples provided in this topic are Windows -specific.
</Note>

Below you will find a detailed description of the recommended method of using ABBYY FineReader Engine 12 to convert the documents. The proposed method uses the processing settings that are most suitable for this purpose.

<Accordion title="Step 1. Loading ABBYY FineReader Engine">
  To start your work with ABBYY FineReader Engine, you need to create the [Engine](/fine-reader/engine/api-reference/engine-object-iengine-interface) object. The Engine object is the top object in the hierarchy of the ABBYY FineReader Engine objects and provides various global settings, some processing methods, and methods for creating the other objects.

  To create the Engine object, you can use the [InitializeEngine](/fine-reader/engine/api-reference/functions/initializeengine-function) function. See also [other ways to load Engine object](/fine-reader/engine/guided-tour/advanced-techniques/programming-aspects/different-ways-to-load-engine) (Win).

  ### C\#

  ```csharp theme={null}
  public class EngineLoader : IDisposable
  {
      public EngineLoader()
      {
          // Initialize these variables with the full path to FREngine.dll, your Customer Project ID,
          // and, if applicable, the path to your Online License token file and the Online License password
          string enginePath = "";
          string customerProjectId = "";
          string licensePath = "";
          string licensePassword = "";
          // Load the FREngine.dll library
          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");
              }
              // Convert pointers to delegates
              initializeEngine = (InitializeEngine)Marshal.GetDelegateForFunctionPointer(
                  initializeEnginePtr, typeof(InitializeEngine));
              deinitializeEngine = (DeinitializeEngine)Marshal.GetDelegateForFunctionPointer(
                  deinitializeEnginePtr, typeof(DeinitializeEngine));
              dllCanUnloadNow = (DllCanUnloadNow)Marshal.GetDelegateForFunctionPointer(
                  dllCanUnloadNowPtr, typeof(DllCanUnloadNow));
              // Call the InitializeEngine function 
              // passing the path to the Online License file and the Online License password
              int hresult = initializeEngine(customerProjectId, licensePath, licensePassword, 
                  "", "", false, ref engine);
              Marshal.ThrowExceptionForHR(hresult);
          }
          catch (Exception)
          {
              // Free the FREngine.dll library
              engine = null;
              // Deleting all objects before FreeLibrary call
              GC.Collect();
              GC.WaitForPendingFinalizers();
              GC.Collect();
              FreeLibrary(dllHandle);
              dllHandle = IntPtr.Zero;
              initializeEngine = null;
              deinitializeEngine = null;
              dllCanUnloadNow = null;
              throw;
          }
      }
      // Kernel32.dll functions
      [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);
      // FREngine.dll functions
      [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();
      // private variables
      private FREngine.IEngine engine = null;
      // Handle to FREngine.dll
      private IntPtr dllHandle = IntPtr.Zero;
      private InitializeEngine initializeEngine = null;
      private DeinitializeEngine deinitializeEngine = null;
      private DllCanUnloadNow dllCanUnloadNow = null;
  }
  ```

  ### C++ (COM)

  ```cpp theme={null}
  // Initialize these variables with the path to FREngine.dll, your FineReader Engine customer project ID,
  // and, if applicable, the path to the Online License token and Online License password
  wchar_t* FreDllPath;
  wchar_t* CustomerProjectId;
  wchar_t* LicensePath;  // if you don't use an Online License, assign empty strings to these variables
  wchar_t* LicensePassword;
  // HANDLE to FREngine.dll
  static HMODULE libraryHandle = 0;
  // Global FineReader Engine object
  FREngine::IEnginePtr Engine;
  void LoadFREngine()
  {
      if( Engine != 0 ) {
      // Already loaded
      return;
      }
      // First step: load FREngine.dll
      if( libraryHandle == 0 ) {
          libraryHandle = LoadLibraryEx( FreDllPath, 0, LOAD_WITH_ALTERED_SEARCH_PATH );
          if( libraryHandle == 0 ) {
              throw L"Error while loading ABBYY FineReader Engine";
          }
      }
      // Second step: obtain the Engine object
      typedef HRESULT ( STDAPICALLTYPE* InitializeEngineFunc )( BSTR, BSTR, BSTR, BSTR, 
          BSTR, VARIANT_BOOL, FREngine::IEngine** );
      InitializeEngineFunc pInitializeEngine =
      ( InitializeEngineFunc )GetProcAddress( libraryHandle, "InitializeEngine" );
      if( pInitializeEngine == 0 || pInitializeEngine( CustomerProjectId, LicensePath, 
          LicensePassword, L"", L"", VARIANT_FALSE, &Engine ) != S_OK ) {
      UnloadFREngine();
      throw L"Error while loading ABBYY FineReader Engine";
      }
  }
  ```
</Accordion>

<Accordion title="Step 2. Loading settings for the scenario">
  ABBYY FineReader Engine enables loading of all processing settings that are most suitable for this scenario using the [LoadPredefinedProfile](/fine-reader/engine/api-reference/engine-object-iengine-interface/supplementary-methods/loadpredefinedprofile-method) method of the [Engine](/fine-reader/engine/api-reference/engine-object-iengine-interface) object. This method receives the profile name as an input parameter. Please see [Working with Profiles](/fine-reader/engine/guided-tour/advanced-techniques/working-with-profiles) for more information.

  ABBYY FineReader Engine supports 2 variants of settings for this scenario:

  <table><thead><tr><th><p><strong>Profile name</strong></p></th><th><p><strong>Description</strong></p></th></tr></thead><tbody><tr><td><p><em>DocumentConversion\_Accuracy</em></p></td><td><p>The settings have been optimized for accuracy:</p><ul><li>Best quality. Enables font style detection and full synthesis of the logical structure of a document.</li></ul></td></tr><tr><td><p><em>DocumentConversion\_Normal</em></p></td><td><p>The settings have been optimized for processing speed:</p><ul><li>Best quality. Enables font style detection and full synthesis of the logical structure of a document.</li><li>Image orientation is not corrected.</li><li>The process of document analysis is speeded up.</li></ul></td></tr></tbody></table>

  ### C\#

  ```csharp theme={null}
  // Load a predefined profile
  engine.LoadPredefinedProfile("DocumentConversion_Normal");
  ```

  ### C++ (COM)

  ```cpp theme={null}
  // Load a predefined profile
  Engine->LoadPredefinedProfile( L"DocumentConversion_Normal" );
  ```

  If you wish to change processing settings, use appropriate parameter objects. Please see [Additional optimization for specific tasks](/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/document-conversion#optimization) below for further information.
</Accordion>

<Accordion title="Step 3. Loading and preprocessing the images">
  ABBYY FineReader Engine provides the [FRDocument](/fine-reader/engine/api-reference/document-related-objects/frdocument) object which allows processing multi-page documents. Using of this object allows you to preserve the logical organization of the document, retaining the original text and columns, fonts, styles, etc.

  To load images of a single document and preprocess them, you should create the FRDocument object and add images to it. You may do one of the following:

  * Create the FRDocument object using the [CreateFRDocumentFromImage](/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createfrdocumentfromimage-method) method of the Engine object. This method creates the FRDocument object and loads images from the specified file.
  * Create the FRDocument object with the help of the [CreateFRDocument](/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) method of the Engine object, then add images to the created FRDocument object from file (use the [AddImageFile](/fine-reader/engine/api-reference/document-related-objects/frdocument/addimagefile-method), [AddImageFileWithPassword](/fine-reader/engine/api-reference/document-related-objects/frdocument/addimagefilewithpassword-method), or [AddImageFileWithPasswordCallback](/fine-reader/engine/api-reference/document-related-objects/frdocument/addimagefilewithpasswordcallback-method) method of the FRDocument object).

  ### C\#

  ```csharp theme={null}
  // Create the FRDocument object from an image file
  FREngine.IFRDocument frDocument = engine.CreateFRDocumentFromImage( "C:\\MyImage.tif", null );
  ```

  ### C++ (COM)

  ```cpp theme={null}
  // Create the FRDocument object from an image file
  FREngine::IFRDocumentPtr frDocument = Engine->CreateFRDocumentFromImage( L"C:\\MyImage.tif", 0 );
  ```

  <Note>
    Image preprocessing with the loaded DocumentConversion\_Normal profile does not include orientation detection. If you want the image orientation to be automatically detected, you will need to set up additional parameters and pass the corresponding object to the preprocessing function. Please refer to [Additional optimization for specific tasks](/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/document-conversion#optimization) below for further information.
  </Note>
</Accordion>

<Accordion title="Step 4. Document recognition">
  To recognize a document, we suggest that you use the analysis and recognition methods of the FRDocument object. This object provides a whole array of methods for document analysis, recognition, and synthesis. The most convenient method which provides document analysis, recognition, and synthesis all-in-one is the [Process](/fine-reader/engine/api-reference/document-related-objects/frdocument/process-method) method. It also uses simultaneous processing features of multiprocessor and multicore systems in the most efficient manner. However, you can also perform consecutive preprocessing, analysis, recognition, and synthesis using [Preprocess](/fine-reader/engine/api-reference/document-related-objects/frdocument/preprocess-method), [Analyze](/fine-reader/engine/api-reference/document-related-objects/frdocument/analyze-method), [Recognize](/fine-reader/engine/api-reference/document-related-objects/frdocument/recognize-method), and [Synthesize](/fine-reader/engine/api-reference/document-related-objects/frdocument/synthesize-method) methods.

  ### C\#

  ```csharp theme={null}
  // Analyze, recognize, and synthesize the document
  // There is no need for additional parameters because they are set up by processing profile
  frDocument.Process( null );
  ```

  ### C++ (COM)

  ```cpp theme={null}
  // Analyze, recognize, and synthesize the document
  // There is no need for additional parameters because they are set up by the processing profile
  frDocument->Process( 0 );
  ```
</Accordion>

<Accordion title="Step 5. Document export">
  To save a recognized document, you can use the [Export](/fine-reader/engine/api-reference/document-related-objects/frdocument/export-method) method of the [FRDocument](/fine-reader/engine/api-reference/document-related-objects/frdocument) object by assigning the [FileExportFormatEnum](/fine-reader/engine/api-reference/enumerations/fileexportformatenum) constant as one of the parameters. You can change the default parameters of export using the corresponding export object. Please see [Additional optimization for specific tasks](/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/document-conversion#optimization) below for further information.

  After you have finished your work with the FRDocument object, release all the resources that were used by this object. Use the [IFRDocument::Close](/fine-reader/engine/api-reference/document-related-objects/frdocument/close-method) method.

  ### C\#

  ```csharp theme={null}
  // Save the recognized document in editable format (for example, RTF)
  frDocument.Export( "C:\\MyText.rtf", FREngine.FileExportFormatEnum.FEF_RTF, null );
  // Release the FRDocument object
  frDocument.Close();
  ```

  ### C++ (COM)

  ```cpp theme={null}
  // Save the recognized document in editable format (for example, RTF)
  frDocument->Export( L"C:\\MyText.rtf", FREngine::FEF_RTF, 0 );
  // Release the FRDocument object
  frDocument->Close();
  ```
</Accordion>

<Accordion title="Step 6. Unloading ABBYY FineReader Engine">
  After finishing your work with ABBYY FineReader Engine, you need to unload the [Engine](/fine-reader/engine/api-reference/engine-object-iengine-interface) object. To do this, use the [DeinitializeEngine](/fine-reader/engine/api-reference/functions/deinitializeengine-function) exported function.

  ### C\#

  ```csharp theme={null}
  public class EngineLoader : IDisposable
  {
      // Unload FineReader Engine
      public void Dispose()
      {
          if (engine == null)
          {
              // Engine was not loaded
              return;
          }
          engine = null;
          // Deleting all objects before FreeLibrary call
          GC.Collect();
          GC.WaitForPendingFinalizers();
          GC.Collect();
          int hresult = deinitializeEngine();
   
          hresult = dllCanUnloadNow();
          if (hresult == 0)
          {
              FreeLibrary(dllHandle);
          }
          dllHandle = IntPtr.Zero;
          initializeEngine = null;
          deinitializeEngine = null;
          dllCanUnloadNow = null;
          // throwing exception after cleaning up
          Marshal.ThrowExceptionForHR(hresult);
      }
      // Kernel32.dll functions
      [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);
      // FREngine.dll functions
      [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
      private delegate int InitializeEngine( string customerProjectId, string LicensePath, string LicensePassword, , , , ref FREngine.IEngine engine);
      [UnmanagedFunctionPointer(CallingConvention.StdCall)]
      private delegate int DeinitializeEngine();
      [UnmanagedFunctionPointer(CallingConvention.StdCall)]
      private delegate int DllCanUnloadNow();
      // private variables
      private FREngine.IEngine engine = null;
      // Handle to FREngine.dll
      private IntPtr dllHandle = IntPtr.Zero;
      private InitializeEngine initializeEngine = null;
      private DeinitializeEngine deinitializeEngine = null;
      private DllCanUnloadNow dllCanUnloadNow = null;
  }
  ```

  ### C++ (COM)

  ```cpp theme={null}
  void UnloadFREngine()
  {
   if( libraryHandle == 0 ) {
    return;
   }
   // Release Engine object
   Engine = 0;
   // Deinitialize FineReader Engine
   typedef HRESULT ( STDAPICALLTYPE* DeinitializeEngineFunc )();
   DeinitializeEngineFunc pDeinitializeEngine =
    ( DeinitializeEngineFunc )GetProcAddress( libraryHandle, "DeinitializeEngine" );
   if( pDeinitializeEngine == 0 || pDeinitializeEngine() != S_OK ) {
    throw L"Error while unloading ABBYY FineReader Engine";
   }
   // Now it's safe to free the FREngine.dll library
   FreeLibrary( libraryHandle );
   libraryHandle = 0;
  }
  ```
</Accordion>

## Required resources

You can use the [FREngineDistribution.csv](/fine-reader/engine/distribution/distribution-windows/distribution-kit/working-with-the-frenginedistributioncsv-file) file to automatically create a list of files required for your application to function. For processing with this scenario, select in the column 5 (RequiredByModule) the following values:

Core

Core.Resources

Opening

Opening, Processing

Processing

Processing.OCR

Processing.OCR, Processing.ICR

Processing.OCR.NaturalLanguages

Processing.OCR.NaturalLanguages, Processing.ICR.NaturalLanguages

Export

Export, Processing

If you modify the standard scenario, change the required modules accordingly. You also need to specify the interface languages, recognition languages and any additional features which your application uses (such as, e.g., Opening.PDF if you need to open PDF files, or Processing.OCR.CJK if you need to recognize texts in [CJK languages](/fine-reader/engine/guided-tour/advanced-techniques/recognizing-cjk-languages#cjk)). See [Working with the FREngineDistribution.csv File](/fine-reader/engine/distribution/distribution-windows/distribution-kit/working-with-the-frenginedistributioncsv-file) for further details.

## Additional optimization for specific tasks

Below is the overview of the Help topics containing additional information regarding customization of settings at different stages of the document conversion to an editable format:

* Scanning - Windows Only
  * [Scanning](/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation/scanning)<br />Description of the ABBYY FineReader Engine scenario for document scanning.
* Recognition
  * [Tuning Parameters of Preprocessing, Analysis, Recognition, and Synthesis](/fine-reader/engine/guided-tour/advanced-techniques/tuning-parameters-of-preprocessing-analysis-recognition-and-synthesis)<br />Customization of document processing using objects of analysis, recognition and synthesis parameters.
  * [Recognize handwriting](/fine-reader/engine/guided-tour/advanced-techniques/recognizing-handwritten-texts)<br />The DocumentConversion\_\*\*\* profiles do not include handwritten or handprinted text recognition. If you need to recognize handwriting, set the [DetectHandwritten](/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams#detecthandwritten) property of the [PageAnalysisParams](/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams) object to TRUE.
  * [PageProcessingParams Object](/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageprocessingparams)<br />This object enables the customization of analysis and recognition parameters. Using this object, you can indicate which image and text characteristics must be detected (inverted image, orientation, barcodes, recognition language, recognition error margin).
  * [SynthesisParamsForPage Object](/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/synthesisparamsforpage)<br />This object includes parameters responsible for restoration of a page formatting during synthesis.
  * [SynthesisParamsForDocument Object](/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/synthesisparamsfordocument)<br />This object enables customization of the document synthesis: restoration of its structure and formatting.
  * [MultiProcessingParams Object](/fine-reader/engine/api-reference/parameter-objects/multiprocessingparams) - *Implemented for Linux and Windows* <br />Simultaneous processing may be useful when processing a large number of images. In this case, the processing load will be spread over the processor cores during image opening and preprocessing, layout analysis, recognition, and export, which makes it possible to speed up processing.<br />Reading modes (simultaneous or consecutive) are set using the MultiProcessingMode property. The RecognitionProcessesCount property controls the number of processes that may be started.
* Export
  * [Tuning Export Parameters](/fine-reader/engine/guided-tour/advanced-techniques/tuning-export-parameters)<br />Customization of the document export using objects of export parameters.
  * [RTFExportParams Object](/fine-reader/engine/api-reference/parameter-objects/export-parameters/rtfexportparams)<br />This object enables customization of the RTF/DOCX/ODT saving format parameters.
  * [HTMLExportParams Object](/fine-reader/engine/api-reference/parameter-objects/export-parameters/htmlexportparams)<br />This object allows customization of export to the HTML format.
  * [PPTExportParams Object](/fine-reader/engine/api-reference/parameter-objects/export-parameters/pptexportparams)<br />Object for customization of the PPTX saving format parameters.

## See also

[Basic Usage Scenarios Implementation](/fine-reader/engine/guided-tour/basic-usage-scenarios-implementation)
