Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
How to access VisionKit?
-
Have you checked
supported
? -
@JonB I tried but does not exist in dir(VNDocumentCameraViewController).
And the process seems to be realized, you receive the camera, take a photo, system aligns a frame, you tap save ..... and the viewcontroller closes but does not call the didfinish -
-
@mikael @JonB strange, on my iPad mini 4, three different prints and their results
print('VNDocumentCameraViewController.isSupported') print(VNDocumentCameraViewController.isSupported) print() print('dir(VNDocumentCameraViewController.isSupported)') print(dir(VNDocumentCameraViewController.isSupported)) print() print('VNDocumentCameraViewController.isSupported()') print(VNDocumentCameraViewController.isSupported()) ''' VNDocumentCameraViewController.isSupported <objc_util.ObjCInstanceMethodProxy object at 0x113ca84e0> dir(VNDocumentCameraViewController.isSupported) ['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'method_cache', 'name', 'obj'] VNDocumentCameraViewController.isSupported() Traceback (most recent call last): File "_ctypes/callbacks.c", line 234, in 'calling callback function' File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1066, in OMMainThreadDispatcher_invoke_imp retval = func(*args, **kwargs) File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/VNDocumentCameraViewController.py", line 37, in main print(VNDocumentCameraViewController.isSupported()) File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 798, in __call__ method_name, kwarg_order = resolve_instance_method(obj, self.name, args, kwargs) File "/var/containers/Bundle/Application/34BAEE1A-BC33-4D6F-A0C1-B733E4991F31/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 405, in resolve_instance_method raise AttributeError('No method found for %s' % (name,)) AttributeError: No method found for isSupported '''
-
-
I bet the function name is wrong, or the arguments are wrong.
Shouldn't it be
documentCameraViewController_didFinishWithScan_
?You could also swizzle respondsToSelector on your delegate, and log what gets queried.
Have you checked what the protocol -
-
@JonB said:
documentCameraViewController_didFinishWithScan_
You're right. I sincerely don't understand how I could do so big mistake.
Thanks, I'll tryÉdit: save button does not close the view
-
The delegate is called but the view is not closed as I though thus I have proven by writing in a file. And restart Pythonista because I could not close the view.
def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan): with open('a.txt',mode='wt') as fil: fil.write('documentCameraViewController_didFinishWithScan_') print('documentCameraViewController_didFinishWithScan_') VNDocumentViewController = ObjCInstance(_controller) scan = ObjCInstance(_scan) # VNDocumentCameraScan #print(scan) . . . methods = [documentCameraViewController_didFinishWithScan_, documentCameraViewController_didFailWithError_, documentCameraViewControllerDidCancel_]
-
This post is deleted! -
@cvp perhaps you need to dismiss the _controller?
-
@JonB I was busy to post this
def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan): VNDocumentViewController = ObjCInstance(_controller) scan = ObjCInstance(_scan) # VNDocumentCameraScan #print(scan) VNDocumentViewController.dismissViewControllerAnimated_completion_(True, None)
-
@cvp re: getting the name wrong, in Swift, they omit the "nouns", i think. So the docs show the selectors without nouns. In objc_util it lets you do this too, if you use kwargs.
Re: dismissing... So did that work? If not, maybe need to on_main_thread it?
-
scan returns an UIImage
print(scan.imageOfPageAtIndex_(0))
-
@JonB said:
documentCameraViewController_didFinishWithScan_
One more time, thanks for your help.
I really become too old for this stuff. Shame on me, I'm so sad to have not seen that myself.
Sorry to all people who tried to help us.😢😪 -
@emkay_online quick an dirty to see the UIImage
import ctypes from PIL import Image UIImage = scan.imageOfPageAtIndex_(0) # Save UIImage to jpg file func = c.UIImageJPEGRepresentation func.argtypes = [ctypes.c_void_p, ctypes.c_float] func.restype = ctypes.c_void_p x = ObjCInstance(func(UIImage.ptr, 1.0)) x.writeToFile_atomically_('test.jpg', True) # Display jpg file image = Image.open("test.jpg") image.show()
-
@emkay_online operational
from objc_util import * import ui load_framework('VisionKit') def documentCameraViewController_didFinishWithScan_(_self, _cmd, _controller, _scan): VNDocumentViewController = ObjCInstance(_controller) scan = ObjCInstance(_scan) # VNDocumentCameraSca UIImage = scan.imageOfPageAtIndex_(0) ObjCInstance(VNDocumentViewController.ui_view['iv']).setImage_(UIImage) VNDocumentViewController.dismissViewControllerAnimated_completion_(True, None) def documentCameraViewController_didFailWithError_(_self, _cmd, _controller, _error): print('documentCameraViewController_didFailWithError_') def documentCameraViewControllerDidCancel_(_self, _cmd, _controller): print('documentCameraViewControllerDidCancel_') methods = [documentCameraViewController_didFinishWithScan_, documentCameraViewController_didFailWithError_, documentCameraViewControllerDidCancel_] protocols = ['VNDocumentCameraViewControllerDelegate'] try: MyVNDocumentCameraViewControllerDelegate = ObjCClass('MyVNDocumentCameraViewControllerDelegate') except: MyVNDocumentCameraViewControllerDelegate = create_objc_class('MyVNDocumentCameraViewControllerDelegate', methods=methods, protocols=protocols) @on_main_thread def main(): VNDocumentCameraViewController = ObjCClass('VNDocumentCameraViewController').alloc().init() delegate = MyVNDocumentCameraViewControllerDelegate.alloc().init() VNDocumentCameraViewController.delegate = delegate uiview = ui.View() iv = ui.ImageView(name='iv') iv.frame = uiview.bounds iv.flex = 'wh' uiview.add_subview(iv) uiview.present('fullscreen') VNDocumentCameraViewController.ui_view = uiview # to pass to delegate objc_uiview = ObjCInstance(uiview) SUIViewController = ObjCClass('SUIViewController') vc = SUIViewController.viewControllerForView_(objc_uiview) vc.presentViewController_animated_completion_(VNDocumentCameraViewController, True, None) main()
-
@cvp, good stuff. It gives the straightened-out picture, right? Can I get a multi-page PDF, or is the framework for single pictures only?
-
@mikael no,no, the framework is for multiple scans but my little script not.
I think that if you don't dismiss the camera view controller, you could continue to scan multiple images, but I did not test it. -
i think the document object guves you UIImages only, but you could create a pdf using some UIKit functions:
https://developer.apple.com/documentation/uikit/images_and_pdf?language=objc
(you need to acces the functions using c.UIGraphicsBeginPDFContextToFile etc and set argtypes and restype)
I think the basic flow is, you have to create a pdf context to a file, begn a pdf page, draw your content (UiImage's drawAtPoint ), begn a new page, etc, then finally end the context.