Manages the main content view in this document viewer.
public class DocumentViewerView : IDisposable
DocumentViewerView can be accessed by the DocumentViewer.View property.
This class manages the main content to view the pages of the current LEADDocument set in the document viewer.
The class creates an instance of ImageViewer for viewing the pages. Virtualization is used to load and cache the image data to keep the application user interface responsive, support documents with large number of pages and minimize the resources used. Raster and SVG viewing modes is supported.
The class also handles the user interactions with the pages, such pan, zoom and magnify interactive modes, inertia scrolling, page layouts and fit modes and rendering the annotation containers.
A new instance of DocumentViewerView is created and set in the DocumentViewer.View property.
A new instance of the ImageViewer control is created and is added as a child control to DocumentViewerCreateOptions.ViewContainer. This image viewer will be used to view the Raster or SVG image data of the pages when an LEADDocument is set in the viewer. This control can be accessed by using ImageViewer property of this class. Refer to the property for information on how this ImageViewer is initialized.
The interactive modes are initialized and added to ImageViewer.InteractiveModes.
The ImageViewer control is removed from the parent DocumentViewerCreateOptions.ThumbnailsContainer container.
All resources are freed
The following occurs when a new LEADDocument object is set in the DocumentViewer using DocumentViewer.SetDocument. If a previous document was set in the document viewer:
The virtualizer is stopped and destroyed.
The items for the previous document are removed from ImageViewer by calling ImageViewer.Items.Clear.
If the new document set is null (the application just closed this document) then no further action is required. If a new document object is set, then the following is performed:
PreferredItemType is checked, and if SVG viewing is requested then IsSvgViewingPreferred is updated accordingly.
An ImageViewerItem is created for each page in the document. The value of ImageViewerItem.ImageSize is set to value of DocumentPage.Size of each page. The item is "empty" and does not contain image data. This is updated in the next step.
An internal worker is used to handler loading and caching the image data of the pages in the background to keep the user interface of the application responsive. This worker is also used to minimize the resources used when loading a document with large image data and large number of pages by prioritizing loading the data for visible pages and discarding the data for pages that are no longer used.
The Operation event occurs while the virtualizer is loading and discarding image data and when rendering the place holder for pages that do not have their data loaded yet. Refer to Document Viewer Operations for more information on the specific details and how to customize the behavior.
DocumentViewerView handles the following:
All the ImageViewerInteractiveMode created by this part. This includes pan, zoom, and magnify glass as well as the page links, annotations and text selection modes.
Multiple ImageViewerViewLayout such as single, vertical, double and horizontal are created and can be used by the view.
Rendering of the image data of the pages as well as the current text selection and annotation containers
Refer to Document Viewer Commands and Document Viewer Operations for more information on the above and how to set and customize the behavior.
Start with the example created in DocumentViewer, remove all the code in the Example function and add the code below.
After the user clicks the Example button, we will draw a label for the page number at the bottom of each page.
using Leadtools;
using Leadtools.Controls;
using Leadtools.Document;
using Leadtools.Document.Viewer;
using Leadtools.Codecs;
using Leadtools.Caching;
using Leadtools.Annotations.Engine;
using Leadtools.Ocr;
// Disable the example button, this should only run once
exampleButton.Enabled = false;
// Get the view
var view = _documentViewer.View;
// Get its image viewer
var imageViewer = view.ImageViewer;
// Hook to the PostRender
imageViewer.PostRenderItem += (sender, e) =>
{
// Get the image viewer item for the page
var item = e.Item;
// Get the current rectangle for the image
var bounds = imageViewer.GetItemViewBounds(item, ImageViewerItemPart.Image, false);
// Build the text we want. The page number is the item index + 1
var pageNumber = imageViewer.Items.IndexOf(item) + 1;
var text = "Page " + pageNumber.ToString();
// Get the image transformation for this item
var transform = imageViewer.GetItemImageTransform(e.Item);
// Apply it to the context
var gstate = e.Context.Save();
using (var matrix = new System.Drawing.Drawing2D.Matrix(
(float)transform.M11,
(float)transform.M12,
(float)transform.M21,
(float)transform.M22,
(float)transform.OffsetX,
(float)transform.OffsetY))
{
e.Context.MultiplyTransform(matrix);
}
// Render the text at the bottom of the bounds
var flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.Bottom;
var rc = new Rectangle((int)bounds.X, (int)bounds.Y, (int)bounds.Width, (int)bounds.Height);
TextRenderer.DrawText(e.Context, text, imageViewer.Font, rc, Color.White, Color.Black, flags);
e.Context.Restore(gstate);
};
// Invalidate so our changes take effect the first time
view.Invalidate();