LEADTOOLS Leadtools.Topics.Documents.UI

フレームを表示

DocumentViewerは、行動を実行するために、コマンドシステムを使います。それがドキュメントビューワ、任意の引数と結果の現在の状態で実行することができるかどうかにかかわらず、各々のコマンドはコマンドの固有の名を格納するデータ構造です。DocumentViewerCommandsDocumentViewerのコマンドを管理して、DocumentViewer.Commandsプロパティによってアクセスされることができます。

コマンドは、通常、アプリケーションでユーザーインターフェース要素に拘束されます。プロパティが要素(コマンドが現在実行されることができないならば)を有効または無効にするのに用いられることができるという命令、その状態(たとえば、確認されたボックス)を設定します、そして、アクションを実行します、ユーザーが要素(ボタンまたはメニュー項目をクリックすることなどの)を選択する時。

コマンドを使う理由

DocumentViewerは、同期において保持されなければならない多くのパーツを格納します。ImageViewerまたはAnnAutomationとすべてのアクションなどのこれらのパーツ用途市民LEADTOOLSクラスとコントロールは、クラスのパブリックで文書化されたプロパティとメソッドを用いて実行されます。

たとえば、アプリケーションは、クリックして、ビューの現在の対話モードをパン/ズームに設定するとき、メニュー項目を持っています。

(パン/ズームは、そばにDocumentViewerによって追加される対話モードの1つです)デフォルト。そのIDは、ImageViewerInteractiveMode.PanZoomModeIdです。必要とされる手順は、ここにあります:

  1. アプリケーションは、以下のように要素の使用可能/抑制された状態を更新します:

    • ドキュメントビューワが文書セットを持っていないならば、要素は無効にされなければなりません。

    • 現在の対話モードがすでにパン/ズームに設定されていると要素は無効になっています(またはチェックが入って起動されません)。しかしこの例では無効にして使用しています。

    上記は、このコードスニペットを用いて実行されることができます:

    
                void UpdatePanZoomUIState() {
                   // First test
                   panZoomElement.Enabled = documentViewer.HasDocument;
                   if(panZoomElement.Enabled) {
                      // Find the Pan/Zoom interactive mode, see if it is already enabled
                      var panZoom = documentViewer.View.ImageViewer.InteractiveModes.FindById(ImageViewerInteractiveMode.PanZoomMode);
                      // Second test, see if the mode is already enabled
                      panZoomElement.Enabled = !panZoom.IsEnabled;
                   }
                }
                
    

    これは、要素の状態を引き受けます。

  2. ユーザーがパン/ズームメニュー項目をクリックするとき、アプリケーションは以下を実行しなければなりません:

    • 全くこれからImageViewerInteractiveModes.EnableByIdを呼び出さないことは、すべての他の対話モードを無効にします。パン/ズームに沿って使われることができるので、アノテーションペイジリンクモードは使用可能にしておかれなければなりません。

      ユーザーがアノテーションオブジェクトをクリックするとき、それは自動化されます。ユーザーが1ページのリンクをクリックするとき、それは実行しなければなりません、そして、ユーザーがこれらのオブジェクトの外でクリックするとき、パニングとズームは起こるだけです。プロセスがすべてのモードをループ処理しなければならないように、パン/ズーム以外、アノテーションとペイジリンクを無効にします。

    • アノテーションであってデザイナーはそうであるにちがいない、使い古した、その後任意の流れが、キャンセルします(たとえば、プロセスが新しいポリラインを描画するためにマルチクリック操作の最中に実行するならば)、そして、ツールバーのIDが後ろに設定しなければならない現在のオブジェクトSelect

    • 最後に、メニュー項目を無効にするために、もう一度呼び出しますUpdatePanZoomUIState

    上記は、このコードスニペットを用いて実行されることができます:

    
                void SetPanZoom() {
                   // First action
                   foreach (var mode in documentViewer.View.ImageViewer.InteractiveModes) {
                      mode.IsEnabled =
                         mode.Id == ImageViewerInteractiveMode.PanZoomMode || 
                         mode.Id == DocumentViewer.AnnotationsInteractiveModeId ||
                         mode.Id == DocumentViewer.PageLinksInteractiveModeId;
                   }
                   // Second action
                   // We cannot just call .Automation, the annotations might not be loaded yet, so we must check for that
                   if(documentViewer.Annotations != null && documentViewer.Annotations.Automation != null) {
                      documentViewer.Annotations.Automation.Cancel();
                      documentViewer.Annotations.AutomationManager.CurrentObjectId = AnnObject.SelectObjectId;
                   }
                   // Third action
                   UpdatePanZoomUIState();
                }
                
    

実行コマンド

上記のcodeが正確に同期においてドキュメントビューワのすべての部分を取得するのは正しくなければなりません、そして、これは単一の単純なアクション専用です:現在の対話モードを設定すること。

DocumentViewerは、パン/ズーム対話モードを設定する組込みコマンドが付属します。コマンドの名前は、%"Interactive.PanZoomです」:F:Leadtools.Documents.UI.DocumentViewerCommands.InteractivePanZoom%。システムが使われることができるコマンドは、以下として1つの行に2つ以上のメソッドcodeを短くしました:


            void UpdatePanZoomUIState() {
               panZoomElement.Enabled = documentViewer.Commands.CanRun(DocumentViewerCommands.InteractivePanZoom, null);
            }
            void SetPanZoom() {
               documentViewer.Commands.Run(DocumentViewerCommands.InteractivePanZoom, null);
            }
            

組込みコマンドはきれいにより複雑な行動を処理して、ドキュメントビューワの全ての部分が同期において保持されることを確実にします。任意のコマンドは一意な単純な定数列によって識別されることができます、そして、このように、ユーザーインターフェースによるバインディングコマンドは簡単に達成されることができます。

コマンドパラメータと結果

ヌルパラメータはCanRunに渡しました、そして、実行されたメソッドはInteractivePanZoomが任意の指標をとらないからです。PageGotoがパラメーター(本例のページ番号)として要求して、このように呼び出されなければならないほどの若干のコマンド:


            // Goto page number 10 in the viewer
            documentViewer.Commands.Run(DocumentViewerCommands.PageGoto, 10);
            

コマンドのパラメータ、原型オブジェクトは型です。コマンドは、必要とされるならば、必要な変換を実行します ― PageGotoの場合整数値まで。

CanRunは、これらのコマンドのためにパラメーターもとります:


            value = documentViewer.Commands.CanRun(DocumentViewerCommands.PageGoto, 10);
            

そして、「値」は、ドキュメントが少なくとも10ページ以上を格納する、そして、現在のページ番号がすでに10でないならば、trueでしょう。そうでない場合;false

Runは、常にコマンドの実行結果を返します。この結果も汎用オブジェクトです。任意の結果を返さないため、とりわけ議論されるコマンドはnullを返します。TextExportなどの一部のコマンドは、ページ(または文書)のテキストを文字列オブジェクトとして返します。TextExportは、パラメーターとしてページ番号を受け取ることにご注意ください。またはnullまたは0が渡されると、すべてのページのテキストが返されます。


            // Get the text for page number 10 as a string
            string text = (string) documentViewer.Commands.Run(DocumentViewerCommands.TextExport, 10);
            

状態コマンド

CanRunおよびRunに加え、一部のコマンドにはブール状態が含まれます。たとえば、InteractiveAutoPanは、他の対話モードに沿って使われる自動パニングを有効または無効にするのに用いられることができます。ユーザーインターフェース要素。これらのコマンドは通常チェックマークを使用して状態を示します。アプリケーションは、以下のようにこのコマンドを使うことができます:


            void UpdateAutoPanUItate() {
               // Can we run the command?
               autoPanElement.Enabled = documentViewer.Commands.CanRun(DocumentViewerCommands.InteractiveAutoPan, null);
               // Get the command
               var command = documentViewer.Commands.GetCommand(DocumentViewerCommands.InteractiveAutoPan);
               // Use its current state
               autoPan.Checked = command.State;
            }
            void FlipAutoPan() {
               // Just call Run, the command knows it has a state and will flip it automatically, enabling or disabling auto-pan accordingly
               documentViewer.Commands.Run(DocumentViewerCommands.InteractiveAutoPan, null);
            }
            

遅いコマンド

ドキュメントビューワの上で実行される大部分の行動が即時性が高いが、若干の操作に要請されるビューワ状態とデータに従いかなりの時間がかかるかもしれません。

たとえば、上述のTextExportコマンドは、DocumentPage.GetTextを用いて得られるページのDocumentPageTextオブジェクトから、テキストを解析します。このメソッドにどちらのSVGまたはOCR技術を用いてでもページからテキストを解析して、特に後者の場合、返るために、数秒がかかることができます。一度得られたら、DocumentViewerTextは内部的にページのためにDocumentPageTextオブジェクトをキャッシュに格納します。最初の時、ページのテキストは遅いかもしれません、しかし、以降の要求は即時性が高いです。

TextExportは、以下を実行します(単純化されて、そして、関係するDocumentViewer.Operationイベントを無視しています):

  1. Textに、要求されたキャッシュページにDocumentPageTextオブジェクトがあるかどうかをチェックします。その場合、テキストを解析して結果を返し終了します。この操作に時間はかかりません。

  2. 次に、この値がfalseであるならば、それは値Text.AutoGetTextを確認します、そして、アプリケーションはそのDocumentPage.GetTextにすぐに呼び出されないことを要求しました。このように、メソッドは空の文字列を返します-この操作は即時性が高いです。

  3. Text.AutoGetTextの値がtrueであるならば、DocumentPage.GetTextは呼び出されます、そして、オリジナルドキュメントがSVG(TIFFまたはラスターPDF文書などの)をサポートしないならば、操作はOCRを使用して、返るのに2、3秒かかるかもしれません。テキストはこれが終わるのを待って、DocumentPageTextがそれとretruningすることからデータを前に解析することをキャッシュに格納します-この操作は遅いです。

  4. 次期TextExportはこの同じページの上で呼び出されます、そして、最初の手順に記載されているように、テキストはキャッシュに格納されたデータから解析されます、そして、結果は返されます。DocumentPage.GetTextは呼び出されません-この操作は即時性が高いです。

以上から、TextExportでRunを呼び出してもアプリケーションに即座に制御が返されない可能性があります。このコマンドが直接ユーザーインターフェース要素から実行されることになっているならば、アプリケーションのUIスレッドはフリーズして、メソッド戻りまで敏感でありません。

1つのソリューションは、ユーザーがテキストエクスポートUI要素を選択する時に続くことを実行することになっています:

  1. ビジーダイアログを示します

  2. 別々のスレッドでコマンドを実行します

  3. コマンドが返るとき、ビジーダイアログを非表示にします

たとえコマンドが即時性が高いだろう(上述の大部分の場合の場合のように)としても、これは機能するが、常にこのビジーダイアログを示して/非表示にする負のエフェクトを持っています。大部分のアプリケーションに、これは、しばらく明滅している画面の好ましくないアクションに終わります。

他のオプションは、DocumentViewerCommands.IsSlowメソッドを使うことです。各々のコマンドは、その内部の現在の状態と計算に基づくtrueまたはfalseを返します。TextExportの場合上で説明されるように。Text Export UI要素をIsSlowを使って処理するための上記に説明したソリューションを以下に示します

  1. documentCommands.IsSlow(DocumentViewerCommands.TextExport, 10)を呼び出します。

  2. 結果がtrueであるならば、ビジーダイアログを示して、別々のスレッドでコマンドを実行して、それから、完了に関してビジーダイアログを非表示にします

  3. 結果がfalseであるならば、UIスレッドで直接コマンドを実行します

これは、必要とされない限り、ビジーダイアログを示さないこと以外の上述のちらつき問題を除きます。

非同期でコマンドを実行すること

DocumentViewerCommands.Runに加えて、DocumentViewerCommands.RunAsyncメソッドは、非同期でコマンドを実行するのに用いられることができます。これは特に遅いコマンドのためにに役立って、コマンドを実行して、エラーを処理して、簡単にクリーンアップするためにスレッドを作成するアクションを実行します。

以前からの同じTextExportコマンドを使用して、非同期に実行する方法です。


            // Create a new DocumentViewerAsyncOperation object
            var async = new DocumentViewerAsyncOperation();
            // Set the delegate to be called if an error occurs
            async.Error = (DocumentViewerAsyncOperation operation, Exception error) => {
               HandleError(error);
            };
            // Set the delegate to be called after the run, successfully or when an error occurs
            async.Always = (DocumentViewerAsyncOperation operation) => {
               // Hide the busy dialog
               HideBusyDialog();
            };
            // Show the busy dialog
            // Run the command asynchronously in a worker thread
            documentViewer.Commands.RunAsync(async, DocumentViewerCommands.TextCopy, 10);
            

またはIsSlowを使うことで:


            var isSlow = _documentViewer.Commands.IsSlow(DocumentViewerCommands.TextExport, 10);
            if (isSlow) {
               // Command is slow, run asynchronously
               // Create a new DocumentViewerAsyncOperation object
               var async = new DocumentViewerAsyncOperation();
               // Set the delegate to be called if an error occurs
               async.Error = (DocumentViewerAsyncOperation operation, Exception error) => {
                  HandleError(error);
               };
               // Set the delegate to be called after the run, successfully or when an error occurs
               async.Always = (DocumentViewerAsyncOperation operation) => {
                  // Hide the busy dialog
                  HideBusyDialog();
               };
               // Show the busy dialog
               // Run the command asynchronously in a worker thread
               _documentViewer.Commands.RunAsync(async, DocumentViewerCommands.TextCopy, 10);
            } else {
               // Command is not slow, run directly
               _documentViewer.Commands.Run(DocumentViewerCommands.TextCopy, 10);
            }
            

DocumentViewerCommandクラス

DocumentViewerCommandは、各々のコマンドのためにデータを保持します。このクラスは、以下のメンバを格納します:

メンバ 説明
名前 コマンドの固有の名。
CanRunHandler このコマンドを確認することが値を用いて実行することができるとき、使うコールバック。
RunHandler 値でコマンドを実行する使用へのコールバック
IsSlowHandler 値を用いて実行されるとき、コマンドが遅いだろうかどうか調べる使用へのコールバック。
コマンドの現在の値。
HasState このコマンドが状態を使うかどうか示します。
状態 コマンドの現在の状態値。

すべての組込みコマンドは、初期化されて、すぐに使えるDocumentViewerCommandオブジェクトのインスタンスです。コールバックはDocumentViewerCommands.RunDocumentViewerCommands.CanRun)で使われることです、そして、DocumentViewerCommands.IsSlowは呼び出されます。

DocumentViewerCommandsクラス

DocumentViewerCommandsDocumentViewerのコマンドを管理して、DocumentViewer.Commandsプロパティによってアクセスされることができます。内部的には、それはドキュメントビューワのすべてのコマンドのディクショナリを保存します。キーはコマンド固有の名です、そして、値は対応するDocumentViewerCommandですオブジェクト。それは、以下のメンバを持っています:

メンバ 説明
GetCommand 指定名でDocumentViewerCommandを取得します。
CanRun コマンドが指定された値で実行することができるかどうか調べます。
実行 指定された値でコマンドを実行します。
IsSlow 指定した値でコマンドを実行すると時間がかかるかどうかを確認します。

組込みコマンド

DocumentViewerは、それがそうすることができる組込みコマンドがすぐに使った以下が付属します。DocumentViewerDocumentViewerCommandsクラスで作成されて、保存されるとき、すべてのコマンドは初期化されます。

ページコマンド

これらのコマンドは、DocumentViewer.GotoPageを使います

コマンド 値引数 戻り値 説明
Page.First None None ドキュメントにおける最初のページへ行きます。
Page.Next None None ドキュメントにおける次のページへ行きます。
Page.Previous None None ドキュメントで前のページへ行きます。
Page.Last None None ドキュメントにおける最後のページへ行きます。
Page.Goto int pageNumber None 指定されたページ番号へ行きます。

ビューコマンド

これらのコマンドは、DocumentViewerViewとそのImageViewerを使います

コマンド 値引数 戻り値 説明
View.ZoomIn None None DocumentViewerView.ZoomRatioによってビューをズームインします。
View.ZoomOut None None ZoomRatioによってビューをズームアウトします。
View.ZoomPercentage 二倍のパーセンテージ None 指定されたパーセンテージによってビューをズームします。
View.FitWidth None None ビューでページ幅を合わせます。
View.FitPage None None ビューにおけるページを合わせます。
View.ActualSize None None ビューにおけるページの実寸法を示します。
View.RotateClockwise None None 時計回りにビューを90度回転させます。
View.RotateCounterClockwise None None 反時計回りにビューを90度回転させます。
View.ItemType DocumentViewerItemType None ビュー項目タイプを値に設定します。

レイアウトコマンド

これらのコマンドは、ビューのImageViewerで設定する事前定義ImageViewerViewLayoutオブジェクトを使います

コマンド 値引数 戻り値 説明
Layout.Single None None ビューで単一のレイアウトを設定します。
Layout.Vertical None None ビューで垂直方向のレイアウトを設定します。
Layout.Double None None ビューで二重のレイアウトを設定します
Layout.Horizontal None None ビューで水平レイアウトを設定します。

インタラクティブコマンド

これらのコマンドは、ビューのImageViewerで設定する事前定義ImageViewerInteractiveModeオブジェクトを使います

コマンド 値引数 戻り値 説明
Interactive.PanZoom None None 現在の対話モードとしてパン/ズームを設定します。
Interactive.Pan None None 現在の対話モードとしてパンを設定します。
Interactive.Zoom None None 現在の対話モードとしてズームを設定します。
Interactive.ZoomTo None None 現在の対話モードとしてズーム先を設定します。
Interactive.MagnifyGlass None None 現在の対話モードとして拡大鏡を設定します。
Interactive.RubberBand None None 現在の対話モードとして汎用的なラバーバンドを設定します。
Interactive.SelectText None None 現在の対話モードとして選ばれたテキストを設定します。
Interactive.AutoPan None None 自動パン対話モードを有効にして/無効にします。

テキストコマンド

これらのコマンドは、DocumentViewerTextからメソッドを使います。

コマンド 値引数 戻り値 説明
Text.Copy int pageNumber None DocumentViewerText.Copy(pageNumber)を呼び出します。
Text.SelectAll None None DocumentViewerText.SelectAllを呼び出します
Text.ClearSelection None None DocumentViewerText.ClearSelectionを呼び出します
Text.Export int pageNumber string DocumentViewerText.ExportText(pageNumber)を呼び出します。
Text.FindNext None DocumentViewerTextItemまたはnullのリスト DocumentViewerText.Find(DocumentViewerText.LastFindText、false、true)を呼び出します。
Text.FindPrevious None DocumentViewerTextItemまたはnullのリスト DocumentViewerText.Find(DocumentViewerText.LastFindText、false、false)を呼び出します。
Text.Get int pageNumber None pageNumberが0である場合、DocumentViewerText.GetDocumentPageText(pageNumber)またはDocumentViewerText.GetAllDocumentPageTextを呼び出します。

アノテーションコマンド

これらのコマンドは、DocumentViewerAnnotationsAnnAutomationからメソッドを使います。これらのコマンドメソッドがエラーなしで呼び出されることができることを確認する必要なチェックを提供します。

コマンド 値引数 戻り値 説明
Annotations.Undo None None AnnAutomation.Undoを呼び出します。
Annotations.Redo None None AnnAutomation.Redoを呼び出します。
Annotations.Cut None None AnnAutomation.CopyとAnnAutomation.DeleteSelectedObjectsを呼び出します
Annotations.Copy None None AnnAutomation.コピーを呼び出します。
Annotations.Paste LeadPointは配置します None AnnAutomation.貼り付け(position)を呼び出します。
Annotations.Delete None None AnnAutomation.DeleteSelectedObjectsを呼び出します。
Annotations.SelectAll int pageNumber None AnnAutomation.SelectObjects(ページ番号内のコンテナのすべてのオブジェクト)を呼び出します。
Annotations.ClearSelection None None AnnAutomation.SelectObjects(null)を呼び出します。
Annotations.UserModeDesign None None AnnAutomationManager.UserModeAnnUserMode.Designに設定します。
Annotations.UserModeRun None None AnnAutomationManager.UserModeAnnUserMode.Runに設定します。
Annotations.UserModeRender None None AnnAutomationManager.UserModeAnnUserMode.Renderに設定します。
Annotations.BringToFront None None AnnAutomation.BringToFront(false)を呼び出します。
Annotations.SendToBack None None AnnAutomation.SendToBack(false)を呼び出します。
Annotations.BringToFirst None None AnnAutomation.BringToFrong(true)を呼び出します。
Annotations.SendToLast None None AnnAutomation.SendToBack(true)を呼び出します。
Annotations.Flip None None AnnAutomation.フリップ(false)を呼び出します。
Annotations.Reverse None None AnnAutomation.フリップ(true)を呼び出します。
Annotations.Group string groupName None DocumentViewerAnnotations.GroupSelectedObjects(groupName)を呼び出します。
Annotations.Ungroup None None DocumentViewerAnnotations.UngroupSelectedObjectsを呼び出します
Annotations.Lock None None AnnAutomation.ロックを呼び出します。
Annotations.Unlock None None AnnAutomation.ロック解除しますを呼び出します。
Annotations.ResetRotatePoints None None AnnAutomation.ResetRotatePointsを呼び出します。
Annotations.AntiAlias None None IAnnAutomationControl.AutomationAntiAliasの状態を反転します。
Annotations.Properties None None AnnAutomation.ShowObjectPropertiesを呼び出します。
Annotations.UseRotateThumbs None None DocumentViewerAnnotations.UseRotateThumbsの状態を反転します。
Annotations.EnableToolTips None None AnnAutomationManager.EnableToolTipの状態を反転します。
Annotations.RenderOnThumbnails None None DocumentViewerAnnotations.RenderOnThumbnailsの状態を反転します。
参照

参照

LEADTOOLSドキュメントビューワの使用
ドキュメントビューワの操作
ドキュメントライブラリ機能
LEADTOOLSドキュメントライブラリを使用したロード
LEADTOOLSドキュメントコンバーターの使用