I'm creating a WebService with some services that use FlexiCapture Engine 11.
Since multiple users will be making requests at the same time, then I needed to create a processors pool.
I followed the documentation and am using the OutprocLoader() method.
The problem is that when I run the following code I have an exception on the third line with the GetPicure() method.
IImageDocument imageDoc = document.Pages[0].ReadOnlyImage; IImage pageBWImage = imageDoc.BlackWhiteImage; IHandle hBitmap = pageBWImage.GetPicture(null, 0); System.Drawing.Image preprocessedImage = System.Drawing.Image.FromHbitmap(hBitmap.Handle); hBitmap.CloseHandle();
Bad variable type. (Exception from HRESULT: 0x80020008 (DISP_E_BADVARTYPE))
How to solve this?
How can I get my image in memory?
Does this link say it's impossible on FineReader Engine, but and in FlexiCpture Engine?
Comments
6 comments
As we discussed by email, you can use WriteToFile() method of the Image Object instead of GetPicure() method to get an image in the FlexiCapture Engine 11 because GetPicture() method does not work if the Engine object is created using the OutprocLoader object.
Many thanks for the response Diana Khammatova.
It was very nice to receive your help in locating the same statement in the documentation.
But I would very much like to know more about the reasons for this statement.
I have enumerate each question to facilitate the answer.
1. We are consulting with our developers about this question at the moment.
2. As you probably know to create the FlexiCaptureProcessor object, you need to use the CreateFlexiCaptureProcessor method of the Engine object. There are three ways to load the Engine object. The OutprocLoader object is more suitable for server solutions. The other methods are more suitable for using in interactive applications which are not intended for simultaneous processing. Please find the comparison table of the three loading methods in the Help → Guided Tour → Advanced Techniques → Programming Aspects → Different Ways to Load Engine.
3. Parallel running processes are possible for OutprocLoader object only.
4. According to the comparison table you can also use InprocLoader object to work in multi-threaded applications.
5. The workaround is to use the other ways of loading Engine, but you should remember that the most optimal method of loading the Engine into a server application is to load it by means of COM into a separate process as an out-of-process server.
In addition to the above, we would like to recommend you the article on how to use ABBYY FlexiCapture Engine in multi-threaded server applications, you can find it in the Help →Guided Tour →Advanced Techniques → Programming Aspects → Using ABBYY FlexiCapture Engine in Multi-Threaded Server Applications.
As for the first question, there are no plans to implement the feature right now but we passed your wish to our analysts. As we have already mentioned, it's not possible to use GetPicture() method when the Engine object is created via the OutprocLoader object so we recommend you to use WriteToFile() method instead of it.
I'm having trouble using often the WriteToFile() method, because process files in more than one Thread at the same time. This has overwhelmed and left the process slow. Isn't there some way I could create a custom solution?
Unfortunately, when working in multithreaded application using WriteToFile is the only option.
Please sign in to leave a comment.