# JSPrintManager

## Print Commands & Files, Manage Printers & Scan Docs from Javascript

**[JSPrintManager](https://neodynamic.com/products/printing/js-print-manager)** is a **Javascript + Client App** solution for **Client-side Printing & Scanning** scenarios **designed to be used in any Website** developed on top of **any Web Platform like ASP.NET, PHP, Django, Ruby On Rails (RoR), Express.js and more!**

By writing pure Javascript code, **JSPrintManager** allows you to _easily send raw data, text and native commands_ as well as _known file formats (like PDF, TXT, DOC, XLS, JPG, PNG)_ to any printer installed or available at the client machine *without showing or displaying any print dialog box!*
Scan Documents & Images is also supported!

**[More details about JSPrintManager...](https://neodynamic.com/products/printing/js-print-manager)**

## Features

### Raw Data Printing
Send any raw data & commands supported by the client printer like [EPSON ESC/POS](https://www.neodynamic.com/articles/How-to-print-raw-ESC-POS-commands-from-Javascript), HP PCL, PostScript, [Zebra ZPL](https://www.neodynamic.com/articles/How-to-print-raw-Zebra-ZPL-commands-from-Javascript) and [Eltron EPL](https://www.neodynamic.com/articles/How-to-print-raw-Zebra-EPL-commands-from-Javascript), and more! Shipping labels generated by postal services like [UPS, FedEx, USPS, DHL as well as PRN files](https://www.neodynamic.com/articles/How-to-print-raw-commands-from-Web-APIs-WebServices-Remote-and-Local-files-with-Javascript) are also supported!

### Advanced PDF Printing
[Print PDF files without requiring Adobe Reader or any other external software!](https://www.neodynamic.com/articles/Advanced-Silent-PDF-Printing-Tray-Paper-Size-Rotation-Pages-Range-Settings-from-Javascript) Advanced PDF Printing settings include Tray Name, Paper Size, Print Rotation, Pages Range, Duplex, Password-protection and more!

### Print Images & Docs
In addition to print raw commands, you can also use JSPrintManager solution to send and print known file formats like PDF, TXT, DOC/x, XLS/x, JPG, PNG, and more! PDF, TXT, PNG, JPG and BMP are natively supported; others will require external software like Word, Excel, LibreOffice, etc.

### Advanced DOC Printing
[Print DOC files silently](https://neodynamic.com/articles/Silent-Print-Word-DOC-duplex-pages-range-reverse-from-Javascript) with Advanced Printing settings including Password-protected files, manual Duplex, Pages Range, and more! _Windows only, requires MS Word 97+_

### Advanced XLS Printing
[Print XLS files silently](https://neodynamic.com/articles/Silent-Print-Excel-Spreadsheet-XLS-pages-range-from-Javascript) with Advanced Printing settings including Password-protected files, Pages Range, and more! _Windows only, requires MS Excel 97+_

### Print Files With Password
Print Password Protected PDF, DOC & XLS files! The password protected file is set at server side and the password to unlock it is encrypted and embedded into the file as part of its metadata.

### Web Scan Docs & Images
[Scan docs & images through any TWAIN/WIA/SANE-compatible devices](https://neodynamic.com/articles/How-to-scan-documents-images-from-Javascript) specifying settings like DPI Resolution, Pixel Mode (Grayscale, B&W, Color), and Output Image & Doc Format (JPG, PNG, TIFF, PDF)!

### Tray/Bin & Paper Size
If the printer is installed in the client system through a Printer Driver, then you can specify to which Tray Name to send the print job and specify a Paper Size if desired. The file formats supported by this feature are PDF, JPEG, PNG, BMP & TXT

### BIDI Serial Comm
[Bidirectional Serial Port Communication support!](https://neodynamic.com/articles/How-to-send-write-receive-read-bidi-serial-port-data-from-Javascript) Send/Write & Receive/Read data strings to any RS-232, COM & TTY port available on the client system.

### BIDI TCP/IP Comm
[Bidirectional TCP Communication support!](https://neodynamic.com/articles/How-to-send-write-receive-read-bidi-tcp-ip-data-from-Javascript) Send/Write & Receive/Read data strings to any TCP Address and port reachable from the client system. The Address requires to be in the client's allow list!

### BIDI Bluetooth Comm
[Bidirectional Bluetooth Communication support!](https://neodynamic.com/articles/How-to-send-write-receive-read-bidi-bluetooth-data-from-Javascript) Send/Write & Receive/Read data strings to any BT Address and Channel reachable from the client system. The Address requires to be in the client's allow list!

### Get Printers Info & Status
Besides getting the list of installed printers available in the client machine, you can also get further details like DPI Resolution, PortName, "Is Connected", "Is Shared", "Is Local", "Is Network", "Is Virtual or Real/Physical printer?", as well as the list of supported Papers and list of trays/bins!

### Printers Watcher
Detect when a new printer is added, when a printer is removed/deleted, and when any changes or modifications are done on any printers available at the client machine. _Windows only_

### Get Print Jobs Status
Trace print jobs status when targeting any installed client printers. Got notified whether the print job completed, number of printed pages, and many more related information.

### Print Server Mode
[JSPrintManager can be installed and configured as a dedicated print service](https://www.neodynamic.com/articles/How-to-print-raw-commands-pdf-files-from-iOS-Android-ChromeOS-sandboxed-devices-from-Javascript) on a given Desktop, Server or Device running Windows, Linux, macOS/OSX or Raspberry Pi OSes

### Print from Mobile & Sandboxed Devices
With [JSPrintManager in Print Server Mode](https://www.neodynamic.com/articles/How-to-print-raw-commands-pdf-files-from-iOS-Android-ChromeOS-sandboxed-devices-from-Javascript), clients such as mobile/sandboxed devices (running iOS, Android, ChromeOS...) and Terminal Services/Citrix environments will be able to print from your website! Useful for Mobile Billing, Mobile POS, Mobile Ordering, etc.

### Print to Any Printer
Print to any brand and type of client printers! Thermal Label Barcode printers, POS receipt printers, Impact printers, Ticket printers, RFID printers, Dot-Matrix, 3D Printers and more!

### Get Printers Info
Besides getting the list of installed printers available in the client machine, you can also get further details like DPI Resolution, PortName, "Is Connected", "Is Shared", "Is Local", "Is Network", "[Is Virtual or Real/Physical printer?](https://www.neodynamic.com/articles/How-to-detect-virtual-real-physical-printer-from-Javascript)", as well as the list of supported Papers and list of trays/bins!

### Get Bluetooth Devices Info
Get the list of Bluetooth devices available in the client machine including details like Name, Address, Class of Device, Connected, Remembered, and Autheticated

### Tray & Paper Size
If the printer is installed in the client system through a Printer Driver, then you can specify to which Tray Name to send the print job and specify a Paper Size if desired. The file formats supported by this feature are PDF, TIFF, JPEG, PNG, BMP & TXT

### Printer Communication
Client Printers Connectivity support: installed printers through Printer Driver (for USB connection), Shared Printers, Parallel Port (LPT) or Serial Port RS-232 (COM) as well as IP/Ethernet Network printers. On Linux & Mac OS, any kind of printer installed through CUPS is supported.

### Any Web Platform
Based on pure Javascript code, JSPrintManager.js can be used in any Web Platform like ASP.NET, PHP, Django, Ruby On Rails (RoR), Express.js as well as in any Web Framework like Angular or React

### Cross Platform Client
Any Client platform can print from your Website. JSPrintManager App supports Windows, macOS / OS X, Linux & Raspberry Pi (Linux ARM) devices. It's a very small client App without external dependencies!  ~~No ActiveX,  No Flash,  No Silverlight,  No Java,  No .NET Framework~~


## JSPrintManager Components

- **The Website component (JSPrintManager.js)** is a Javascript object which is used in a website to generate _"Client Print Jobs"_.

- **The Client-side component** is a lightweight native app (without any dependencies) that processes all the _"Client Print Jobs"_ generated by the Javascript object. **JSPrintManager App** can be installed on **Windows, Linux, Mac & Raspberry Pi!** **[Download JSPrintManager App...](https://neodynamic.com/downloads/jspm)**

## Sample Code

The [GitHub repo](https://github.com/neodynamic/jsprintmanager) contains the source code of [JSPrintManager Online Demo Website](https://jsprintmanager.azurewebsites.net)

## Licensing

**JSPrintManager is a Commercial** product. Licensing model and prices are available [here](https://neodynamic.com/products/printing/js-print-manager/buy)

## Support

Tech questions are handled by [Neodynamic Dev Team](https://neodynamic/support)

## Release Notes

### 6.0.3

- **Fixed!** `You have to specify an address` error when using BluetoothPrinter class.

### 6.0.2

- **Fixed!** JSPM.JSPrintManager.start() func when calling it more than once.

### 6.0.1

- **New!** Added showProgressUI prop to ClientScanJob to show or hide the progress UI. (Windows only)

### 6.0.0

- **New!** Added BluetoothPrinter class for printing to printers supporting BT Classic (RFCOMM protocol).
- **New!** BIDI Bluetooth communication support for devices supporting BT Classic (RFCOMM protocol).
- **New!** Custom paper settings support (through paperName prop) for InstalledPrinter class.
- **New!** Added JS getBluetoothDevices function to get list of Bluetooth devices available in the client system.
- **New!** Added printScale prop to PrintFilePDF class to print PDF files with scaling.
- **New!** Added mediaType prop to InstalledPrinter class.
- **New!** Added mediaTypes array property to getPrintersInfo output containing the list of media types supported by each printer.
- **New!** Added JS getMediaTypes function to get the list of supported Media Types for the specified printer.
- **New!** Added customPaperSupport property to getPrintersInfo output. This tells whether the printer allows custom paper size setting.
- **New!** Added customPapers array property to getPrintersInfo output containing the list of custom papers supported by each printer. (Windows only)
- **New!** Added isFax property to getPrintersInfo output. (Windows only)
- **New!** Added printer's Icon to getPrintersInfo extended version. (Windows only)
- **New!** Added printer's LanguagesSupportedNames to getPrintersInfo extended version. (Windows only)
- **New!** Added showUI prop to ClientScanJob to use the scanner driver UI when scanning. (Windows only) 
- **New!** Added macOS Icon image for printers through the JS getPrintersInfo function. (macOS only)

### 5.0.4

- **New!** Added refreshPrinters() func to force a refresh of the installed printers info.

### 5.0.3

- **New!** Added driverModel prop to InstalledPrinter class to specify the Windows Driver Model 3 or 4.

### 5.0.2

- **Fixed!** Removed reference to old V4 WS port.

### 5.0.1

- **New!** Added support for Multi-user Sessions scenario through the JS getIntances & getUser functions.

### 5.0.0

- **New!** Added Windows Icon image for printers through the JS getPrintersInfo function. Support for various icon sizes through the new PrinterIcon enum.
- **New!** Added JS getClientAppInfo function to get the Version, OS and CPU of the JSPrintManager Client App running at the client machine.
- **New!** Added JS getMAC function to get the Media Access Control (MAC) address of the client machine.
- **New!** Added support to InstalledPrinter class for automatically detecting Raw Mode Data Type based on the Windows printer driver model. Enable it by setting autoDetectRawModeDataType prop to true.
- **New!** Added JS getDefaultTrayName and getDefaultPaperName functions to get the default Tray Name and Paper Name for the specified printer.
- **New!** Added JS getTrays and getPapers functions to get the list of supported Trays and Papers for the specified printer.
- **New!** Added JS getPaperInfo function to get paper related info (width, height, printable area) for the specified printer and paper name.
- **New!** Added support for printing files from external URLs bypassing CORS restriction. Added ExternalURL option to FileSourceType enum.
- **New!** Bidirectional TCP Communication support through the new TcpComm class. Send/Write & Receive/Read data to any IP Address and Port reachable from the client system. The Address requires to be in the client's allow list!
- **New!** Added JPG Compression Quality setting for image scan output.
- **New!** Added Black and White pixel mode support for image scan output.
- **New!** Added TIFF image format support for scan output.
- **New!** Added PDF document format support for scan output.
- **New!** Added UI Settings dialog which features Sites Manager (Allow/Block list), Proxy info, and Certificate CA & SAN edition. NOTE: CA custom setting is allowed for White Label Licenses only!
- **New!** Added UI client app Logs view available from the system tray icon.

### 4.0.7

- _Fixed!_ JSPrintManager onError was not handling WS onerror.

### 4.0.6

- _Fixed!_ compilation errors in the TypeScript type declaration file.

### 4.0.5

- _Fixed!_ function do not exist.

### 4.0.4

- _Fixed!_ PrintFilePDF serialization when source type is set to Base64.

### 4.0.3

- _Improved!_ Moved to JS Modules.

### 4.0.2

- _New!_ Added onError event to WS.
- _Fixed!_ PrintFile serialization when source type is set to Base64.

### 4.0.1

- _Fixed!_ stop function.

### 4.0.0

- **New!** PrintFileGroup class to treat and print a group of files (Mix Images, PDF &amp; TXT) as they were part of a single multipage document with duplex printing support.
- **New!** Added advanced Multipage TIF printing (Print as Grayscale, Rotation, Page Range, Duplex, Sizing, Auto Center, and Auto Rotate) through the new PrintFileTIF class.
- **New!** Added native support for the following Image formats: Windows or OS/2 Bitmap File (*.BMP), Dr. Halo (*.CUT), DirectDraw Surface (*.DDS), ILM OpenEXR (*.EXR), Raw Fax format CCITT G3 (*.G3), Graphics Interchange Format (*.GIF), High Dynamic Range (*.HDR), Windows Icon (*.ICO), Amiga IFF (*.IFF, *.LBM), JPEG-2000 codestream (*.J2K, *.J2C), JPEG Network Graphics (*.JNG), JPEG-2000 File Format (*.JP2), Independent JPEG Group (*.JPG, *.JIF, *.JPEG, *.JPE), JPEG XR image format (*.JXR, *.WDP, *.HDP), Commodore 64 Koala format (*.KOA), Multiple Network Graphics (*.MNG), Portable Bitmap (ASCII) (*.PBM), Portable Bitmap (BINARY) (*.PBM), Kodak PhotoCD (*.PCD), Zsoft Paintbrush PCX bitmap format (*.PCX), Portable Floatmap (*.PFM), Portable Graymap (ASCII) (*.PGM), Portable Graymap (BINARY) (*.PGM), Macintosh PICT (*.PCT, *.PICT, *.PIC), Portable Network Graphics (*.PNG), Portable Pixelmap (ASCII) (*.PPM), Portable Pixelmap (BINARY) (*.PPM), Adobe Photoshop (*.PSD), Sun Rasterfile (*.RAS), RAW camera image (CRW/CR2, NEF, RAF, DNG, MOS, KDC, DCR, etc), Silicon Graphics SGI image format (*.SGI), Truevision Targa files (*.TGA, *.TARGA), Tagged Image File Format (*.TIF, *.TIFF), Wireless Bitmap (*.WBMP), Google WebP image format (*.WEBP), X11 Bitmap Format (*.XBM), X11 Pixmap Format (*.XPM). 
- **New!** Manual duplex printing support for text plain files through PrintFileTXT class.
- **New!** Scanner support for duplex and feeder (ADF) options under Windows Clients.
- **New!** UI for managing sites permissions.

### 3.0.6

- _Fixed!_ Removed JSPM.Serial.StopBits.None which is not a valid value.

### 3.0.5

- _Fixed!_ 'JSPM not defined' when importing JSPM module.

### 3.0.4

- _Fixed!_ Malformed message - Invalid License

### 3.0.3

- _Fixed!_ license_url setting throws "Uncaught TypeError: Cannot read property 'status' of undefined."

### 3.0.2

- _Fixed!_ license_url setting throws an error if websocket was not open.

### 3.0.1

- _Fixed!_ Support for IE11.

### 3.0.0

- **New!** All advanced PDF printing (Print as Grayscale, Print Annotations, Rotation, Page Range) in v2.0 that were available for Windows, now are available for macOS and Linux!
- **New!** Added more PDF printing settings like Sizing (None & Fit), Auto Center, and Auto Rotate to PrintFilePDF class.
- **New!** Printing Password-protected PDF files through PrintFilePDF class.
- **New!** Added manual Duplex printing support for PDF files through PrintFilePDF class.
- **New!** Added new PrintFileDOC class supporting .docx, .docm, .dotx, .dotm, .doc, .dot, .rtf, and .odt file formats. For Windows clients only. Requires Microsoft Word 97+!
- **New!** Support for printing Password-protected DOC files, and options like manual Duplex, Pages Range through the brand new PrintFileDOC class. For Windows clients only. Requires Microsoft Word 97+!
- **New!** Added new PrintFileXLS class supporting .xl, .xlsx, .xlsm, .xlsb, .xlam, .xltx, .xltm, .xls, .xla, .xlt, .xlm, .xlw and .ods file formats. For Windows  clients only. Requires Microsoft Excel 97+!
- **New!** Support for printing Password-protected XLS files, and Pages Range setting through the brand new PrintFileXLS class. For Windows clients only. Requires Microsoft Excel 97+!
- **New!** Added Duplex printing options (Default, Simplex, Vertical, Horizontal) to InstalledPrinter based on the built-in duplex support of the target printer.
- **New!** Added None option to TextAlignment enum for printing txt files as is i.e. without any alignment.
- **New!** Get list of Fonts available in the client system.
- **New!** Get list of Serial/COM ports available in the client system.
- **New!** Scan documents and images from TWAIN/WIA/SANE-compatible scanner devices specifying DPI/resolution, Pixel Mode (Grayscale, Color) and the desired output image format (JPEG/JPG, PNG).
- **New!** Get list of scanner devices available in the client system.
- **New!** Bidirectional (BIDI) Serial Port (RS-232, COM &amp; TTY) Communication support.
- **New!** PrintFileTXT now supports sources from files, URL, BLOB, and Base64.
- _BREAKING CHANGES_
	- 32-bit JSPM Client App for Mac and Linux are no longer supported. Only 64-bit macOS and Linux are supported.
	-Serial Port Data Bits is now an enumeration called **JSPM.Serial.DataBits**
	- JSPM.WSStatus.Blacklisted renamed to **JSPM.WSStatus.Blocked**

### 2.0.2

- _Fixed!_ Error Raw commands encoding for chars in the range 128-255/80-FF.

### 2.0.1

- _Fixed!_ Error "Invalid ClientJob: Invalid printer type" when using JSPM.NetworkPrinter class.

### 2.0.0

- **New!** Print PDF silently without Adobe Reader or FoxIt Reader dependencies for Windows Clients!
- **New!** PDF file custom printing settings like Print as Grayscale, Print Annotations, Rotation, Page Range and more! Refer to the PrintFilePDF class in the help doc
- **New!** TXT file custom printing now featuring settings like Print Orientation, Text Alignment (Justify, Left, right, center); output font name, size, color and style (bold, italic, underline, strikethrough) and margins! Refer to the PrintFileTXT class in the help doc
- **New!** Get Installed Printers from the client with useful info about them like PortName, Is Connected, Is Shared, Is Local, Is Network, DPI Resolution, as well as the list of supported Papers and list of trays/bins. With this info it's possible to infer whether a given device is a real/physical printer or a virtual printer
- **New!** InstalledPrinter class now supports Tray Name and Paper Name settings. NOTE: The supported file formats allowed for these new settings are BMP, JPG, PNG, TXT and PDF
- **New!** Print Server Mode which allows printing scenarios where mobile/sandboxed devices (running iOS, Android, Chrome OS, etc.) and Terminal Services/Citrix environments are involved
- **New!** Support for non-Admin user accounts
- _Improved!_ Memory Managment and WebSockets communication

### 1.0.2

- _Fixed!_ Honoring UTF8 BOM for raw printer commands.

### 1.0.1

- _Fixed!_ UTF8 string to Byte Array conversion.
- _Improved!_ WebSocket connection.

### 1.0.0

- Initial release of JSPrintManager