…and Now for Something Completely Different…
Some of you might recall that this blog is not limited to posts about Echelon/NES meters, and know it is actually for all kind of stuff Graves and I am dabbling with. Granted, lately it’s been mostly about our Echelon/NES project – but we have not stopped dabbling with other stuff too :-).
You might know that my day job is to develop solutions in Microsoft Dynamics 365 Business Central (I’ll call it BC in this entry), and for some time I had an idea I would like to share with the community:
As some of you might know, the BC web client and Microsoft’s chosen path has made it quite an expensive challenge to do direct print (direct print is when you do a print directly to a printer – without the user having to i.e., download a PDF and then print it manually).
Microsoft do have a solution called Universal Print and BC supports it along with e-mail enabled printers. You can read more about both solutions here! The main problem – if you printer does not support e-mail printing, is that Universal Print is quite expensive.
Others also have solutions for this – and it might even be included in something more advanced like ForNAV Direct Print.
But why didn’t someone design and do a cheap, Do-It-Yourself solution?
…and – if you are on BC SaaS, but still need a simple, cheap solution to print on local and cheap printers? Or even Network printers that does not support e-mail printing?
And off cause we should try to keep it as cheap and simple as possible – and don’t rely on any special ports to be forwarded and open in firewall etc. That is simply too cumbersome for regular users to setup!
BC App – maybe a Per Tenant Extension?
Well, imagine installing an app on your BC that collects all printjobs as PDF and store them in a BC table. Then making them available through a webservice of some kind… While at it we could do a secondary webservice allowing “Print Processors” (I’ll explain what that is in a minute) to register printers with BC, so they are available for printing directly in BC.
We must do it, so we are able to install and use it for both BC OnPrem and BC SaaS, right?
So, what is this “Print Processor” thingy and what does it run on?
Well, it is something that can obtain a list of available printers and call a BC webservice to tell BC about them. It should also call a BC webservice at some interval to see if there are any print jobs (PDFs) waiting, and if so – fetch the PDFs and print them. For the last part we can simply rely on solutions other created – it cannot be that hard to print a PDF, right?
Ideally the “Print Processor” should be available on multiple platforms, it only has a few requirements:
- Connect to the network so it can call BC webservices (Internet if BC SaaS)
- Call webservices and handle the result
- Connect to the local printer (network, USB etc.)
- Print a PDF to a local printer
Ideally it could just be some kind of script? Python for Linux and other Unix like systems (some NAS servers even run Unix like systems). And maybe PowerShell for Windows while we are at it?
Really – how hard can it be to pull this off?
Well – https://github.com/DabblerDK/PIPrint
This is in NO WAY final “production” quality software, but feel free to use it on your own costs and risk and build on it.
Release it commercially, use it privately etc.
Please always keep a reference to this blog somewhere people see when they use it. And please give back any improvements to the GitHub repository and the community…
Enjoy…
This is amazing! – was just what I was looking for.
We had an existing in-house solution that used servicebus which worked quite well but just too many little issues.
We asked one of the biggest MS partners if they could write us a custom print extension to which they said no – they couldn’t do it.
This gave me the knowledge and helped me to understand the MS Learn pages on the topic. I ended up having to use it as the basis rather than as-is, because I needed to add a dependency to another app in order to get paper tray info. (for use with SumatraPDF rather then PDFxcView) and a few extras.
This really gave me the leg up I needed though and I am most grateful to you.
I did have to add a commit and comment out the AutoCleanUpJobs code in the OnAfterSetupPrinters to avoid errors in some circumstances (like when printer selections were involved)…I could offer these through a pull request.
Hi John
Thank you for your kind words, and glad to hear this helped you!
If possible I would like your pull request with the fix. I’m on summer vacation currently and I cannot remember if we allow pull requests on this GitHub project.
But please reach out to me on gert@dabbler.dk if you have any issues.
Best regards,
Gert Lynge
gert@dabbler.dk