Rozpoznawanie pisma ręcznego w systemie Windows Server 2008 R2
System Windows Server 2008 R2 obsługuje rozpoznawanie pisma ręcznego po stronie serwera. Rozpoznawanie po stronie serwera umożliwia serwerowi rozpoznawanie zawartości z wprowadzeń pióra na stronach internetowych. Jest to szczególnie przydatne, gdy użytkownicy w sieci będą określać terminy interpretowane przy użyciu słownika niestandardowego. Jeśli na przykład masz aplikację medyczną, która odpytywała bazę danych serwera o nazwiska pacjentów, te nazwiska można dodać do innej bazy danych, która byłaby używana przy wyszukiwaniu za pomocą formularza odręcznego Silverlight.
Konfigurowanie serwera na potrzeby rozpoznawania Server-Side
Aby skonfigurować rozpoznawanie po stronie serwera, należy wykonać następujące kroki.
- Instalowanie usług pisma odręcznego i pisma ręcznego
- Instalowanie obsługi serwera sieci Web (IIS) i serwera aplikacji
- Włącz rolę Desktop Experience
- Uruchom usługę wejściową komputera typu tablet
Instalowanie usług pisma odręcznego i pisma ręcznego
Aby zainstalować usługi atramentu i pisma odręcznego, otwórz Menedżera serwera, klikając ikonę Menedżera serwera z paska szybkiego uruchamiania. Z menu Funkcje kliknij pozycję Dodaj funkcje. Upewnij się, że zaznaczono pole wyboru Usługi atramentu i pisma odręcznego. Na poniższej ilustracji przedstawiono okno dialogowe Wybieranie funkcji z zaznaczonymi Usługi atramentu i pisma odręcznego.
Okno dialogowe Wybieranie funkcji z zaznaczonym polem wyboru usług pisma odręcznego i ręcznego pisma
Obsługa instalacji serwera sieci Web (IIS) i serwera aplikacji
Otwórz Menedżera serwera, tak jak w przypadku pierwszego kroku. Następnie należy dodać role serwer sieci Web (IIS) i serwer aplikacji. W menu Role kliknij pozycję Dodaj role. Zostanie wyświetlony kreator Dodawania ról. Kliknij przycisk Dalej. Upewnij się, że wybrano serwera aplikacji i serwera sieci Web (IIS). Na poniższej ilustracji przedstawiono okno dialogowe Wybierz role serwera z wybranymi rolami: Serwer sieci Web (IIS) i Serwer aplikacji.
Okno dialogowe wyboru ról serwera z zaznaczonymi rolami serwera sieci Web (IIS) i serwera aplikacji
Po wybraniu serwera aplikacji zostanie wyświetlony monit o zainstalowanie platformy ASP.NET. Kliknij przycisk Dodaj wymagane funkcje. Po kliknięciu przycisku Dalejzostanie wyświetlone okno dialogowe z podsumowaniem. Kliknij przycisk Dalej. Okno dialogowe Wybór usług ról powinno być teraz dostępne. Upewnij się, że wybrano serwera sieci Web (IIS). Na poniższej ilustracji przedstawiono okno dialogowe Wybieranie usług ról z włączonym serwerem sieci Web (IIS).
Okno dialogowe Wybór usług ról z włączonym serwerem sieciowym (IIS)
Kliknij przycisk Dalej. Pojawi się okno przeglądowe; ponownie kliknij Dalej. Zostanie wyświetlona strona z opcjami ról dla serwera sieci Web (IIS). Kliknij przycisk Dalej. Na następnej stronie przycisk Zainstaluj stanie się aktywny. Kliknij przycisk Zainstaluj i zainstalujesz obsługę serwera sieci Web (IIS) i serwera aplikacji.
Włącz rolę Desktop Experience
Aby włączyć środowisko pulpitu, kliknij przycisk Start, kliknij przycisk Narzędzia administracyjne, a następnie kliknij przycisk Menedżera serwera . Wybierz pozycję Dodaj usługi, a następnie wybierz usługę Desktop Experience. Na poniższej ilustracji przedstawiono okno dialogowe Wybieranie funkcji z zainstalowanym elementem Środowisko pulpitu.
Okno dialogowe Wybieranie funkcji z wybraną usługą środowiska pulpitu
Kliknij przycisk Dalej, aby zainstalować środowisko pulpitu.
Uruchamianie usługi tabletu
Po zainstalowaniu usługi Środowisko pulpitu w menu Services pojawi się usługa wejściowa komputera typu tablet. Aby uzyskać dostęp do menu usług, kliknij przycisk Start, kliknij Narzędzia administracyjne, a następnie kliknij pozycję Services. Aby uruchomić usługę, kliknij prawym przyciskiem myszy Tablet PC Input Service, a następnie kliknij Uruchom. Na poniższej ilustracji przedstawiono menu usługi Services z uruchomioną usługą Tablet PC Input Service.
Menu Usług
menu usługi z uruchomioną usługą wejściową komputera tabletu
Wykonywanie rozpoznawania Server-Side przy użyciu programu Silverlight
W tej sekcji pokazano, jak utworzyć aplikację internetową, która używa programu Silverlight do przechwytywania danych wejściowych pisma ręcznego. Wykonaj poniższe kroki, aby programować program rozpoznawania w programie Visual Studio 2008.
- Zainstaluj i zaktualizuj program Visual Studio 2008, aby dodać obsługę programu Silverlight.
- Utwórz nowy projekt Silverlight w programie Visual Studio 2008.
- Dodaj niezbędne referencje usług do swojego projektu.
- Utwórz usługę Silverlight WCF na potrzeby rozpoznawania pisma odręcznego.
- Dodaj referencję do usługi do projektu klienta.
- Dodaj klasę InkCollector do projektu InkRecognition.
- Usuwanie bezpiecznych dyrektyw transportu z konfiguracji klienta
Instalowanie i aktualizowanie programu Visual Studio 2008 w celu dodania obsługi programu Silverlight
Przed rozpoczęciem należy wykonać następujące kroki na serwerze z systemem Windows Server 2008 R2.
- Zainstaluj program Visual Studio 2008.
- Zainstaluj Microsoft Visual Studio 2008 z dodatkiem Service Pack 1.
- Zainstaluj Microsoft Silverlight 5 SDK.
Po zainstalowaniu tych aplikacji i aktualizacji możesz utworzyć aplikację internetową rozpoznawania po stronie serwera.
Utwórz nowy projekt internetowy Silverlight w programie Visual Studio 2008
Z menu Plik kliknij pozycję Nowy Projekt. Wybierz szablon aplikacji Silverlight z listy projektów Visual C#. Nadaj projektowi nazwę InkRecognition i kliknij przycisk OK. Na poniższej ilustracji przedstawiono wybrany projekt Silverlight języka C# o nazwie InkRecognition.
wybrany projekt Silverlight C#
Wybrany projekt C# Silverlight o nazwie InkRecognition
Po kliknięciu przycisku OKzostanie wyświetlone okno dialogowe z monitem o dodanie aplikacji Silverlight do projektu. Wybierz pozycję Dodaj nowy projekt sieci Web ASP.NET do rozwiązania do hostowania programu Silverlight i kliknij przycisk OK. Na poniższej ilustracji pokazano, jak skonfigurować przykładowy projekt przed kliknięciem OK.
okno dialogowe z monitem o dodanie aplikacji silverlight do projektu
Dodaj niezbędne odwołania do usług do swojego projektu
Teraz masz ogólny projekt klienta Silverlight (InkRecognition) z projektem webowym (InkRecognition.Web) skonfigurowanym w rozwiązaniu. Projekt otworzy się z plikami Page.xaml i Default.aspx otwartymi. Zamknij te okna i dodaj odwołania System.Runtime.Serialization i System.ServiceModel do projektu InkRecognition, klikając prawym przyciskiem myszy na folderze odwołań w projekcie InkRecognition i wybierając Dodaj odwołanie. Na poniższej ilustracji przedstawiono okno dialogowe z wybranymi wymaganymi odwołaniami.
Okno dialogowe Dodawanie odwołań z wybranym system.runtime.serialization i system.servicemodel
Następnie należy dodać odwołania System.ServiceModel i Microsoft.Ink do projektu InkRecognition.Web. Odwołanie Microsoft.Ink nie pojawi się domyślnie w odwołaniach środowiska .NET, więc przeszukaj folder Windows w poszukiwaniu Microsoft.Ink.dll. Po zlokalizowaniu pliku DLL, dodaj moduł do referencji projektu: wybierz kartę Przeglądaj, przejdź do folderu zawierającego Microsoft.Ink.dll, wybierz plik Microsoft.Ink.dll, a następnie kliknij przycisk OK. Na poniższej ilustracji przedstawiono rozwiązanie projektu w Eksploratorze Windows ze wszystkimi dodanymi zestawami referencyjnymi.
projekt InkRecognition w Eksploratorze Windows ze wszystkimi zestawami referencyjnymi dodanymi
Tworzenie usługi Silverlight WCF na potrzeby rozpoznawania pisma odręcznego
Następnie do projektu zostanie dodana usługa WCF do rozpoznawania pisma odręcznego. Kliknij prawym przyciskiem myszy projekt InkRecognition.Web, kliknij Dodaj, a następnie kliknij Nowy Element. Wybierz szablon usługi Silverlight WCF, zmień nazwę na InkRecogitionService, a następnie kliknij Dodaj. Na poniższej ilustracji przedstawiono okno dialogowe Dodaj nowy element z wybraną i nazwaną usługą Silverlight WCF.
okno dialogowe Dodawanie nowego elementu z wybraną i nazwaną usługą Silverlight WCF
Po dodaniu usługi WCF Silverlight zostanie otwarty kod usługi, InkRecognitionService.cs. Zastąp kod usługi następującym kodem.
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;
namespace InkRecognition.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class InkRecognitionService
{
[OperationContract]
public string[] Recognize(int[][] packets)
{
// Deserialize ink.
Ink ink = new Ink();
Tablet tablet = new Tablets().DefaultTablet;
TabletPropertyDescriptionCollection desc = new TabletPropertyDescriptionCollection();
desc.Add(new TabletPropertyDescription(PacketProperty.X, tablet.GetPropertyMetrics(PacketProperty.X)));
desc.Add(new TabletPropertyDescription(PacketProperty.Y, tablet.GetPropertyMetrics(PacketProperty.Y)));
int numOfStrokes = packets.GetUpperBound(0) + 1;
for (int i = 0; i < numOfStrokes; i++)
{
ink.CreateStroke(packets[i], desc);
}
// Recognize ink.
RecognitionStatus recoStatus;
RecognizerContext recoContext = new RecognizerContext();
recoContext.RecognitionFlags = RecognitionModes.LineMode | RecognitionModes.TopInkBreaksOnly;
recoContext.Strokes = ink.Strokes;
RecognitionResult recoResult = recoContext.Recognize(out recoStatus);
RecognitionAlternates alternates = recoResult.GetAlternatesFromSelection();
string[] results = new string[alternates.Count];
for (int i = 0; i < alternates.Count; i++)
{
results[i] = alternates[i].ToString();
}
// Send results to client.
return results;
}
}
}
Dodaj odwołanie do usługi do projektu klienta
Teraz, gdy masz usługę Silverlight WCF for InkRecognition, będziesz korzystać z usługi z aplikacji klienckiej. Kliknij prawym przyciskiem myszy projekt InkRecognition i wybierz pozycję Dodaj odwołanie do usługi. W wyświetlonym oknie dialogowym Dodaj odwołanie do usługi wybierz pozycję Odkryj, aby odnaleźć usługi z bieżącego rozwiązania. InkRecognitionService pojawi się w okienku Usługi. Kliknij dwukrotnie pozycję InkRecognitionService w okienku Usługi, zmień przestrzeń nazw na InkRecognitionServiceReference, a następnie kliknij przycisk OK. Poniższy obraz pokazuje okno dialogowe Dodaj odwołanie do usługi z wybraną pozycją InkRecognitionService i z zmienioną przestrzenią nazw.
okno dialogowe dodawania odwołania do usługi z wybraną usługą inkrecognitionservice i ze zmienioną przestrzenią nazw
Dodawanie klasy InkCollector do projektu InkRecognition
Kliknij prawym przyciskiem myszy projekt InkRecognition, kliknij Dodaj, a następnie kliknij Nowy element. Z menu Visual C# wybierz klas języka C#. Nadaj klasie nazwę InkCollector. Na poniższej ilustracji przedstawiono okno dialogowe z wybraną klasą języka C# i nazwaną.
Okno dialogowe dodawania nowego elementu z wybraną klasą C# i nazwanej jako
Po dodaniu klasy InkCollector zostanie otwarta definicja klasy. Zastąp kod w kolektorze atramentu następującym kodem.
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace InkRecognition
{
public class InkCollector : IDisposable
{
public InkCollector(InkPresenter presenter)
{
_presenter = presenter;
_presenter.Cursor = Cursors.Stylus;
_presenter.MouseLeftButtonDown += new MouseButtonEventHandler(_presenter_MouseLeftButtonDown);
_presenter.MouseMove += new MouseEventHandler(_presenter_MouseMove);
_presenter.MouseLeftButtonUp += new MouseButtonEventHandler(_presenter_MouseLeftButtonUp);
}
void _presenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_presenter.CaptureMouse();
if (!e.StylusDevice.Inverted)
{
_presenter.Cursor = Cursors.Stylus;
_stroke = new Stroke(e.StylusDevice.GetStylusPoints(_presenter));
_stroke.DrawingAttributes = _drawingAttributes;
_presenter.Strokes.Add(_stroke);
}
else
{
_presenter.Cursor = Cursors.Eraser;
_erasePoints = e.StylusDevice.GetStylusPoints(_presenter);
}
}
void _presenter_MouseMove(object sender, MouseEventArgs e)
{
if (!e.StylusDevice.Inverted)
{
_presenter.Cursor = Cursors.Stylus;
}
else
{
_presenter.Cursor = Cursors.Eraser;
}
if (_stroke != null)
{
_stroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
}
else if (_erasePoints != null)
{
_erasePoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
StrokeCollection hitStrokes = _presenter.Strokes.HitTest(_erasePoints);
if (hitStrokes.Count > 0)
{
foreach (Stroke hitStroke in hitStrokes)
{
_presenter.Strokes.Remove(hitStroke);
}
}
}
}
void _presenter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
_presenter.ReleaseMouseCapture();
if (_stroke != null)
{
_stroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(_presenter));
}
_stroke = null;
_erasePoints = null;
}
public DrawingAttributes DefaultDrawingAttributes
{
get { return _drawingAttributes; }
set { _drawingAttributes = value; }
}
public void Dispose()
{
_presenter.MouseLeftButtonDown -= new MouseButtonEventHandler(_presenter_MouseLeftButtonDown);
_presenter.MouseMove -= new MouseEventHandler(_presenter_MouseMove);
_presenter.MouseLeftButtonUp -= new MouseButtonEventHandler(_presenter_MouseLeftButtonUp);
_presenter = null;
}
private InkPresenter _presenter = null;
private Stroke _stroke = null;
private StylusPointCollection _erasePoints = null;
private DrawingAttributes _drawingAttributes = new DrawingAttributes();
}
}
Zaktualizuj kod XAML dla strony domyślnej i dodaj kod za kulisami dla funkcji rozpoznawania pisma ręcznego
Teraz, gdy masz klasę zbierającą atrament, musisz zaktualizować kod XAML w pliku page.xaml przy użyciu następującego kodu XAML. Poniższy kod dodaje żółty gradient do obszaru wejściowego, kontrolkę InkCanvas i przycisk, który wyzwoli rozpoznawanie.
<UserControl x:Class="InkRecognition.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border Margin="5" Grid.Row="0" BorderThickness="4" BorderBrush="Black" CornerRadius="5" Height="200">
<Grid>
<InkPresenter x:Name="inkCanvas">
<InkPresenter.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="Yellow"/>
<GradientStop Offset="1" Color="LightYellow"/>
</LinearGradientBrush>
</InkPresenter.Background>
</InkPresenter>
<Button Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" Content="Recognize" Click="RecoButton_Click"/>
</Grid>
</Border>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" FontSize="28" Text="Result: "/>
<ComboBox x:Name="results" Grid.Column="1" FontSize="28"/>
</Grid>
</Grid>
</UserControl>
Zastąp kod strony Page.xaml.cs następującym kodem, który doda procedurę obsługi zdarzeń dla przycisku Rozpoznaj.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using InkRecognition.InkRecognitionServiceReference;
namespace InkRecognition
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
inkCol = new InkCollector(inkCanvas);
recoClient = new InkRecognitionServiceClient();
recoClient.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(recoClient_RecognizeCompleted);
}
private void RecoButton_Click(object sender, RoutedEventArgs e)
{
// Serialize the ink into an array on ints.
ObservableCollection<ObservableCollection<int>> packets = new ObservableCollection<ObservableCollection<int>>();
double pixelToHimetricMultiplier = 2540d / 96d;
foreach (Stroke stroke in inkCanvas.Strokes)
{
packets.Add(new ObservableCollection<int>());
int index = inkCanvas.Strokes.IndexOf(stroke);
for (int i = 0; i < stroke.StylusPoints.Count; i += 2)
{
packets[index].Add(Convert.ToInt32(stroke.StylusPoints[i].X * pixelToHimetricMultiplier));
packets[index].Add(Convert.ToInt32(stroke.StylusPoints[i].Y * pixelToHimetricMultiplier));
}
}
// Call the Web service.
recoClient.RecognizeAsync(packets);
}
void recoClient_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
{
// We have received results from the server, now display them.
results.ItemsSource = e.Result;
UpdateLayout();
results.SelectedIndex = 0;
inkCanvas.Strokes.Clear();
}
private InkRecognitionServiceClient recoClient = null;
private InkCollector inkCol = null;
}
}
Usuwanie bezpiecznych dyrektyw transportu z konfiguracji klienta
Przed rozpoczęciem korzystania z usługi WCF należy usunąć wszystkie opcje bezpiecznego transportu z konfiguracji usługi, ponieważ bezpieczne transporty nie są obecnie obsługiwane w usługach Silverlight 2.0 WCF. W projekcie InkRecognition zaktualizuj ustawienia zabezpieczeń w pliku ServiceReferences.ClientConfig. Zmień XML zabezpieczeń z
<security mode="None">
<transport>
<extendedProtectionPolicy policyEnforcement="WhenSupported" />
</transport>
</security>
do
<security mode="None"/>
Teraz aplikacja powinna zostać uruchomiona. Na poniższej ilustracji pokazano, jak aplikacja wygląda na stronie internetowej z odręcznym pismem wprowadzonym w polu rozpoznawania.
Aplikacja w obrębie strony internetowej z odręcznym pismem wprowadzonym do pola rozpoznawania
Na poniższej ilustracji przedstawiono rozpoznany tekst na liście rozwijanej Result.
aplikacja w witrynie internetowej z rozpoznanym tekstem na liście rozwijanej wyników