Select a printer and silently print - javascript

This answer shows how to enable silent printing in Google Chrome. However, I have two web pages which have to be silently printed using two different printers without further user interaction. Is there a way to select a printer automatically before calling window.print()? I don’t mind writing a Chrome Extension if really necessary.

Maybe you could setup your printers with Google Clound Print then use the cloud printing API to silently submit jobs to them. It looks like you can specify the printer id when you submit the job. You might need to use something like html2canvas to rasterize the webpage.

If you are in an environment that you know, and in wich you have enough privileges (i suppose, since you know the printer you want to use) you can try to change it through the command line.
For this, you should call
#RunDLL32.EXE printui.dll,PrintUIEntry /y /n "Printer name"
The printer name has to be the value displayed in the control panel.
For calling command line from javascript, if you have the proper ActiveX controls enabled, you can use:
var run=new ActiveXObject('WSCRIPT.Shell').Run("commands to run");
also, you can try with shell.application ShellExecute
var objShell = new ActiveXObject("shell.application");
objShell.ShellExecute("cmd.exe", 'RunDLL32.EXE printui.dll,PrintUIEntry /y /n "Printer name"', "C:\\WINDOWS\\system32", "open", 1);
For more information you can go to http://msdn.microsoft.com/en-us/library/windows/desktop/gg537745(v=vs.85).aspx
I havent tested it, so good luck!

I ended up writing a server in F# and communicating with that through a WebSocket.

I have searched for an answer but it looks like there is no way to set a printer programatically. Therefore my probably complicated solution:
Create a command line application which can switch the default printer of the operating system. Maybe an application which is capable of disabling and enabling a printer. If you are on Windows a .NET application could probably do this. If on Linux there should be a command line interface for printer management (I don't know for sure).
Now make for example a PHP, asp.net or ruby etc. page which is able to call the printer enable/disable program.
If this is working you can use Javascript calls to first print to printer one and after the switch to printer two. However there some disadvantages:
If printer one is printing a document you can not switch to printer two, since this will disable printer one. So somehow you should time how long a common job takes.
There is a lot of overhead in this solution. You need to made extra calls for the switch between printers
Maintainability is absolutely not optimal since you need to maintain the printer switch program and the webservice.
I hope for you someone comes up with a better solution, but I wanted to at least share my thoughts. Maybe they help you in solving your problem.

If you're doing this for a product or webapp that will run in an environment where there are printers etc. A better solution to just giving clients a webappp to run might be to wrap your webapp with a desktop application using Chromium Embedded Framework. Like Chromely (kind of like Electron, but lighter), EdgeSharp or CEFSharp etc.
Using this technique, you can write code that can actually enumerate printers on the network and talk to hardware while still running your webapp and you can expose new JS api's you build in the desktop app to your web application.
Then to make it smart, you can have your webapp work in both environments, running in the desktop app, or directly in a browser. Where it would have advanced extended features running in the desktop application.
Then you can deploy said application a plethora of ways. For example, Windows 10+ you can have a private windows Store for your company and you can deploy the application to your private windows store where it can be installed via the Private Windows Store which you can setup with Group Policies on Windows.
Or you could have a private npm repo and script the install/update of your application. Even old school techniques like Microsoft Click Once installs, and on and on.
But the most power you can possibly give your web application is to give it a custom browser to run on and with Chromium Embedded Framework it's so easy.
In C# you can spin up a simple Chrome wrapper in less than 60 seconds.
Using .Net 6+ and EdgeSharp for example, you could get this to be cross platform on Linux, Windows, and MacOsx, and also port it to Xamarin and IOS pretty easily so that you can have this power on phones, pc's, mac's, and tablets.

Related

Use Quorum Plugin on another IDE; Sonic Pi; MIDI; javascript

I wrote a program that plays a song using sonic pi. I have to transcribe the code to a web language (javascript). Since I'm new at javascript I thought it would be ideal to use QUORUM (http://quorumlanguage.com/) to transcribe it since there is easy access to MIDI libraries, etc. (that I absolutely need). I have a mac and tried to use netbeans, etc (all processes suggested on the quorum site) but they are not working. So, I figured I should be able to use the Quorum plugin that I downloaded on another IDE (a cloud IDE would probably be better). I keep failing and I honestly don't know really know what I'm doing. I'd prefer not to pay for an IDE. I tried orion's cloud ide "che" but it won't let me download the plugin via the internet or give me an option for uploading or running a native file.
Basically, I would like to find someway I can use quorum on my Mac.
Please help.
Doing all this for my graduate degree.
Thanks.
Em.
In order to use The Quorum Programming language, it MUST be in the Netbeans IDE. No exceptions.
The process of installing the plugin for Quorum Language Support is as follows:
MAKE SURE YOU HAVE THE LATEST VERSION OF THE JAVA DEVELOPMENT KIT!!! - This is VERY important as Quorum 3.0 uses the Latest Version of Java and Quorum compiles to Java Byte Code.
You MUST Have Netbeans 8.0 or greater (at most Netbeans 8.0.2). - This is also very important as Quorum 3.0 takes advantage of features in Netbeans 8.
Go to the plugins page. This can be done by clicking on "Tools" in the Menu Bar and then going to "Plugins"
Go to the Settings Tab and hit the button that says "Add"
In the Name Field, Type "Quorum"
In the URL Field, Type the following: http://quorumlanguage.com/updates/quorum/updates.xml
Now under "Available Plugins", Check the Box for Quorum
Click the Install Button
Restart Netbeans.
Now, upon completed load of the Netbeans IDE, The Quorum Module should ask you if you would like dictation of everything you do. If you do not want this, tell it that you do not. If you do, then go for it.
When you go to Create a new Project in Netbeans, you should see an option for Quorum. If you do see this,then you have successfully installed the Quorum Plugin to Netbeans.

Windows, WinForms, Web, javascript, silent printing

I have a web app developed which needs to do silent printing on various platforms.
For Windows, I was thinking to set up a WinForms project, wrap the web app with WebBrowser control.
My question is, how can I interact between the pages displayed in the WebBrowser control and the native WinForms C# code to print.
I need to be able to select which printer to use and it needs to be 'silent', that is, no additional pop-ups.
If there are better (or other) ways of doing it, please let me know too.
Any thoughts, or code samples would be great, thanks.

What are the problems/difficulties I might run into when using ActiveX?

I need some expert information about ActiveX and some valuable experience reports from those that already used it.
The situation is the following: ~90% of all of our applications are created as web apps with ASP.net WebForms. We're now in the process of switching to a more modern approach, creating rich client JavaScript apps. However, In one of the recent projects, a strong requirement from the customer is the ability to directly print to a (previously configured) printer attached to the user's workstation. Yes, no printer dialogs, print previews etc.. It has to be fast.
Obviously this is a scenario where you would rather use a desktop app than a web based one. Still, we would like to benefit from our existing web dev knowledge and are therefore considering to write that very specific, isolated printing functionality as an ActiveX control (IE dependency is not an issue).
Now, since the word "ActiveX" alone causes disgust for some people, I'd like to hear what might be the potential problems at using such a (old) technology or do u directly consider me to make it as a desktop app and completely forget about it?? Or are there alternatives??
The primary challenge you'll face is the learning curve; beyond that the biggest problems are the potential for you messing up and opening a security hole (for example, what happens if a malicious third party loads your activex control on their phishing site? can they use it to print things?), etc.
For the learning curve, I highly recommend looking at FireBreath, which can be used to create browser plugins that work on IE (as an ActiveX control) as well as Firefox, chrome, safari, etc (as a NPAPI plugin). Though ActiveX is an "old" technology, it's still used extensively in the modern day; for example, Flash, Silverlight, Quicktime, and other "plugins" like that are all activex controls in IE.

how to start up a desktop application in client side

In my web page, I have to start a desktop application on the client's computer if it's installed. Any idea how I can do this?
If the application is MS Office or Adobe Reader, I know how to start them, but the application I want to start is a custom application. You can not find it on the internet.
How can I open the application?
Basically it's not possible to achieve unless an application registers a protocol that will trigger it. If it does that all you need to do is to provide a link using this protocol
yourcustomapp://some.parameters
Another way the 3rd party app can integrate with the browser is if it hooks to it as a plugin. This is how flash apps work etc.
If the app you are trying to launch does not support something like that it's going to be close to impossible to achieve what you want.
The browser sandbox prohibits you from executing local resources, for good reason - to thwart a website destroying your box with malicious code. I've been researching the same functionality.
The only solution I've found is to build an extension in Mozilla Firefox which can launch your app. Extensions live outside the sandbox so they can execute local resources. See this page for how to do that. You may be able to do it cross-browser using crossrider, though I haven't had success with that yet.
You could alternatively build a thick client populated from a web service, and launched from the browser through an extension as mentioned above. This is what I'm doing to get around the sandbox. I'm using local XUL for this.
See my question for additional discussion.
First off - you can't do it using javascript in any sort of a portable mechanism.
If the application is ms office or adobe reader,I know how to startup them
No you don't - you know how to send a document, which the browser associates with these applications and invokes them supplying the name of the local copy of the response. You can't just start the programs.
You just need to do the same for your app - invent a new mime type (the major type would be 'application' and by convention, non-standard minor types are prefixed with 'x-', so you might use application/x-hguser) then associate that mimetype with the relevant program browser side.
i.e: You need to explicitly configure each browser
I already encouter that problem in some complex production environnements.
I do the trick using the following code :
function launch(p_app_path)
{
var oShell = new ActiveXObject("WScript.Shell");
oShell.Run('"' + p_app_path + '"', 1);
}
In IE options > Security > Customize the level > ActiveX controls and plugins > Initialization and script ActiveX controls not marked as safe for scripting, set the value to Ask or Active.
It isn't a security problem when your website is enclosed into a specific security context.
And as they say, it's not worth it to build a gas plant.
JavaScript alone can't do this. (No, not even with MS Office or Adobe Reader.) Thankfully.
There are a number of old ways, including using ActiveX, which may work for your needs. As others have pointed out while typing this, you can customize responses based on the mime type or the protocol, etc.
Any way you look at it, you're going to need control over the end users' browser. If you're in a close environment where you can dictate policy (users must use a specific browser, with a specific configuration), then you're going to need to do that. For an open environment with no control over the end users, you're out of luck.
I'm actually having a lot of success right now with SiteFusion. It's a PHP client/server application framework that serves out XUL/JavaScript applications from a server deamon running in Apache. You access applications from a very thin client in XULRunner, or potentially off a web page using extensions. Clients can execute on any platform, and they're outside of the browser sandbox so you can access local resources such as executables. It'a a fairly elegant solution, their website provides great examples and documentation, and their forum is very responsive. I actually found a minor bug in passing arguments to local executables, posted a question about the forum, and it was fixed by the chief developer in under 15 minutes. Very impressive, overall!

How are windows executables [.exe] launched out of browsers?

I'm not talking about browser exploits. I'm talking about real applications used in real companies, like Ijji and Nexon.
Basically, from their websites you can click a "Start Game" button, which will launch an executable located at c:\ijji\english or c\nexon[gamename] respectively. These applications are real desktop applications, meaning that they can take advantage of the filesystem, direct3d, and OS [in the form of executing other applications]. The applications can also be launched through command line [as opposed to going to the game host's website].
I figured this would be possible if the application created an ActiveX object to call for the creation of a new process. However, the websites are able to launch applications from multiple browsers other than Internet Explorer, including chrome, which, to my knowledge, does not implement ActiveX.
Obviously the people developing these applications use their own means to do this.
From looking at the services list as well as currently running applications list, I have no indication that they're running something like "gameLaunchingServer.exe" which listens to some obscure port for an incoming connection [to be accessed using iframe - HTTP Protocol] and responds by launching an application...
I'm stumped, and this is sort of stuck in my mind. Obviously, they're not using some random browser exploit, otherwise people at http://www.[insertMaliciousWebsiteHere].com would have jumped on the opportunity already to install random crap. Regardless, it seems pretty cool, and I wanted to know how it worked.
Just curious, hehe.
I believe what they're doing is setting up their own protocol handler on install - when a browser is asked to access an address with a protocol that it doesn't know how to handle (for instance, a steam:// address), it looks at all the installed protocol handlers to find a match.
So you can register your application as a myApplication:// protocol handler, and then your web page can link to a myApplication:// address and launch your application.
I didn't quite find the button you are talking about, but I'm thinking it works only after you installed the application once, isn't it?
In that case, the application probably created its own protocol, just as skype, msn and a bunch of clients.
Having a protocol is the easiest way (and very easy indeed to implement - a simple registry key).
Another way which is used is an extension or plugin.
I thought they were run through plug-ins or like applets.
For example, MS SilverLight

Categories