On 10th March, Xerox announced a Latest Technology (Translation Service) that can Scan a document, Translate it in any language and Print from the Scanner or from Xerox App.
For moment I was wondering how they will make it work, but then I got a feeling that it can be Automated with PowerShell and no need to buy a new Hardware for this feature.
BREAKING THE PROBLEM :
So lets break this problem into steps.
- A Scanned document is an Image, Save it as a file.
- Extract the Text from the Image
- Translate the Text in desired Language.
- Print / Email / Save the Documents
Easy! right? 🙂 at least it looks like from the above points.
HOW TO ACHIEVE IT :
STEP 1 – Use any Tool (Like SnagIt) to capture an Image of the document, you can also use Print Screen and save the capture as an Image. Lets take below screenshot as our sample Image.
STEP 2 – Use Microsoft’s Optical Character Recognition (OCR) API to extract Text from the Image, I’ve created a function for that and you can deep dive into it later.
STEP 3 – We have the Text extracted from Image as set of sentences divided into Lines like in our Sample Image, now it’s time to Feed these sentences to Bing Translation API and get them translated to any desired language.
English to Hindi :
English to German :
You can choose from a Range of Languages in which you want to convert your Image extracted text.
STEP 4 – In previous step we’ve converted the Image text in desired language, now time to Print, Save or Email it.
You can pipe the output to Out-Printer cmdlet and it will get printed. Pipe the results to Set-Content to save it in File.
Or, Convert it to HTML and send as a body in an email. You can also send the File as an Attachment. Like in the below screenshot.
HOW TO RUN IT:
SCRIPT :
Function Get-ImageText() | |
{ | |
[CmdletBinding()] | |
Param( | |
[Parameter(Mandatory=$True,Position=0,ValueFromPipeline=$True)] | |
[String] $Path | |
) | |
Process{ | |
$SplatInput = @{ | |
Uri= "https://api.projectoxford.ai/vision/v1/ocr" | |
Method = 'Post' | |
InFile = $Path | |
ContentType = 'application/octet-stream' | |
} | |
$Headers = @{ | |
'Ocp-Apim-Subscription-Key' = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" | |
} | |
Try{ | |
# Call OCR API and feed the parameters to it. | |
$Data = (Invoke-RestMethod @SplatInput -Headers $Headers -ErrorVariable +E) | |
$Language = $Data.Language # Detected language | |
$i=0; foreach($D in $Data.regions.lines){ | |
$i=$i+1;$s=''; | |
''|select @{n='LineNumber';e={$i}},@{n='LanguageCode';e={$Language}},@{n='Sentence';e={$D.words.text |%{$s=$s+"$_ "};$s}}} | |
} | |
Catch{ | |
"Something went wrong While extracting Text from Image, please try running the script again`nError Message : "+$E.Message | |
} | |
} | |
} | |
Function Translate-text() | |
{ | |
[CmdletBinding()] | |
Param( | |
[Parameter(Mandatory=$True,Position=0,ValueFromPipeline=$True)] | |
[String] $Text, | |
[String] [validateSet('Arabic','Hindi','Japanese','Russian','Spanish','French',` | |
'English','Korean','Urdu','Italian','Portuguese','German','Chinese Simplified') | |
]$From, | |
[String] [validateSet('Arabic','Hindi','Japanese','Russian','Spanish','French',` | |
'English','Korean','Urdu','Italian','Portuguese','German','Chinese Simplified') | |
]$To | |
) | |
Begin{ | |
# Language codes hastable | |
$LangCodes = @{'Arabic'='ar' | |
'Chinese Simplified'='zh-CHS' | |
'English'='en' | |
'French'='fr' | |
'German'='de' | |
'Hindi'='hi' | |
'Italian'='it' | |
'Japanese'='ja' | |
'Korean'='ko' | |
'Portuguese'='pt' | |
'Russian'='ru' | |
'Spanish'='es' | |
'Urdu'='ur' | |
} | |
# Secret Client ID and Key you get after Subscription | |
$ClientID = 'XXXXXXXXXXXXXXXXXXXX' | |
$client_Secret = ‘XXXXXXXXXXXXXXXXXXXX' | |
# If ClientId or Client_Secret has special characters, UrlEncode before sending request | |
$clientIDEncoded = [System.Web.HttpUtility]::UrlEncode($ClientID) | |
$client_SecretEncoded = [System.Web.HttpUtility]::UrlEncode($client_Secret) | |
} | |
Process{ | |
ForEach($T in $Text) | |
{ | |
Try{ | |
# Azure Data Market URL which provide access tokens | |
$URI = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13" | |
# Body and Content Type of the request | |
$Body = "grant_type=client_credentials&client_id=$clientIDEncoded&client_secret=$client_SecretEncoded&scope=http://api.microsofttranslator.com" | |
$ContentType = "application/x-www-form-urlencoded" | |
# Invoke REST method to Azure URI | |
$Access_Token=Invoke-RestMethod -Uri $Uri -Body $Body -ContentType $ContentType -Method Post | |
# Header value with the access_token just recieved | |
$Header = "Bearer " + $Access_Token.access_token | |
# Invoke REST request to Microsoft Translator Service | |
[string] $EncodedText = [System.Web.HttpUtility]::UrlEncode($T) | |
[string] $uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + $EncodedText + "&from=" + $LangCodes.Item($From) + "&to=" + $LangCodes.Item($To); | |
$Result = Invoke-RestMethod -Uri $URI -Headers @{Authorization = $Header} -ErrorVariable Error | |
Return $Result.string.'#text' | |
} | |
catch | |
{ | |
"Something went wrong While Translating Text, please try running the script again`nError Message : "+$Error.Message | |
} | |
} | |
} | |
} |
PLEASE NOTE :
You would need Subscription key for Microsoft optical Recognition API and ClientID and Client_secret for Microsoft Bing Translation API, please follow below links to get an idea how to obtain these keys.
Microsoft OCR API
Microsoft Translator Services
Thank you for stopping by, have a nice weekend.
Prateek Singh
Related posts
6 Comments
Leave a Reply to How to Extract Text From Images (OCR)Cancel reply
Categories
Author of Books
Awards
Open Sourced Projects
Author at
Blog Roll
Mike F RobbinsDamien Van Robaeys
Stéphane van Gulick
Kevin Marquette
Adam Bertram
Stephanos Constantinou
Francois-Xavier Cat
Ravikanth Chaganti
Roman Levchenko
Blog Stats
- 1,133,181 People Reached
Hi Prateek,
How do I get the Get-image cmdlet in powershell. I have version 5.0 , which is running on 2008 R2 server.
Sorry I couldn’t get your question. Please follow the url to my GitHUb gist to get the code, copy-paste in powershell window. just make sure your server is connected to internet as the script use a web REST API.
[…] my previous post we mimicked the latest Technology of Xerox using Powershell to Extract Text from an Locally saved […]
Keep working ,impressive job!
[…] Here are the full instructions for using Get-ImageText. […]
[…] Here are the full instructions for using Get-ImageText[20]. […]