LEADTOOLS OCR(Leadtools.Forms.Ocrアセンブリ)

フレームを表示

RunJobメソッド








このパラメーターを実行するIOcrAutoRecognizeJobは、nullVisual BasicではNothing)であるはずがありません。ジョブを作成するために、CreateJobを使います。
ジョブを実行します
構文
'Declaration
 
Function RunJob( _
   ByVal job As IOcrAutoRecognizeJob _
) As OcrAutoRecognizeManagerJobStatus
'Usage
 
Dim instance As IOcrAutoRecognizeManager
Dim job As IOcrAutoRecognizeJob
Dim value As OcrAutoRecognizeManagerJobStatus
 
value = instance.RunJob(job)
- (LTOcrAutoRecognizeManagerJobStatus)runJob:(LTOcrAutoRecognizeJob *)job error:(NSError **)error
public OcrAutoRecognizeManagerJobStatus runJob(OcrAutoRecognizeJob job)
function Leadtools.Forms.Ocr.IOcrAutoRecognizeManager.RunJob( 
   job 
)

パラメーター

ジョブ
このパラメーターを実行するIOcrAutoRecognizeJobは、nullVisual BasicではNothing)であるはずがありません。ジョブを作成するために、CreateJobを使います。

戻り値

ジョブが正常に完了されたか、エラーかユーザーアクションのために中止されたかどうかについて決定するOcrAutoRecognizeManagerJobStatus列挙体メンバ。
解説

IOcrAutoRecognizeManagerを作成した同じスレッドからこのメソッドを呼び出すならば、このメソッドが返るまで、現在のスレッドはブロックします。非同期でジョブを実行するために、RunJobAsyncを使います。

このメソッドが返るとき、ジョブIOcrAutoRecognizeJob.Errorsメンバは認識プロセスの間に発生したかもしれない任意のエラーを格納します。

このメソッドを使うために、ジョブのパラメータ(入力イメージファイル名、ページ、出力文書形式、出力文書名、オプションのゾーンファイル名など)で新しいOcrAutoRecognizeJobDataオブジェクトを初期化します、そして、IOcrAutoRecognizeJobオブジェクトを作成する使用CreateJobはこのメソッドへのジョブとして渡しました。最後に、IOcrAutoRecognizeJobオブジェクトを渡すRunJobを呼び出します。

このメソッドは、以下の操作を実行します:

  1. JobStartedイベントは呼び出されます。

  2. ページを保存する一つ以上のIOcrDocumentオブジェクトを作成します。作成されるOCRドキュメントの数は、MaximumThreadsPerJobに依存しています。この値が0(最大のCPU/コア)であるか、1より大きい、そして、複数のスレッドがこのエンジンでサポートされるならば、1つ以上のドキュメントは認識プロセスに参加するために作成されるかもしれません。ドキュメントは、ディスクベースであるように、作成されます。

  3. OcrAutoRecognizeJobData.LastPageNumber内のOcrAutoRecognizeJobData.FirstPageNumberで指定されたページ番号からOcrAutoRecognizeJobData.ImageFileNameで指定されたページ番号までのページをループ処理し、各ページに対して以下の操作を行います。

    ページは、IOcrEngine.CreatePageを用いて作成されます。

    OcrAutoRecognizeJobData.ZonesFileNameに有効なマルチページゾーンファイル名が設定されていて、そのマルチページゾーンファイルに現在のページに対応するページがある場合は、IOcrPage.LoadZones(fileName、pageNumber)を使用してゾーンがロードされ、ページに適用されます。OcrAutoRecognizeJobData.ZonesFileNamenullVisual BasicではNothing)参照である、または、それが対応するページ番号を格納しないならば、ページの自動分解することはIOcrPage.AutoZoneで代わりに実行されます。IOcrPage.SaveZonesからIOcrPage.SaveZonesがページ番号に取っておくIOcrDocument.SaveZonesまたはIOcrDocument.SaveAsyncを用いてドキュメントゾーンを保存することによって、すべてのドキュメントページのためにエントリがある有効な複数ページのゾーンファイルは、生成されます。

    IOcrPage.Recognizeは、ページのOCRデータを取得するために呼び出されます。

    OCR Advantageエンジンについては、ページはIOcrDocument.Pages.Addを用いてドキュメントに追加されます。

    OCR Advantage以外のエンジンの場合:複数の文書が使用されている場合、または現在認識されているページのページ番号がMaximumPagesBeforeLtdで指定された最大値よりも大きい場合は、現在の認識データが一時LTDファイルに保存され、OCR文書がクリアされます。

  4. すべてのページが処理されたら、OcrAutoRecognizeJobData.DocumentFileNameで指定された形式を使用して、OcrAutoRecognizeJobData.Formatで指定された結果ファイル名に処理結果が保存されます。LTDが使用された場合は、DocumentWriter.Convertと、必要に応じてDocumentWriter.AppendLtd。を使用して、一時ファイルが最終文書に変換されます。

  5. すべてのOCRドキュメントと一時ファイルは、アンインストール済みです。

  6. JobCompletedイベントは呼び出されます。

  7. 操作の進捗を示す、またはスレッディングが使用されていないときに中止するには、JobProgressイベントを使用できます。詳細情報とサンプルについては、「OcrProgressCallback」を参照してください。

  8. 実行されている現在の操作に関する情報を取得するために、JobOperationイベントを使うことができます。詳細情報とサンプルについては、「JobOperation」を参照してください。

IOcrAutoRecognizeManagerインターフェースは、このメソッドの利用に、以下のオプションも持っています:

オプション 説明
MaximumPagesBeforeLtd

無制限の頁数でドキュメントを変換することのサポートを追加します。大量のページ(10その他)を格納するドキュメントの上のOCR認識操作は、メモリー不足のエラーに終わるかもしれません。

LEADTOOLS OCRエンジンの全ては、当面のLTDファイル(DocumentFormat.LTD)に中間認識結果を保存することをサポートします。以降のページの結果は、この一時ファイルに追加されます。文書のすべてのページの認識が済んだら、この一時ファイルが目的の形式に変換されます。

MaximumPagesBeforeLtdプロパティは、全体として処理される最大頁数を定義します。たとえばオリジナルの文書が20ページであり、このプロパティの値が8であるとき、エンジンではまず最初の8ページを認識して結果を一時ファイルに保存します。次に、次の8ページを認識して結果に追加し、最終的に残りの4ページを認識した後、一時文書を最終文書に変換します。

PreprocessPageCommands

認識の前に各々のページドキュメントの上で実行する操作を自動前処理することを制御するために、OcrAutoPreprocessPageCommand項目の配列を保持します。

MaximumThreadsPerJob

1つのジョブあたりに使用する最大スレッド数。ドキュメントを認めるとき、すべての利用できるマシンCPU/コアを使うために、IOcrAutoRecognizeManagerを指示することができます。そうすると、OCR操作に必要な時間が大幅に短縮されます。

JobErrorMode

致命的なエラーなしで再開する機能。たとえば、ソースドキュメントがページを持っているならば、それは認められることができません。そのページはグラフィック画像として最終文書に追加され、次のページに認識処理が進みます。

JobStartedJobProgressJobOperationJobCompletedイベント

同期および非同期ジョブが開始したとき、実行されているとき、および完了したときを追跡するイベント。

AbortAllJobs

すべての実行と保留のジョブを中止します。

EnableTrace

標準.NETトレースリスナーにデバッグメッセージを出力します。

サンプル

このサンプルでは、任意のフォルダー内のすべての画像をOCR処理し、PDF文書に変換します。複数のスレッドを使用して認識パフォーマンスを最大化し、中止したり致命的なエラーなく続行したりできます。このサンプルは、任意のページ数の変換イメージをサポートします。

Copy Code  
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Forms.Ocr
Imports Leadtools.Forms.DocumentWriters
Imports Leadtools.Forms
Imports Leadtools.WinForms

Public Class RunJobExample
   ' Number of documents that are pending
   Private _documentsPending As Integer
   ' Event to trigger when all documents are finished
   Private _allDocumentsFinishedEvent As AutoResetEvent
   Public Sub Start()
      Dim imagesDirectory As String = LEAD_VARS.ImagesDir
      Dim documentsDirectory As String = Path.Combine(LEAD_VARS.ImagesDir, "RunJobExample")

      ' Create the output (documents) directory
      If Not Directory.Exists(documentsDirectory) Then
         Directory.CreateDirectory(documentsDirectory)
      End If

      ' Get all TIF files in input (images) directory
      Dim imageFileNames As String() = Directory.GetFiles(imagesDirectory, "*.tif")
      If imageFileNames.Length = 0 Then
         Console.WriteLine("No images to OCR")
         Return
      End If

      ' Create a new OCR engine instance
      Dim engineType As OcrEngineType = OcrEngineType.Advantage
      Console.WriteLine(String.Format("Starting up {0} engine", engineType))
      Using ocrEngine As IOcrEngine = OcrEngineManager.CreateEngine(engineType, False)
         ocrEngine.Startup(Nothing, Nothing, Nothing, LEAD_VARS.OcrAdvantageRuntimeDir)

         ' Setup document PDF save options: Image/Text with CCITT G4 encoding for B/W
         Dim docWriter As DocumentWriter = ocrEngine.DocumentWriterInstance
         Dim pdfOptions As PdfDocumentOptions = TryCast(docWriter.GetOptions(DocumentFormat.Pdf), PdfDocumentOptions)
         pdfOptions.ImageOverText = True
         pdfOptions.DocumentType = PdfDocumentType.Pdf
         pdfOptions.FontEmbedMode = DocumentFontEmbedMode.None
         pdfOptions.OneBitImageCompression = OneBitImageCompressionType.FaxG4
         docWriter.SetOptions(DocumentFormat.Pdf, pdfOptions)

         ' We are going to use multiple-threads, so disable threading in
         ' IOcrAutoRecognizeManager
         Dim autoRecognizeManager As IOcrAutoRecognizeManager = ocrEngine.AutoRecognizeManager
         autoRecognizeManager.MaximumThreadsPerJob = 1

         ' Tell the recognize manager to continue on errors
         autoRecognizeManager.JobErrorMode = OcrAutoRecognizeManagerJobErrorMode.[Continue]

         ' Instead of using events to trigger when documents are done,
         ' we will use the JobCompleted events of IOcrAutoRecognizeManager
         ' to decrement a counter and trigger one event when the counter reaches 0
         AddHandler autoRecognizeManager.JobStarted, AddressOf autoRecognizeManager_JobStarted
         AddHandler autoRecognizeManager.JobCompleted, AddressOf autoRecognizeManager_JobCompleted

         Dim count As Integer = imageFileNames.Length
         _documentsPending = count
         _allDocumentsFinishedEvent = New AutoResetEvent(False)

         For i As Integer = 0 To count - 1
            ' Create the job data
            Dim imageFileName As String = imageFileNames(i)
            Dim name As String = "Document " & (i + 1).ToString()
            Console.WriteLine("Queuing {0} file {1}", name, imageFileName)

            Dim data As New JobData()
            data.AutoRecognizeManager = autoRecognizeManager
            data.ImageFileName = imageFileName
            data.DocumentFileName = Path.Combine(documentsDirectory, Path.GetFileNameWithoutExtension(imageFileName) & ".pdf")
            data.JobName = name

            ' Queue this job
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf RunJob), data)
         Next

         ' Wait for all documents to finish
         _allDocumentsFinishedEvent.WaitOne()
         _allDocumentsFinishedEvent.Close()

         RemoveHandler autoRecognizeManager.JobStarted, AddressOf autoRecognizeManager_JobStarted
         RemoveHandler autoRecognizeManager.JobCompleted, AddressOf autoRecognizeManager_JobCompleted

         Console.WriteLine("All documents finished, check the result files in {0}", documentsDirectory)
      End Using
   End Sub

   Private Sub autoRecognizeManager_JobStarted(sender As Object, e As OcrAutoRecognizeRunJobEventArgs)
      ' This is not strictly needed in this example, we will
      ' use it to show information
      Console.WriteLine("{0} started...", e.Job.JobData.JobName)

      ' Check if we need to abort
      If AbortJobs(e.Job) Then
         ' Yes, abort all jobs
         e.Job.AutoRecognizeManager.AbortAllJobs()
      End If
   End Sub

   Private Sub autoRecognizeManager_JobCompleted(sender As Object, e As OcrAutoRecognizeRunJobEventArgs)
      Dim message As String = String.Format("{0} completed ", e.Job.JobData.JobName)

      Dim job As IOcrAutoRecognizeJob = e.Job

      ' Show any errors
      If job.Errors.Count = 0 Then
         message += "successfully..."
      Else
         message += "with errors, first error is " + job.Errors(0).Exception.Message

         ' And save the errors to a text file in the document directory
         Dim documentFileName As String = job.JobData.DocumentFileName
         Dim textPathName As String = _
            Path.Combine(Path.GetDirectoryName(documentFileName), Path.GetFileNameWithoutExtension(documentFileName) & "_errors.txt")

         Using writer As StreamWriter = File.CreateText(textPathName)
            writer.WriteLine(job.JobData.JobName)
            writer.WriteLine("Data:")
            writer.WriteLine(" Image file name: " & job.JobData.ImageFileName)
            writer.WriteLine(" First page number: " & job.JobData.FirstPageNumber)
            writer.WriteLine(" Last page number: " & job.JobData.LastPageNumber)
            writer.WriteLine(" Format:" & job.JobData.Format)
            writer.WriteLine(" Document file name: " & job.JobData.DocumentFileName)
            writer.WriteLine("Errors:")

            For Each [error] As OcrAutoRecognizeManagerJobError In job.Errors
               writer.WriteLine(" Page: {0} during {1}. Error: {2}", [error].ImagePageNumber, [error].Operation, [error].Exception.Message)
            Next
         End Using
      End If

      Console.WriteLine(message)

      ' Decrement the documents count, when we reach 0, we are done
      ' Since this will be called from multiple threads, we need
      ' to use a thread-safety procedure
      Dim pending As Integer = Interlocked.Decrement(_documentsPending)

      ' If we are the last document, wait up main thread
      If pending = 0 Then
         _allDocumentsFinishedEvent.Set()
      End If
   End Sub

   Private Class JobData
      Public AutoRecognizeManager As IOcrAutoRecognizeManager
      Public ImageFileName As String
      Public DocumentFileName As String
      Public JobName As String
   End Class

   Private Sub RunJob(state As Object)
      Dim data As JobData = TryCast(state, JobData)

      Console.WriteLine("Running {0}", data.JobName)

      ' Run it
      Dim jobData As New OcrAutoRecognizeJobData(data.ImageFileName, DocumentFormat.Pdf, data.DocumentFileName)
      jobData.JobName = data.JobName
      Dim job As IOcrAutoRecognizeJob = data.AutoRecognizeManager.CreateJob(jobData)
      data.AutoRecognizeManager.RunJob(job)
   End Sub

   Private Function AbortJobs(ocrJob As IOcrAutoRecognizeJob) As Boolean
      ' In your application, you can check if abortion is required, for example, if the user
      ' has pressed the Cancel button on a progress bar or if your service is shutting down.

      ' In this example, we will never abort, but you can change this code to return true
      ' upon any condition (or when a specific job is about to start)
      ' and the engine will abort all current and pending jobs
      Return False
   End Function
End Class

Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
Public Const OcrAdvantageRuntimeDir As String = "C:\LEADTOOLS 19\Bin\Common\OcrAdvantageRuntime"
End Class
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Forms.Ocr;
using Leadtools.Forms.DocumentWriters;
using Leadtools.Forms;
using Leadtools.WinForms;

public class RunJobExample
{
   // Number of documents that are pending
   private int _documentsPending;
   // Event to trigger when all documents are finished
   private AutoResetEvent _allDocumentsFinishedEvent;
   
   public void Start()
   {
      string imagesDirectory = LEAD_VARS.ImagesDir;
      string documentsDirectory = Path.Combine(LEAD_VARS.ImagesDir, "RunJobExample");

      // Create the output (documents) directory
      if (!Directory.Exists(documentsDirectory))
      {
         Directory.CreateDirectory(documentsDirectory);
      }

      // Get all TIF files in input (images) directory
      string[] imageFileNames = Directory.GetFiles(imagesDirectory, "*.tif");
      if (imageFileNames.Length == 0)
      {
         Console.WriteLine("No images to OCR");
         return;
      }

      // Create a new OCR engine instance
      OcrEngineType engineType = OcrEngineType.Advantage;
      Console.WriteLine(string.Format("Starting up {0} engine", engineType));
      using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(engineType, false))
      {
         ocrEngine.Startup(null, null, null, LEAD_VARS.OcrAdvantageRuntimeDir);

         // Setup document PDF save options: Image/Text with CCITT G4 encoding for B/W
         DocumentWriter docWriter = ocrEngine.DocumentWriterInstance;
         PdfDocumentOptions pdfOptions = docWriter.GetOptions(DocumentFormat.Pdf) as PdfDocumentOptions;
         pdfOptions.ImageOverText = true;
         pdfOptions.DocumentType = PdfDocumentType.Pdf;
         pdfOptions.FontEmbedMode = DocumentFontEmbedMode.None;
         pdfOptions.OneBitImageCompression = OneBitImageCompressionType.FaxG4;
         docWriter.SetOptions(DocumentFormat.Pdf, pdfOptions);

         // We are going to use multiple-threads, so disable threading in
         // IOcrAutoRecognizeManager
         IOcrAutoRecognizeManager autoRecognizeManager = ocrEngine.AutoRecognizeManager;
         autoRecognizeManager.MaximumThreadsPerJob = 1;

         // Tell the recognize manager to continue on errors
         autoRecognizeManager.JobErrorMode = OcrAutoRecognizeManagerJobErrorMode.Continue;

         // Instead of using events to trigger when documents are done,
         // we will use the JobCompleted events of IOcrAutoRecognizeManager
         // to decrement a counter and trigger one event when the counter reaches 0
         autoRecognizeManager.JobStarted += new EventHandler<OcrAutoRecognizeRunJobEventArgs>(autoRecognizeManager_JobStarted);
         autoRecognizeManager.JobCompleted += new EventHandler<OcrAutoRecognizeRunJobEventArgs>(autoRecognizeManager_JobCompleted);

         int count = imageFileNames.Length;
         _documentsPending = count;
         _allDocumentsFinishedEvent = new AutoResetEvent(false);

         for (int i = 0; i < count; i++)
         {
            // Create the job data
            string imageFileName = imageFileNames[i];
            string name = "Document " + (i + 1).ToString();
            Console.WriteLine("Queuing {0} file {1}", name, imageFileName);

            JobData data = new JobData();
            data.AutoRecognizeManager = autoRecognizeManager;
            data.ImageFileName = imageFileName;
            data.DocumentFileName = Path.Combine(documentsDirectory, Path.GetFileNameWithoutExtension(imageFileName) + ".pdf");
            data.JobName = name;

            // Queue this job
            ThreadPool.QueueUserWorkItem(new WaitCallback(RunJob), data);
         }

         // Wait for all documents to finish
         _allDocumentsFinishedEvent.WaitOne();
         _allDocumentsFinishedEvent.Close();

         autoRecognizeManager.JobStarted -= new EventHandler<OcrAutoRecognizeRunJobEventArgs>(autoRecognizeManager_JobStarted);
         autoRecognizeManager.JobCompleted -= new EventHandler<OcrAutoRecognizeRunJobEventArgs>(autoRecognizeManager_JobCompleted);

         Console.WriteLine("All documents finished, check the result files in {0}", documentsDirectory);
      }
   }
   private void autoRecognizeManager_JobStarted(object sender, OcrAutoRecognizeRunJobEventArgs e)
   {
      // This is not strictly needed in this example, we will
      // use it to show information
      Console.WriteLine("{0} started...", e.Job.JobData.JobName);

      // Check if we need to abort
      if (AbortJobs(e.Job))
      {
         // Yes, abort all jobs
         e.Job.AutoRecognizeManager.AbortAllJobs();
      }
   }

   private void autoRecognizeManager_JobCompleted(object sender, OcrAutoRecognizeRunJobEventArgs e)
   {
      string message = string.Format("{0} completed ", e.Job.JobData.JobName);

      IOcrAutoRecognizeJob job = e.Job;

      // Show any errors
      if (job.Errors.Count == 0)
      {
         message += "successfully...";
      }
      else
      {
         message += "with errors, first error is " + job.Errors[0].Exception.Message;

         // And save the errors to a text file in the document directory
         string documentFileName = job.JobData.DocumentFileName;
         string textPathName = Path.Combine(Path.GetDirectoryName(documentFileName), Path.GetFileNameWithoutExtension(documentFileName) + "_errors.txt");
         using (StreamWriter writer = File.CreateText(textPathName))
         {
            writer.WriteLine(job.JobData.JobName);
            writer.WriteLine("Data:");
            writer.WriteLine(" Image file name: " + job.JobData.ImageFileName);
            writer.WriteLine(" First page number: " + job.JobData.FirstPageNumber);
            writer.WriteLine(" Last page number: " + job.JobData.LastPageNumber);
            writer.WriteLine(" Format:" + job.JobData.Format);
            writer.WriteLine(" Document file name: " + job.JobData.DocumentFileName);
            writer.WriteLine("Errors:");

            foreach (OcrAutoRecognizeManagerJobError error in job.Errors)
            {
               writer.WriteLine(" Page: {0} during {1}. Error: {2}", error.ImagePageNumber, error.Operation, error.Exception.Message);
            }
         }
      }

      Console.WriteLine(message);

      // Decrement the documents count, when we reach 0, we are done
      // Since this will be called from multiple threads, we need
      // to use a thread-safety procedure
      int pending = Interlocked.Decrement(ref _documentsPending);

      // If we are the last document, wait up main thread
      if (pending == 0)
      {
         _allDocumentsFinishedEvent.Set();
      }
   }

   private class JobData
   {
      public IOcrAutoRecognizeManager AutoRecognizeManager;
      public string ImageFileName;
      public string DocumentFileName;
      public string JobName;
   }

   private void RunJob(object state)
   {
      JobData data = state as JobData;

      Console.WriteLine("Running {0}", data.JobName);

      // Run it
      OcrAutoRecognizeJobData jobData = new OcrAutoRecognizeJobData(data.ImageFileName, DocumentFormat.Pdf, data.DocumentFileName);
      jobData.JobName = data.JobName;
      IOcrAutoRecognizeJob job = data.AutoRecognizeManager.CreateJob(jobData);
      data.AutoRecognizeManager.RunJob(job);
   }

   private bool AbortJobs(IOcrAutoRecognizeJob ocrJob)
   {
      // In your application, you can check if abortion is required, for example, if the user
      // has pressed the Cancel button on a progress bar or if your service is shutting down.

      // In this example, we will never abort, but you can change this code to return true
      // upon any condition (or when a specific job is about to start)
      // and the engine will abort all current and pending jobs
      return false;
   }
}

static class LEAD_VARS
{
public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
public const string OcrAdvantageRuntimeDir = @"C:\LEADTOOLS 19\Bin\Common\OcrAdvantageRuntime";
}
必要条件

ターゲットプラットホーム

参照

参照

IOcrAutoRecognizeManagerインターフェース
IOcrAutoRecognizeManagerメンバ
LEADTOOLS .NET OCRによるプログラミング
LEADTOOLS OCRによるマルチスレッド
LEADTOOLSは、thunkサーバのOCR処理を行います

Leadtools.Forms.Ocrは、認識またはDocument Imaging Suiteのライセンスと、解除キーが必要です。詳細は、以下を参照してください。LEADTOOLSツールキット機能