Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Create Custom Form Recognizer script
param(
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $ResourceGroup = $null,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $ResourceLocation = 'EastUS',
# F0 is free and S0 is paid SKU
[Parameter()]
[ValidateSet('F0','S0')]
[ValidateNotNullOrEmpty()]
[string] $FormRecognizerSku = 'F0',
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $FormRecognizerName = 'FormRecognizer',
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $StorageAccountName = 'formstorageaccountname',
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $StorageBlobName = 'forms',
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $StorageAccountSasExpiry = '2022-01-01T00:00Z',
[Parameter()]
[bool] $ClearCors = $true,
[Parameter()]
[ValidateSet('Docker', 'GitHub', 'Web', 'None', '')]
[ValidateNotNullOrEmpty()]
[string] $InstallationType = 'Web'
)
[Console]::ResetColor()
# Check if everything is installed and let user know what to install/configure.
$useToolFromDocker = $InstallationType -eq "Docker";
$useToolFromGitHub = $InstallationType -eq "GitHub";
$useWeb = -not $useToolFromDocker -and -not $useToolFromGitHub
Write-Host "Generate Azure resources required for Custom Form Recognizer"
Write-Host ""
Write-Host "Parameter:"
Write-Host "ResourceGroup : " -NoNewline
Write-Host $ResourceGroup -ForegroundColor DarkGray
Write-Host "ResourceLocation : " -NoNewline
Write-Host $ResourceLocation -ForegroundColor DarkGray
Write-Host "FormRecognizerSku : " -NoNewline
Write-Host $FormRecognizerSku -ForegroundColor DarkGray
Write-Host "FormRecognizerName : " -NoNewline
Write-Host $FormRecognizerName -ForegroundColor DarkGray
Write-Host "StorageAccountName : " -NoNewline
Write-Host $StorageAccountName -ForegroundColor DarkGray
Write-Host "StorageBlobName : " -NoNewline
Write-Host $StorageBlobName -ForegroundColor DarkGray
Write-Host "StorageAccountSasExpiry : " -NoNewline
Write-Host $StorageAccountSasExpiry -ForegroundColor DarkGray
Write-Host "ClearCors : " -NoNewline
Write-Host $ClearCors -ForegroundColor DarkGray
Write-Host "InstallationType : " -NoNewline
Write-Host $InstallationType -ForegroundColor DarkGray
Write-Host "UseDocker : " -NoNewline
Write-Host $useToolFromDocker -ForegroundColor DarkGray
Write-Host "UseGitHub : " -NoNewline
Write-Host $useToolFromGitHub -ForegroundColor DarkGray
Write-Host "UseWeb : " -NoNewline
Write-Host $useWeb -ForegroundColor DarkGray
Write-Host ""
Write-Host ""
If ($null -eq $ResourceGroup -or "" -eq $ResourceGroup) {
Write-Warning "Arguments not configured."
Write-Host "Example:"
Write-Host ".\create-custom-form-recognizer.ps1 -FormRecognizerName poc-forms -StorageAccountName pocformsprotostorage -ResourceGroup PoC -StorageAccountSasExpiry ""2021-01-01T00:00Z""" -ForegroundColor DarkGray
Write-Host ""
exit
}
Write-Host "Checking if Azure CLI and Docker is installed..."
$wingetExists = Get-Command winget -erroraction 'silentlycontinue'
$isReady = $true
$azCommandExists = Get-Command az -erroraction 'silentlycontinue'
If ($null -eq $azCommandExists -or $azCommandExists.Count -eq 0) {
Write-Host ""
Write-Host "Azure CLI needs to be installed and accessible to PowerShell" -ForegroundColor Red
Write-Host "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest" -ForegroundColor DarkGray
if ($null -ne $wingetExists -or $wingetExists.Count -eq 0) {
Write-Host ""
Write-Host "Or install it via winget:"
Write-Host "winget install Microsoft.AzureCLI" -ForegroundColor DarkGray
}
Write-Host ""
$isReady = $false
}
If ($useToolFromDocker) {
$dockerCommandExists = Get-Command docker -erroraction 'silentlycontinue'
If ($null -eq $dockerCommandExists -or $dockerCommandExists.Count -eq 0) {
Write-Host ""
Write-Host "Docker needs to be installed and accessible to PowerShell" -ForegroundColor Red
Write-Host "https://www.docker.com/" -ForegroundColor DarkGray
if ($null -ne $wingetExists -or $wingetExists.Count -eq 0) {
Write-Host ""
Write-Host "Or install it via winget:"
Write-Host "winget install Microsoft.DockerDesktop" -ForegroundColor DarkGray
}
Write-Host ""
$isReady = $false
}
}
If ($useToolFromGitHub) {
$gitCommandExists = Get-Command git -erroraction 'silentlycontinue'
If ($null -eq $gitCommandExists -or $gitCommandExists.Count -eq 0) {
Write-Host ""
Write-Host "Git for Windows needs to be installed and accessible to PowerShell" -ForegroundColor Red
Write-Host "https://git-scm.com/download/win" -ForegroundColor DarkGray
if ($null -ne $wingetExists -or $wingetExists.Count -eq 0) {
Write-Host ""
Write-Host "Or install it via winget:"
Write-Host "winget install git" -ForegroundColor DarkGray
}
Write-Host ""
$isReady = $false
}
}
Write-Host "Checking Azure CLI subscription..."
$currentAzAccountName = az account show --query name --output tsv
If ($null -eq $currentAzAccountName) {
Write-Host ""
Write-Host "Authenticate and set an Azure Subscription" -ForegroundColor Red
Write-Host "az login" -ForegroundColor DarkGray
Write-Host "Authentincate in the browser"
Write-Host "az account set -s <subscription-id>" -ForegroundColor DarkGray
Write-Host ""
$isReady = $false
}
If ($isReady -eq $false) {
Write-Error "One or more errors found."
[Console]::ResetColor()
exit
}
# Create or get blob storage account
$blobStorageExists = az resource list --name $StorageAccountName
if ($null -eq $blobStorageExists -or $blobStorageExists -eq "[]") {
Write-Host "Creating $StorageAccountName Azure Storage Account..."
$primaryBlobUrl = az storage account create --name $StorageAccountName --resource-group $ResourceGroup --access-tier Cool --kind StorageV2 --sku Standard_LRS --query "primaryEndpoints.blob" --output tsv
} else {
Write-Host "Get $StorageAccountName Azure Storage Account..."
$primaryBlobUrl = az storage account show --name $StorageAccountName --resource-group $ResourceGroup --query "primaryEndpoints.blob" --output tsv
}
if ($null -eq $primaryBlobUrl) {
Write-Error "Unable to create Storage Account with Blob Storage."
[Console]::ResetColor()
exit
}
$connectionString = az storage account show-connection-string --name $StorageAccountName --key primary --query connectionString
Write-Host "Creating $StorageBlobName Blob Container..."
az storage container create --name $StorageBlobName --connection-string $connectionString$connectionString > nil
Write-Host "Configuring $StorageAccountName Azure Storage Account and $StorageBlobName Blob Container for custom Form Recognizer..."
# Configure blob container and get SAS key
If ($ClearCors -eq $true) {
Write-Host "Clearing $StorageAccountName CORS..."
az storage cors clear --services b --connection-string $connectionString
}
az storage cors add --methods DELETE, GET, HEAD, MERGE, OPTIONS, POST, PUT --origins * --services b --allowed-headers * --max-age 200 --exposed-headers * --connection-string $connectionString > nil
$sas = az storage container generate-sas --account-name $StorageAccountName --name $StorageBlobName --permissions dlrw --start 2020-01-01T00:00Z --expiry $StorageAccountSasExpiry --connection-string $connectionString --output tsv
# Create or update Form Recognizer and
$formsExists = az resource list --name $FormRecognizerName
if ($null -eq $formsExists -or $formsExists -eq "[]") {
Write-Host "Creating $FormRecognizerName Form Recognizer with $FormRecognizerSku SKU..."
$endpoint = az cognitiveservices account create --kind FormRecognizer --location $ResourceLocation --name $FormRecognizerName --resource-group $ResourceGroup --sku $FormRecognizerSku --yes --query endpoint --output tsv
} else {
Write-Host "Updating $FormRecognizerName Form Recognizer with $FormRecognizerSku SKU..."
$endpoint = az cognitiveservices account show --name $FormRecognizerName --resource-group $ResourceGroup --query endpoint --output tsv
$_ = az cognitiveservices account update --name $FormRecognizerName --resource-group $ResourceGroup --sku $FormRecognizerSku
}
$key1 = az cognitiveservices account keys list --name $FormRecognizerName --resource-group $ResourceGroup --query key1 --output tsv
Write-Host "Downloading Docker image tool for custom labeling..."
Write-Host ""
# Download necessary Docker image for custom form labeling.
If ($useToolFromDocker) {
docker pull mcr.microsoft.com/azure-cognitive-services/custom-form/labeltool
} ElseIf ($useToolFromGitHub) {
git clone https://github.com/Microsoft/OCR-Form-Tools.git
cd OCR-Form-Tools
npm install
npm run build
cd ..
}
[Console]::ResetColor()
Write-Host ""
Write-Host ""
Write-Host "Next steps:"
Write-Host "1. " -NoNewline -ForegroundColor DarkCyan
Write-Host "Download and install Azure Storage Explorer to upload your forms to Azure Blob Storage."
Write-Host "https://azure.microsoft.com/en-au/features/storage-explorer/" -ForegroundColor DarkGray
if ($null -ne $wingetExists -or $wingetExists.Count -eq 0) {
Write-Host ""
Write-Host "Or install it via winget:"
Write-Host "winget install Microsoft.AzureStorageExplorer" -ForegroundColor DarkGray
}
Write-Host ""
Write-Host "2. " -NoNewline -ForegroundColor DarkCyan
Write-Host "Upload images of forms to Blob Container"
Write-Host "$currentAzAccountName\Storage Accounts\$StorageAccountName\$StorageBlobName" -ForegroundColor DarkGray
Write-Host ""
$stepNumber = 3;
$toolUrl = '';
If ($useToolFromDocker) {
Write-Host "3. " -NoNewline -ForegroundColor DarkCyan
Write-Host "Run following command to start custom form labeling tool"
Write-Host "docker run -it -p 30000:80 mcr.microsoft.com/azure-cognitive-services/custom-form/labeltool eula=accept" -ForegroundColor DarkGray
Write-Host ""
$toolUrl = 'http://localhost:30000';
$stepNumber += 1;
} ElseIf ($useToolFromGitHub) {
Write-Host "3. " -NoNewline -ForegroundColor DarkCyan
Write-Host "In separate terminal, run following command to start custom form labeling tool"
Write-Host "npm run react-start" -ForegroundColor DarkGray
Write-Host ""
$toolUrl = 'http://localhost:3000';
$stepNumber += 1;
} Else {
$toolUrl = 'https://fott.azurewebsites.net/';
}
Write-Host "${stepNumber}. " -NoNewline -ForegroundColor DarkCyan
Write-Host "In browser open"
Write-Host $toolUrl -ForegroundColor DarkGray
Write-Host ""
$stepNumber += 1;
Write-Host "${stepNumber}. " -NoNewline -ForegroundColor DarkCyan
Write-Host "Create new project and use following details."
Write-Host "Blob Storage SAS URI : " -NoNewline
Write-Host $primaryBlobUrl -NoNewline -ForegroundColor DarkGray
Write-Host $StorageBlobName -NoNewline -ForegroundColor DarkGray
Write-Host "?$sas" -ForegroundColor DarkGray
Write-Host "Folder path : " -NoNewline
Write-Host "/" -ForegroundColor DarkGray
Write-Host "Form Recognizer service URI : " -NoNewline
Write-Host $endpoint -ForegroundColor DarkGray
Write-Host "Form Recognizer API key : " -NoNewline
Write-Host $key1 -ForegroundColor DarkGray
Write-Host ""
Write-Host ""
Write-Host "Original instructions at " -NoNewline
Write-Host "https://jkdev.me/getting-started-with-form-recognizer/" -ForegroundColor DarkGray
Write-Host ""
@arafattehsin

This comment has been minimized.

Copy link

@arafattehsin arafattehsin commented Jul 8, 2020

This is FANTASTIC! Thank you for this @jernejk

@s3c-rsolar

This comment has been minimized.

Copy link

@s3c-rsolar s3c-rsolar commented Aug 29, 2020

cool

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.