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?
-
-
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.
-
Do you know that PIL save has an option to save as pdf?
pil_image.save('File.pdf',"PDF",resolution=100.0)
-
@cvp this would of been wonderfull information about 3 months go lol
-
@cvp can PIL do multipage PDF? I guess you still would need to do the ui2pil type business.
-
@JonB said:
@cvp can PIL do multipage PDF? I guess you still would need to do the ui2pil type business.
Which I guess would make it slow in a way that this type of use case does not reslly tolerate.
Playing with the idea of a truly personalized doc scanner that would put the scan whete it needs to go. Also, combining this with the text recognition stuff would be good (as soon as they get international characters right).