In the past, I've created a flask app which has the endpoints I needed and would respond with a JSON payload. This gets a bit tricker if you want things to be architected properly where you don't wait for the server to give the full response. So, I think the proper route would be to have your Rails app make an API request to the Python App Web Interface that you create. It queues a background job with Celery and gives an OK response back to the Rails application. You can then create an ingress endpoint on the Rails application side that the Celery working will call once its background job is completed. This saves from having a long running request holding up a thread.
You should be able to edit your account information and change the email address to your university email address. This will trigger a verification email to the newly entered address. Once verified, the new email address will be updated to the primary.
Yea, i think that it greatly depends on what the PDF is. In some applications I had both mechanisms for generating PDFs. When we needed something with a bit more granular control, we'd use Prawn. I do like Prawn because it is battle tested and it doesn't have a lot of external dependencies. But you're right, the added complexities and DSL can be overwhelming to say the least.