The Syncfusion .NET MAUI library is used to create, read, and edit PDF documents. This repository contains the example of .NET MAUI OCR scanner application to scan images using OCR scanner and convert them to PDF document with searchable text using the Syncfusion OCR library.
Download this project to a location in your disk. Then open the solution file using Visual Studio.
Rebuild the solution to install the required NuGet package.
In this application, we get images from the user in the following ways:
- Open the camera and capture images such as receipts, notes, documents, photos, and business cards.
- Select images from the device's photo gallery.
Open camera and capture image
Add a button in the UI to open the camera.
<Button x:Name="CameraBtn"
Text="Open Camera"
Clicked="OnCameraClicked"
HorizontalOptions="Center" />
Use the MAUI MediaPicker API to open and capture images using the camera. The MediaPicker API needs permission to access the camera and internal storage. Refer to the get started section of the API documentation to set the permissions.
Call the CapturePhotoAsync method to open the camera and capture the image. Refer to the following code example which is implemented in in MainPage.xaml.cs file.
private void OnCameraClicked(object sender, EventArgs e)
{
TakePhoto();
}
//Open camera and take photo
public async void TakePhoto()
{
if (MediaPicker.Default.IsCaptureSupported)
{
FileResult photo = await MediaPicker.Default.CapturePhotoAsync();
if (photo != null)
{
// Save the file into local storage.
string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
//Reduce the size of the image.
using Stream sourceStream = await photo.OpenReadAsync();
using SKBitmap sourceBitmap=SKBitmap.Decode(sourceStream);
int height = Math.Min(794, sourceBitmap.Height);
int width = Math.Min(794, sourceBitmap.Width);
using SKBitmap scaledBitmap = sourceBitmap.Resize(new SKImageInfo(width, height),SKFilterQuality.Medium);
using SKImage scaledImage = SKImage.FromBitmap(scaledBitmap);
using (SKData data = scaledImage.Encode())
{
File.WriteAllBytes(localFilePath, data.ToArray());
}
//Create model and add to the collection
ImageModel model = new ImageModel() { ImagePath = localFilePath, Title = "sample", Description = "Cool" };
viewModel.Items.Add(model);
}
}
}
Select an image from the gallery
Add a button in the UI to select an image.
<Button
x:Name="CounterBtn"
Text="Select Image"
Clicked="OnCounterClicked"
HorizontalOptions="Center" />
Use the MAUI MediaPicker API to select images from the device's photo gallery. Use the PickPhotoAsync method to select images from the gallery. Refer to the following code example which is implemented in in MainPage.xaml.cs file.
private void OnCounterClicked(object sender, EventArgs e)
{
PickPhoto();
}
//Select images from gallery.
public async void PickPhoto()
{
if (MediaPicker.Default.IsCaptureSupported)
{
FileResult photo = await MediaPicker.Default.PickPhotoAsync();
if (photo != null)
{
// Save the file into local storage.
string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
using Stream sourceStream = await photo.OpenReadAsync();
using FileStream localFileStream = File.OpenWrite(localFilePath);
await sourceStream.CopyToAsync(localFileStream);
ImageModel model = new ImageModel() { ImagePath = localFilePath, Title = "sample", Description = "Cool" };
viewModel.Items.Add(model);
}
}
}
Finally, convert the image to PDF with OCR, so our simple UI looks like the following picture.
Refer to the MainPage.xaml file on GitHub for the complete UI.
Here, we use the Syncfusion OCR library with the external Azure OCR engine to convert images to PDF. Refer to the following code example which is implemented in MainPage.xaml.cs file.
N> Please refer to this article to configure and use the Azure Computer Vision OCR services. We have already created a class named AzureOcrEngine.cs to process images. You can use this class as it is in your project without any changes. You just need to add your subscription key and endpoint in the code.
public void ConvertToPDF()
{
Task.Run(async () =>
{
PdfDocument finalDcoument = new PdfDocument();
if (viewModel.Items.Count == 0)
return;
using (OCRProcessor processor = new OCRProcessor())
{
processor.ExternalEngine = new AzureOcrEngine();
foreach (var item in viewModel.Items)
{
FileStream imageStream = new FileStream(item.ImagePath,FileMode.Open);
PdfDocument document = processor.PerformOCR(imageStream);
MemoryStream saveStream = new MemoryStream();
document.Save(saveStream);
document.Close(true);
PdfDocument.Merge(finalDcoument,saveStream);
}
}
MemoryStream fileSave = new MemoryStream();
finalDcoument.Save(fileSave);
fileSave.Position = 0;
finalDcoument.Close(true);
Dispatcher.Dispatch(() =>
{
popup.Close();
SaveService service = new SaveService();
service.SaveAndView("Output.pdf", "application/pdf", fileSave);
});
});
}
After executing the above code, you will get the following output.
To save the PDF document to external storage, add the platform-specific service classes. Refer to the respective classes in the following links:
- Product page: Syncfusion PDF Framework
- Documentation page: Syncfusion .NET PDF library
- Online demo: Syncfusion .NET PDF library - Online demos
- Blog: Syncfusion .NET PDF library - Blog
- Knowledge Base: Syncfusion .NET PDF library - Knowledge Base
- EBooks: Syncfusion .NET PDF library - EBooks
- FAQ: Syncfusion .NET PDF library - FAQ
- For any other queries, reach our Syncfusion support team or post the queries through the community forums.
- Request new feature through Syncfusion feedback portal.
This is a commercial product and requires a paid license for possession or use. Syncfusion’s licensed software, including this component, is subject to the terms and conditions of Syncfusion's EULA. You can purchase a licnense here or start a free 30-day trial here.
Founded in 2001 and headquartered in Research Triangle Park, N.C., Syncfusion has more than 26,000+ customers and more than 1 million users, including large financial institutions, Fortune 500 companies, and global IT consultancies.
Today, we provide 1600+ components and frameworks for web (Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET WebForms, JavaScript, Angular, React, Vue, and Flutter), mobile (Xamarin, Flutter, UWP, and JavaScript), and desktop development (WinForms, WPF, WinUI(Preview), Flutter and UWP). We provide ready-to-deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.