[jawsscripts] Re: OCRSnapObject Failing!

  • From: Soronel Haetir <soronel.haetir@xxxxxxxxx>
  • To: jawsscripts@xxxxxxxxxxxxx
  • Date: Sat, 30 Jan 2010 19:01:10 -0900

The VB Dim bit isn't going to work in JAWS since it only has the 4
basic types, the bit from Homer JAX looks good though and is what I
would expect to do.  For this style of object programming (known as
Automation in Windows circles) the executable file path doesn't really
matter.

For the CreateObjectEx to succeed the binary will still need to have
been registered.

There are two registration concepts at play here, the first is
registration of the executable (this is done via regsvr32 or in the
case of some applications a command line switch) and is done
beforehand and only needed once. The second is registering running
objects, which is done via function calls at run time. and needed
every time the program starts.  This second type of registration is
what GetObject looks at.  Either way, getting or creating, the first
type of registration needs to have occurred for JAWS scripting to be
able to use exposed objects.

If you have a more specific question I must not have noticed it.

On 1/30/10, Donald Marang <donald.marang@xxxxxxxxx> wrote:
> I think I have the basic structure and JAWS Script statements I thought
> should work.  Unfortunately it returns nothing!  How do you know if the
> CreateObject function returns the expected object?  I attempt to retrieve
> the number of images (pages), I would expect a value of one, but nothing is
> returned.  Could someone familiar with objects in JAWS look to see if I made
> a dumb mistake?
> I included a copy of a Visual Basic routine to OCR an image file and writes
> the plain text to a file.  I simplified this as I converted it to JAWS
> script code.  I would think a screenshot image would only be one page.
>
> Following the example is my script.  Some of the necessary lines are
> commented out until I ensure the active code is working.  I also attempted
> to use my constant, MODI_DLL_PATH, directly in the CreateObject statements.
> Both with single '\' and double '\\' characters.  Doing so caused all three
> statements to fail.
>
> --- Start of example
> Example from Wikipedia and MSDN for "MODI OCR" in Visual Basic .NET
> </wiki/Visual_Basic_.NET> follows:
> You can program the MODI object model from any development tool that
> supports
> the Component Object Model (COM) by setting a reference to the Microsoft
> Office
> Document Imaging 11.0 (Office 2003) (or 12.0, which is Office 2007,  I saw
> somewhere else) Type Library.
>
> Dim inputFile As String = "C:\test\multipage.tif"
> Dim strRecText As String = ""
> Dim Doc1 As MODI.Document
>
> Doc1 = New MODI.Document
> Doc1.Create(inputFile)
> Doc1.OCR()  ' this will ocr all pages of a multi-page tiff file
> Doc1.Save() ' this will save the deskewed reoriented images, and the OCR
> text, back to the inputFile
>
> For imageCounter As Integer = 0 To (Doc1.Images.Count - 1) ' work your way
> through each page of results
>     strRecText &= Doc1.Images(imageCounter).Layout.Text    ' this puts the
> ocr results into a string
> Next
>
> File.AppendAllText("C:\test\testmodi.txt", strRecText)     ' write the OCR
> file out to disk
>
> Doc1.Close() ' clean up
> Doc1 = Nothing
> --- End of example
> Include "hjconst.jsh"
>
> Const
>  CRLF = "\13\10", ; Cariage return followed by line feed character
>  SCREEN_CAPTURE_FILE = "ScreenCapture.tif", ; Temp file placed in the JAWS
> user settings directory
>  NIRCMD = "nircmd.exe", ; Command Line Utility from:
> http://www.nirsoft.net/utils/nircmd.html
>  IMAGE_OCR = "MSPVIEW.EXE -o ",
>  IMAGE_READ = "MSPVIEW.EXE -r ",
>  ; Microsoft Office Document Imaging Viewer Control 11.0 or 12.0
> (MDIVWCTL.DLL)
>  MODI_DLL_PATH = "\"C:\\Program Files\\Common Files\\Microsoft
> Shared\\MOD\\MDIVWCTL.DLL\""
>
> Script OCRSnapshotObject ()
> Var
>  String sImageFile,
>  String sCmdUtility,
>  String sExecute,
>  Object oNull,
>  Object oDoc,
>  Object oAllImages,
>  Object oImage,
>  Object oLayout,
>  Int iCount,
>  Int iChars,
>  Int iWords,
>  String sText
>
> ; Close virtual buffer if open
> If UserBufferIsActive () Then
>  UserBufferDeactivate ()
> EndIf
> ; Set temporary image filename
> Let sImageFile = GetJAWSSettingsDirectory () + "\\" + SCREEN_CAPTURE_FILE
> Let sImageFile = "\"" + sImageFile  + "\"" ; Enclose in quotes in case there
> is a space in the path
> ; Set Command Line Utility path
> Let sCmdUtility = GetJAWSSettingsDirectory () + "\\" + NIRCMD
> Let sCmdUtility = "\"" + sCmdUtility + "\"" ; Enclose in quotes in case
> there is a space in the path
> ; Capture image of foreground active window
> Let sExecute = sCmdUtility + " savescreenshotwin " + sImageFile
> ; SayString ("Will perform save screenshot to file = \"" + sExecute + "\"")
> Run (sExecute)
> SayMessage (OT_MESSAGE, "Screen image has been captured.  Please wait for
> OCR conversion.")
> Delay (10) ; make sure the file is not in use
>
> ; Run Microsoft Office Document Imageing Object Model to perform OCR
> ; Not sure how to create / open / register ovject as performed by Visual.Net
> Basic in the nnext two lines
> ; Dim Doc1 As MODI.Document
> ; Let oDoc = New MODI.Document
>
> ; Method used in Homer Jax
> Let oDoc = CreateObjectEx ("MODI.Document", False)
> If ! oDoc Then
>  SayMessage (OT_ERROR, "Could not create object using first call!")
>  Let oDoc = CreateObject ("MODI.Document")
> EndIf
> If ! oDoc Then
>  SayMessage (OT_ERROR, "Could not create objectusing second call!")
>  ; Running out of possibilities, try the last variety
>  Let oDoc = CreateObjectEx ("MODI.Document", True)
> EndIf
> If ! oDoc Then
>  SayMessage (OT_ERROR, "Could not create objectusing third call!")
>     Return oNull
> EndIf
> SayString ("Document object created!")
> oDoc.Create(sImageFile) ; loads the image into the object
> ; SayString ("Image file =" + sImageFile)
> Let oAllImages = oDoc.Images
> Let iCount = oAllImages.Count
> SayString ("pages in file = " + IntToString (iCount))
> ; oDoc.OCR() ; this will ocr all pages of a multi-page tiff file
> ; oDoc.Save() ; this will save the deskewed reoriented images, and the OCR
> text, back to the inputFile
> ; Let oImage = oDoc.Images(0) ; first page of possible multi-page image
> SayString ("OCR complete!")
> ; Let oLayout = oImage.Layout ; OCR information
> ; Let sText = oLayout.Text ; this puts the ocr results into a string
> SayString ("text = \"" + sText + "\"")
> ; Let iChars = oLayout.NumChars
> ; Let iWords = oLayout.NumWords
> SayMessage (OT_MESSAGE, "Screen image has been converted to text.")
> SayMessage (OT_MESSAGE, "Converted " + IntToString (iChars) + " characters,
> and " + IntToString (iWords) + " words")
>
> ; View converted text
> SayMessage (OT_USER_BUFFER  , sText + CRLF + "Press Escape to close this
> message.")
> oDoc.Close() ; Clean up
> Let oLayout = oNull
> Let oImage =oNull
> Let oAllImages = oNull
> Let oDoc =oNull
> EndScript
>
> Don Marang
> __________
> Visit and contribute to The JAWS Script Repository http://jawsscripts.com
>
> View the list's information and change your settings at
> //www.freelists.org/list/jawsscripts
>
>


-- 
Soronel Haetir
soronel.haetir@xxxxxxxxx
__________ 
Visit and contribute to The JAWS Script Repository http://jawsscripts.com

View the list's information and change your settings at 
//www.freelists.org/list/jawsscripts

Other related posts: