Skip to content

Instantly share code, notes, and snippets.

@tresf
Created April 5, 2014 03:10
Show Gist options
  • Save tresf/9986993 to your computer and use it in GitHub Desktop.
Save tresf/9986993 to your computer and use it in GitHub Desktop.
<html>
<!-- License: LGPL 2.1 or QZ INDUSTRIES SOURCE CODE LICENSE -->
<head><title>QZ Print Plugin</title>
<script type="text/javascript" src="js/deployJava.js"></script>
<script type="text/javascript">
/**
* Optionally used to deploy multiple versions of the applet for mixed
* environments. Oracle uses document.write(), which puts the applet at the
* top of the page, bumping all HTML content down.
*/
deployQZ();
/**
* Deploys different versions of the applet depending on Java version.
* Useful for removing warning dialogs for Java 6. This function is optional
* however, if used, should replace the <applet> method. Needed to address
* MANIFEST.MF TrustedLibrary=true discrepency between JRE6 and JRE7.
*/
function deployQZ() {
var attributes = {id: "qz", code:'qz.PrintApplet.class',
archive:'qz-print.jar', width:1, height:1};
var parameters = {jnlp_href: 'qz-print_jnlp.jnlp',
cache_option:'plugin', disable_logging:'false',
initial_focus:'false'};
if (deployJava.versionCheck("1.7+") == true) {}
else if (deployJava.versionCheck("1.6+") == true) {
attributes['archive'] = 'jre6/qz-print.jar';
parameters['jnlp_href'] = 'jre6/qz-print_jnlp.jnlp';
}
deployJava.runApplet(attributes, parameters, '1.5');
}
/**
* Automatically gets called when applet has loaded.
*/
function qzReady() {
// Setup our global qz object
window["qz"] = document.getElementById('qz');
var title = document.getElementById("title");
if (qz) {
try {
title.innerHTML = title.innerHTML + " " + qz.getVersion();
document.getElementById("content").style.background = "#F0F0F0";
} catch(err) { // LiveConnect error, display a detailed meesage
document.getElementById("content").style.background = "#F5A9A9";
alert("ERROR: \nThe applet did not load correctly. Communication to the " +
"applet has failed, likely caused by Java Security Settings. \n\n" +
"CAUSE: \nJava 7 update 25 and higher block LiveConnect calls " +
"once Oracle has marked that version as outdated, which " +
"is likely the cause. \n\nSOLUTION: \n 1. Update Java to the latest " +
"Java version \n (or)\n 2. Lower the security " +
"settings from the Java Control Panel.");
}
}
}
/**
* Returns whether or not the applet is not ready to print.
* Displays an alert if not ready.
*/
function notReady() {
// If applet is not loaded, display an error
if (!isLoaded()) {
return true;
}
// If a printer hasn't been selected, display a message.
else if (!qz.getPrinter()) {
alert('Please select a printer first by using the "Detect Printer" button.');
return true;
}
return false;
}
/**
* Returns is the applet is not loaded properly
*/
function isLoaded() {
if (!qz) {
alert('Error:\n\n\tPrint plugin is NOT loaded!');
return false;
} else {
try {
if (!qz.isActive()) {
alert('Error:\n\n\tPrint plugin is loaded but NOT active!');
return false;
}
} catch (err) {
alert('Error:\n\n\tPrint plugin is NOT loaded properly!');
return false;
}
}
return true;
}
/**
* Automatically gets called when "qz.print()" is finished.
*/
function qzDonePrinting() {
// Alert error, if any
if (qz.getException()) {
alert('Error printing:\n\n\t' + qz.getException().getLocalizedMessage());
qz.clearException();
return;
}
// Alert success message
alert('Successfully sent print data to "' + qz.getPrinter() + '" queue.');
}
/***************************************************************************
* Prototype function for finding the "default printer" on the system
* Usage:
* qz.findPrinter();
* window['qzDoneFinding'] = function() { alert(qz.getPrinter()); };
***************************************************************************/
function useDefaultPrinter() {
if (isLoaded()) {
// Searches for default printer
qz.findPrinter();
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
// Alert the printer name to user
var printer = qz.getPrinter();
alert(printer !== null ? 'Default printer found: "' + printer + '"':
'Default printer ' + 'not found');
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
/***************************************************************************
* Prototype function for printing raw commands directly to the filesystem
* Usage:
* qz.append("\n\nHello world!\n\n");
* qz.printToFile("C:\\Users\\Jdoe\\Desktop\\test.txt");
***************************************************************************/
function printToFile() {
if (isLoaded()) {
// Any printer is ok since we are writing to the filesystem instead
qz.findPrinter();
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
// Send characters/raw commands to qz using "append"
// Hint: Carriage Return = \r, New Line = \n, Escape Double Quotes= \"
qz.append("A590,1600,2,3,1,1,N,\"QZ Print Plugin " + qz.getVersion() + " sample.html\"\n");
qz.append("A590,1570,2,3,1,1,N,\"Testing qz.printToFile() function\"\n");
qz.append("P1\n");
// Send characters/raw commands to file
// i.e. qz.printToFile("\\\\server\\printer");
// qz.printToFile("/home/user/test.txt");
qz.printToFile("C:\\qz-print_test-print.txt");
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
/***************************************************************************
* Prototype function for printing raw commands directly to a hostname or IP
* Usage:
* qz.append("\n\nHello world!\n\n");
* qz.printToHost("192.168.1.254", 9100);
***************************************************************************/
function printToHost() {
if (isLoaded()) {
// Any printer is ok since we are writing to a host address instead
qz.findPrinter();
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
// Send characters/raw commands to qz using "append"
// Hint: Carriage Return = \r, New Line = \n, Escape Double Quotes= \"
qz.append("A590,1600,2,3,1,1,N,\"QZ Print Plugin " + qz.getVersion() + " sample.html\"\n");
qz.append("A590,1570,2,3,1,1,N,\"Testing qz.printToHost() function\"\n");
qz.append("P1\n");
// qz.printToHost(String hostName, int portNumber);
// qz.printToHost("192.168.254.254"); // Defaults to 9100
qz.printToHost("192.168.1.254", 9100);
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
/***************************************************************************
* Prototype function for finding the closest match to a printer name.
* Usage:
* qz.findPrinter('zebra');
* window['qzDoneFinding'] = function() { alert(qz.getPrinter()); };
***************************************************************************/
function findPrinter(name) {
// Get printer name from input box
var p = document.getElementById('printer');
if (name) {
p.value = name;
}
if (isLoaded()) {
// Searches for locally installed printer with specified name
qz.findPrinter(p.value);
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
var p = document.getElementById('printer');
var printer = qz.getPrinter();
// Alert the printer name to user
alert(printer !== null ? 'Printer found: "' + printer +
'" after searching for "' + p.value + '"' : 'Printer "' +
p.value + '" not found.');
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
/***************************************************************************
* Prototype function for listing all printers attached to the system
* Usage:
* qz.findPrinter('\\{dummy_text\\}');
* window['qzDoneFinding'] = function() { alert(qz.getPrinters()); };
***************************************************************************/
function findPrinters() {
if (isLoaded()) {
// Searches for a locally installed printer with a bogus name
qz.findPrinter('\\{bogus_printer\\}');
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
// Get the CSV listing of attached printers
var printers = qz.getPrinters().split(',');
for (i in printers) {
alert(printers[i] ? printers[i] : 'Unknown');
}
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
/***************************************************************************
* Prototype function for printing raw EPL commands
* Usage:
* qz.append('\nN\nA50,50,0,5,1,1,N,"Hello World!"\n');
* qz.print();
***************************************************************************/
function printEPL() {
if (notReady()) { return; }
// Send characters/raw commands to qz using "append"
// This example is for EPL. Please adapt to your printer language
// Hint: Carriage Return = \r, New Line = \n, Escape Double Quotes= \"
qz.append('\nN\n');
qz.append('q609\n');
qz.append('Q203,26\n');
qz.append('B5,26,0,1A,3,7,152,B,"1234"\n');
qz.append('A310,26,0,3,1,1,N,"SKU 00000 MFG 0000"\n');
qz.append('A310,56,0,3,1,1,N,"QZ PRINT APPLET"\n');
qz.append('A310,86,0,3,1,1,N,"TEST PRINT SUCCESSFUL"\n');
qz.append('A310,116,0,3,1,1,N,"FROM SAMPLE.HTML"\n');
qz.append('A310,146,0,3,1,1,N,"QZINDUSTRIES.COM"\n');
qz.appendImage(getPath() + 'img/image_sample_bw.png', 'EPL', 150, 300);
// Automatically gets called when "qz.appendImage()" is finished.
window['qzDoneAppending'] = function() {
// Append the rest of our commands
qz.append('\nP1,1\n');
// Tell the applet to print.
qz.print();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing raw ESC/POS commands
* Usage:
* qz.append('\n\n\nHello world!\n');
* qz.print();
***************************************************************************/
function printESCP() {
if (notReady()) { return; }
// Append a png in ESCP format with single pixel density
qz.appendImage(getPath() + "img/image_sample_bw.png", "ESCP", "single");
// Automatically gets called when "qz.appendImage()" is finished.
window["qzDoneAppending"] = function() {
// Append the rest of our commands
qz.append('\nPrinted using qz-print plugin.\n\n\n\n\n\n');
// Tell the apple to print.
qz.print();
// Remove any reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing raw ZPL commands
* Usage:
* qz.append('^XA\n^FO50,50^ADN,36,20^FDHello World!\n^FS\n^XZ\n');
* qz.print();
***************************************************************************/
function printZPL() {
if (notReady()) { return; }
// Send characters/raw commands to qz using "append"
// This example is for ZPL. Please adapt to your printer language
// Hint: Carriage Return = \r, New Line = \n, Escape Double Quotes= \"
qz.append('^XA\n');
qz.append('^FO50,50^ADN,36,20^FDPRINTED USING QZ PRINT PLUGIN ' + qz.getVersion() + '\n');
qz.appendImage(getPath() + 'img/image_sample_bw.png', 'ZPLII');
// Automatically gets called when "qz.appendImage()" is finished.
window['qzDoneAppending'] = function() {
// Append the rest of our commands
qz.append('^FS\n');
qz.append('^XZ\n');
// Tell the apple to print.
qz.print();
// Remove any reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing syntatically proper raw commands directly
* to a EPCL capable card printer, such as the Zebra P330i. Uses helper
* appendEPCL() to add the proper NUL, data length, escape character and
* newline per spec: https://km.zebra.com/kb/index?page=content&id=SO8390
* Usage:
* appendEPCL('A1');
* qz.print();
***************************************************************************/
function printEPCL() {
if (notReady()) { return; }
appendEPCL('+RIB 4'); // Monochrome ribbon
appendEPCL('F'); // Clear monochrome print buffer
appendEPCL('+C 8'); // Adjust monichrome intensity
appendEPCL('&R'); // Reset magnetic encoder
appendEPCL('&CDEW 0 0'); // Set R/W encoder to ISO default
appendEPCL('&CDER 0 0'); // Set R/W encoder to ISO default
appendEPCL('&SVM 0'); // Disable magnetic encoding verifications
appendEPCL('T 80 600 0 1 0 45 1 QZ INDUSTRIES'); // Write text buffer
appendEPCL('&B 1 123456^INDUSTRIES/QZ^789012'); // Write mag strip buffer
appendEPCL('&E*'); // Encode magnetic data
appendEPCL('I 10'); // Print card (10 returns to print ready pos.)
appendEPCL('MO'); // Move card to output hopper
qz.printToFile("C:\\Users\\Tres\\Desktop\\EPCL_Proper.txt");
//qz.print();
}
/**
* EPCL helper function that appends a single line of EPCL data, taking into
* account special EPCL NUL characters, data length, escape character and
* carraige return
*/
function appendEPCL(data) {
if (data == null || data.length == 0) {
return alert('Empty EPCL data, skipping!');
}
// Data length for this command, in 2 character Hex (base 16) format
var len = (data.length + 2).toString(16);
len = len.length < 2 ? '0' + len : len;
// Append three NULs
qz.appendHex('x00x00x00');
// Append our command length, in base16 (hex)
qz.appendHex('x' + len);
// Append our command
qz.append(data);
// Append carraige return
qz.append('\r');
}
/***************************************************************************
* Prototype function for printing raw base64 encoded commands
* Usage:
* qz.append64('SGVsbG8gV29ybGQh');
* qz.print();
***************************************************************************/
function print64() {
if (notReady()) { return; }
// Send base64 encoded characters/raw commands to qz using "append64"
// This will automatically convert provided base64 encoded text into
// text/ascii/bytes, etc. This example is for EPL and contains an
// embedded image. Please adapt to your printer language
qz.append64('Ck4KcTYwOQpRMjAzLDI2CkI1LDI2LDAsMUEsMyw3LDE1MixCLCIxMjM0IgpBMzEwLDI2LDAsMywx' +
'LDEsTiwiU0tVIDAwMDAwIE1GRyAwMDAwIgpBMzEwLDU2LDAsMywxLDEsTiwiUVogUFJJTlQgQVBQ' +
'TEVUIgpBMzEwLDg2LDAsMywxLDEsTiwiVEVTVCBQUklOVCBTVUNDRVNTRlVMIgpBMzEwLDExNiww' +
'LDMsMSwxLE4sIkZST00gU0FNUExFLkhUTUwiCkEzMTAsMTQ2LDAsMywxLDEsTiwiUVpJTkRVU1RS' +
'SUVTLkNPTSIKR1cxNTAsMzAwLDMyLDEyOCz/////////6SSSX///////////////////////////' +
'//////////6UlUqX////////////////////////////////////8kqkpKP/////////////////' +
'//////////////////6JUpJSVf//////////////////////////////////9KpKVVU+////////' +
'//////////////////////////8KSSlJJf5/////////////////////////////////9KUqpVU/' +
'/7////////////////////////////////9KqUkokf//P///////////////////////////////' +
'+VKUqpZP//+P///////////////////////////////ElKUlSf///9f/////////////////////' +
'////////+ipSkqin////y/////////////////////////////+lVUpUlX/////r////////////' +
'/////////////////qlJKUql/////+n////////////////////////////BFKVKUl//////8v//' +
'/////////////////////////zVSlKUp///////0f//////////////////////////wiSlSUpf/' +
'//////q///////////////////////////KqlJUpV///////+R//////////////////////////' +
'4UlKSpSX///////9T/////////6L///////////////BKlKpSqP///////1X////////0qg/23/V' +
'VVVVVVf//8CSlJKklf///////kv///////+pS0/JP8AAAAAAB///wFSlSSpV///////+pf//////' +
'/pUoq+qfwAAAAAAH//+AClSqpUT///////9S///////8pJUlkr+AAAAAAA///4AFJSSSUv//////' +
'/yl///////KVUpTUv8AAAAAAH///gBKSqlVU////////lX//////6UkqoiU/wAAAAAA///+ABKpJ' +
'Uko////////JH//////UpIiqlJ/AAAAAAD///wACkSUpJX///////6q//////6pVVSqiv4AAAAAA' +
'f///AAJVVIqpP///////pI//////pSVtSSq/wAAAAAD///8AAJSlVJVf///////Sp/////8Sq//U' +
'qL/ttttoAP///wAAUpVSpJ///////+pT/////qkn//UlH/////AB////AABKUSpSX///////5Sn/' +
'///+lJ//+pS/////4AP///8AABKUkpVP///////ylP////1Kv//+qr/////AA////4AAKVVJUl//' +
'/////+lKf////KS///8kv////8AH////gAAKSSpJR///////9Kq////9Kv///5Kf////gAf///+A' +
'AAUlUqov///////1JT////lS////qn////8AD////4AABKpKSqf///////Skj///+kr////JH///' +
'/wAf////wAACkqUlK///////8pKv///ypf///9V////+AD/////AAAFKUVSj///////wqlP///JT' +
'////yR////wAP////8AAAFKqkpv///////JSlf//9Sv////U/////AB/////4AAAVIpKRf//////' +
'+ElV///pS////8of///4AP/////gAAASZVKr///////4qkj///Sn////0v////AA//////AAABUS' +
'VJH///////glJn//8pP////KH///8AH/////+AAACtUlVf//////+ClRP//qV////9K////gA///' +
'///4AAACEpJK///////8BSqf/+lX////yr///8AD//////wAAAVUqVH///////gUlU//5Rf////R' +
'P///gAf//////gAAApKqTP//////8AVSV//pU////6qf//+AD//////+AAAAqkki//////8AEpVL' +
'/+qP////1L///wAP//////4AAACSVVB/////+AFUpKX/9KP////Sv//+AB///////AAAAEqSgH//' +
'//+ACkpSUv/lV////6k///4AP//////+AAAAUlSgf////gAJKRUpf/ST////1J///AA///////4A' +
'AAAVJVB////gAtVFUpV/8lX///+Vf//4AH///////gAAABKSSD///wASSVVJSR/1Vf///8kf//gA' +
'///////+AAAABVUof//4AElUpKqqv/SL////1L//8AD///////4AAAABJJQ//8AFVJKVKSSP+qj/' +
'///Kv//gAf///////gAAAAKSpT/+ACkqSlKUkqf5Rf///6S//+AD///////+AAAAAKqpP/ABJKVS' +
'klKqU/xUf///qp//wAP///////4AAAAAkko+gASVKUlVKlKX/VK///9Sf/+AB////////gAAAACp' +
'UrgAKqVKVJKSlKf+Sl///0kf/4AP///////+AAAAABSVIAFJUlKqSUpKV/0pX//8qr//AA//////' +
'//8AAAAACklACSopKSVUqVKX/qpH//okv/4AH////////gAAAAAVVKBUpUqUkkpKSk//SSv/xVK/' +
'/AAAAAAD////AAAAAAJKWSUpVKVVUqVSp/+qqH9SlR/8AAAAAAH///4AAAAABSUklJSSlJJKUkpf' +
'/8klQFSo//gAAAAAA////wAAAAABVKqlUkqlSqkqqU//6pUqkkof8AAAAAAB/r//AAAAAAElEpSK' +
'qSlSSpJKL//pUqpVKr/wAAAAAAP8v/8AAAAAAJLKUqkkpSqkqSVf//yUkpKSv+AAAAAAAfqf/wAA' +
'AAAAVClKVVUoklUqqp///UpKVVS/wAAAAAAD+S//AAAAAAAlpSkkkpVKkpKSX///JVKTpR+AAAAA' +
'AAH9X/8AAAAAABRUpVJUqqSpSUlf///SSk/Sv4AAAAAAA/y//wAAAAAAFSVUlSUkUkpUqr////VS' +
'v9S/AAAAAAAB/3//AAAAAAAFUkpSlJMqqUpJP////13/pT////////////8AAAAAAAEpJSlSqUkk' +
'pVS////////Un////////////wAAAAAABJVSlSpUqpUpJX///////8q/////////////gAAAAAAC' +
'pSqkkpKSUpSSP///////5L////////////+AAAAAAACSkVVKSklKpVV///////+SX///////////' +
'/4AAAAAAAFSqJKlSqqiVSX///////9U/////////////gAAAAAAASpVSlSkklVJU////////yr//' +
'//////////+AAAAAAAAkpJSklKpKSUp////////kn////////////4AAAAAAABJSqlKqkqUqVf//' +
'/////5K/////////////gAAAAAAACpUlKpJKUqlI////////1L////////////+AAAAAAAAFSVKS' +
'SqkpFKX////////SX////////////4AAAAAAAAiklKlSSpTKKv///////9U/////////////wAAA' +
'AAAABSpSlSqlSiVJ////////pV/////////////AAAAAAAAVUpSkklSlUqX////////Uv///////' +
'/////8AAAAAAAAkqUpVJJSqpVf///////8pf////////////4AAAAAAAFJKUpKqUpJUT////////' +
'4r/////////////wAAAAAAAKqVKVKUqSSVX///////+Uv/////////////gAAAAAAASUlKSkpKql' +
'S////////+qf/////////////AAAAAAAEkpKUlUpJJCn////////iH///////////wAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4B+A8AH/AAAAA' +
'AAAAAAAAAAAAAA//AAfwD4H4HwAAf/4H4DwB//gAAAAAAAAAAAAAAAAAD/+AB/APgfgfAAB//wfw' +
'PAf/+AAAAAAAAAAAAAgAAAAP/8AH8AfB+D4AAH//B/g8D//4AAAAAAAAAAAADwAAAA//4A/4B8H4' +
'PgAAfB+H+DwP4HgAAAAAAAAAAAAPwAAAD4fgD/gHw/w+AAB8D4f8PB+AGAAAAAAAAAAAAA/wAAAP' +
'g+Af/AfD/D4AAHwPh/48HwAAAAAAAAAAAAAAB/4AAA+D4B98A+P8PAAAfA+Hvjw+AAAAAAAAAAAA' +
'AAAB/4AAD4PgH3wD4/x8AAB8H4e/PD4AAAAAAAAAAAAAAAB/8AAPh8A+PgPn/nwAAH//B5+8Pg/4' +
'AH/j/x/4/8f+AA/8AA//wD4+A+eefAAAf/4Hj7w+D/gAf+P/H/j/x/4AA/wAD/+APj4B5554AAB/' +
'/AeP/D4P+AB/4/8f+P/H/gAD/AAP/wB8HwH3nvgAAH/wB4f8Pw/4AH/j/x/4/8f+AA/8AA//AH//' +
'Af+f+AAAfAAHg/wfAPgAAAAAAAAAAAAAf/AAD5+A//+B/w/4AAB8AAeD/B+A+AAAAAAAAAAAAAH/' +
'gAAPj8D//4D/D/AAAHwAB4H8H+D4AAAAAAAAAAAAB/4AAA+H4P//gP8P8AAAfAAHgPwP//gAAAAA' +
'AAAAAAAP8AAAD4fh+A/A/w/wAAB8AAeA/Af/+AAAAAAAAAAAAA/AAAAPg/HwB8B+B+AAAHwAB4B8' +
'Af/4AAAAAAAAAAAADwAAAA+B+fAHwH4H4AAAfAAHgHwAf4AAAAAAAAAAAAAIAAAAD4H/8Afgfgfg' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAClAxLDEK');
// Tell the apple to print.
qz.print();
}
/***************************************************************************
* Prototype function for controlling print spooling between pages
* Usage:
* qz.setEndOfDocument('P1,1\r\n');
* qz.setDocumentsPerSpool('5');
* qz.appendFile('/path/to/file.txt');
* window['qzDoneAppending'] = function() { qz.print(); };
***************************************************************************/
function printPages() {
if (notReady()) { return; }
// Mark the end of a label, in this case P1 plus a newline character
// qz-print knows to look for this and treat this as the end of a "page"
// for better control of larger spooled jobs (i.e. 50+ labels)
qz.setEndOfDocument('P1,1\r\n');
// The amount of labels to spool to the printer at a time. When
// qz-print counts this many `EndOfDocument`'s, a new print job will
// automatically be spooled to the printer and counting will start
// over.
qz.setDocumentsPerSpool("2");
qz.appendFile(getPath() + "misc/epl_multiples.txt");
// Automatically gets called when "qz.appendFile()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print.
qz.print();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing a single XML node containing base64
* encoded data.
* Usage:
* qz.appendXML('/path/to/file.xml');
* window['qzDoneAppending'] = function() { qz.print(); };
***************************************************************************/
function printXML() {
if (notReady()) { return; }
// Appends the contents of an XML file from a SOAP response, etc.
// First parameter: A valid complete URL is required for the XML file.
// Second parameter: A valid XML tag/node name containing
// base64 encoded data, i.e. <node_1>aGVsbG8gd29ybGQ=</node_1>
// Example:
// qz.appendXML("http://yoursite.com/zpl.xml", "node_1");
qz.appendXML(getPath() + "misc/zpl_sample.xml", "v7:Image");
// Automatically gets called when "qz.appendXML()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print.
qz.print();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing hexadecimal formatted raw data
*
* Usage:
* qz.appendHex('00AABBCCDDEEFF');
* qz.appendHex('x00xAAxBBxCCxDDxEExFF');
* qz.print();
***************************************************************************/
function printHex() {
if (notReady()) { return; }
// Since 1.5.4, No backslashes needed (fixes \x00 NUL JavaScript bug)
// Can be in format "1B00" or "x1Bx00"
// EPL Sample Provided
qz.appendHex("4e0d0a713630390d0a513230332c32360d0a42352c32362c");
qz.appendHex("302c31412c332c372c3135322c422c2231323334220d0a41");
qz.appendHex("3331302c32362c302c332c312c312c4e2c22534b55203030");
qz.appendHex("303030204d46472030303030220d0a413331302c35362c30");
qz.appendHex("2c332c312c312c4e2c22515a205072696e7420506c756769");
qz.appendHex("6e220d0a413331302c38362c302c332c312c312c4e2c2254");
qz.appendHex("657374207072696e74207375636365737366756c220d0a41");
qz.appendHex("3331302c3131362c302c332c312c312c4e2c2266726f6d20");
qz.appendHex("73616d706c652e68746d6c220d0a413331302c3134362c30");
qz.appendHex("2c332c312c312c4e2c227072696e7448657828292066756e");
qz.appendHex("6374696f6e2e220d0a50312c310d0a");
// Send characters/raw commands to printer
qz.print();
}
/***************************************************************************
* Prototype function for printing a text or binary file containing raw
* print commands.
* Usage:
* qz.appendFile('/path/to/file.txt');
* window['qzDoneAppending'] = function() { qz.print(); };
***************************************************************************/
function printFile(file) {
if (notReady()) { return; }
// Append raw or binary text file containing raw print commands
qz.appendFile(getPath() + "misc/" + file);
// Automatically gets called when "qz.appendFile()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print.
qz.print();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing a graphic to a PostScript capable printer.
* Not to be used in combination with raw printers.
* Usage:
* qz.appendImage('/path/to/image.png');
* window['qzDoneAppending'] = function() { qz.printPS(); };
***************************************************************************/
function printImage(scaleImage) {
if (notReady()) { return; }
// Optional, set up custom page size. These only work for PostScript printing.
// setPaperSize() must be called before setAutoSize(), setOrientation(), etc.
if (scaleImage) {
qz.setPaperSize("8.5in", "11.0in"); // US Letter
//qz.setPaperSize("210mm", "297mm"); // A4
qz.setAutoSize(true);
//qz.setOrientation("landscape");
//qz.setOrientation("reverse-landscape");
//qz.setCopies(3); //Does not seem to do anything
}
// Append our image (only one image can be appended per print)
qz.appendImage(getPath() + "img/image_sample.png");
// Automatically gets called when "qz.appendImage()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print PostScript.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing a PDF to a PostScript capable printer.
* Not to be used in combination with raw printers.
* Usage:
* qz.appendPDF('/path/to/sample.pdf');
* window['qzDoneAppending'] = function() { qz.printPS(); };
***************************************************************************/
function printPDF() {
if (notReady()) { return; }
// Append our pdf (only one pdf can be appended per print)
qz.appendPDF(getPath() + "misc/pdf_sample.pdf");
// Automatically gets called when "qz.appendPDF()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print PostScript.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
/***************************************************************************
* Prototype function for printing plain HTML 1.0 to a PostScript capable
* printer. Not to be used in combination with raw printers.
* Usage:
* qz.appendHTML('<h1>Hello world!</h1>');
* qz.printPS();
***************************************************************************/
function printHTML() {
if (notReady()) { return; }
// Preserve formatting for white spaces, etc.
var colA = fixHTML('<h2>* QZ Print Plugin HTML Printing *</h2>');
colA = colA + '<color=red>Version:</color> ' + qz.getVersion() + '<br />';
colA = colA + '<color=red>Visit:</color> http://code.google.com/p/jzebra';
// HTML image
var colB = '<img src="' + getPath() + 'img/image_sample.png">';
// Append our image (only one image can be appended per print)
qz.appendHTML('<html><table face="monospace" border="1px"><tr height="6cm">' +
'<td valign="top">' + colA + '</td>' +
'<td valign="top">' + colB + '</td>' +
'</tr></table></html>');
qz.printHTML();
}
/***************************************************************************
* Prototype function for getting the primary IP or Mac address of a computer
* Usage:
* qz.findNetworkInfo();
* window['qzDoneFindingNetwork'] = function() {alert(qz.getMac() + ',' +
* qz.getIP()); };
***************************************************************************/
function listNetworkInfo() {
if (isLoaded()) {
// Makes a quick connection to www.google.com to determine the active interface
// Note, if you don't wish to use google.com, you can customize the host and port
// qz.getNetworkUtilities().setHostname("qzindustries.com");
// qz.getNetworkUtilities().setPort(80);
qz.findNetworkInfo();
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFindingNetwork'] = function() {
alert("Primary adapter found: " + qz.getMac() + ", IP: " + qz.getIP());
// Remove reference to this function
window['qzDoneFindingNetwork'] = null;
};
}
}
/***************************************************************************
* Prototype function for printing an HTML screenshot of the existing page
* Usage: (identical to appendImage(), but uses html2canvas for png rendering)
* qz.setPaperSize("8.5in", "11.0in"); // US Letter
* qz.setAutoSize(true);
* qz.appendImage($("canvas")[0].toDataURL('image/png'));
***************************************************************************/
function printHTML5Page() {
$("#content").html2canvas({
canvas: hidden_screenshot,
onrendered: function() {
if (notReady()) { return; }
// Optional, set up custom page size. These only work for PostScript printing.
// setPaperSize() must be called before setAutoSize(), setOrientation(), etc.
qz.setPaperSize("8.5in", "11.0in"); // US Letter
qz.setAutoSize(true);
qz.appendImage($("canvas")[0].toDataURL('image/png'));
// Automatically gets called when "qz.appendFile()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
});
}
/***************************************************************************
* Prototype function for logging a PostScript printer's capabilites to the
* java console to expose potentially new applet features/enhancements.
* Warning, this has been known to trigger some PC firewalls
* when it scans ports for certain printer capabilities.
* Usage: (identical to appendImage(), but uses html2canvas for png rendering)
* qz.setLogPostScriptFeatures(true);
* qz.appendHTML("<h1>Hello world!</h1>");
* qz.printPS();
***************************************************************************/
function logFeatures() {
if (isLoaded()) {
var logging = qz.getLogPostScriptFeatures();
qz.setLogPostScriptFeatures(!logging);
alert('Logging of PostScript printer capabilities to console set to "' + !logging + '"');
}
}
/***************************************************************************
* Prototype function to force Unix to use the terminal/command line for
* printing rather than the Java-to-CUPS interface. This will write the
* raw bytes to a temporary file, then execute a shell command.
* (i.e. lpr -o raw temp_file). This was created specifically for OSX but
* may work on several Linux versions as well.
* qz.useAlternatePrinting(true);
* qz.append('\n\nHello World!\n\n');
* qz.print();
***************************************************************************/
function useAlternatePrinting() {
if (isLoaded()) {
var alternate = qz.isAlternatePrinting();
qz.useAlternatePrinting(!alternate);
alert('Alternate CUPS printing set to "' + !alternate + '"');
}
}
/***************************************************************************
* Prototype function to list all available com ports availabe to this PC
* used for RS232 communication. Relies on jssc_qz.jar signed and in the
* /dist/ folder.
* qz.findPorts();
* window['qzDoneFindingPorts'] = function() { alert(qz.getPorts()); };
***************************************************************************/
function listSerialPorts() {
if (isLoaded()) {
// Search the PC for communication (RS232, COM, tty) ports
qz.findPorts();
// Automatically called when "qz.findPorts()" is finished
window['qzDoneFindingPorts'] = function() {
var ports = qz.getPorts().split(",");
for (p in ports) {
if (p == 0) {
document.getElementById("port_name").value = ports[p];
}
alert(ports[p]);
}
// Remove reference to this function
window['qzDoneFindingPorts'] = null;
};
}
}
/***************************************************************************
* Prototype function to open the specified communication port for 2-way
* communication.
* qz.openPort('COM1');
* qz.openPort('/dev/ttyUSB0');
* window['qzDoneOpeningPort'] = function(port) { alert(port); };
***************************************************************************/
function openSerialPort() {
if (isLoaded()) {
qz.openPort(document.getElementById("port_name").value);
// Automatically called when "qz.openPort()" is finished (even if it fails to open)
window['qzDoneOpeningPort'] = function(portName) {
if (qz.getException()) {
alert("Could not open port [" + portName + "] \n\t" +
qz.getException().getLocalizedMessage());
qz.clearException();
} else {
alert("Port [" + portName + "] is open!");
}
};
}
}
/***************************************************************************
* Prototype function to close the specified communication port.
* qz.closePort('COM1');
* qz.closePort('/dev/ttyUSB0');
* window['qzDoneClosingPort'] = function(port) { alert(port); };
***************************************************************************/
function closeSerialPort() {
if (isLoaded()) {
qz.closePort(document.getElementById("port_name").value);
// Automatically called when "qz.closePort() is finished (even if it fails to close)
window['qzDoneClosingPort'] = function(portName) {
if (qz.getException()) {
alert("Could not close port [" + portName + "] \n\t" +
qz.getException().getLocalizedMessage());
qz.clearException();
} else {
alert("Port [" + portName + "] closed!");
}
};
}
}
/***************************************************************************
* Prototype function to send data to the open port
* qz.setSerialBegin(chr(2));
* qz.setSerialEnd(chr(13));
* qz.setSerialProperties("9600", "7", "1", "even", "none");
* qz.send("COM1", "\nW\n");
***************************************************************************/
function sendSerialData() {
if (isLoaded()) {
// Beggining and ending patterns that signify port has responded
// chr(2) and chr(13) surround data on a Mettler Toledo Scale
qz.setSerialBegin(chr(2));
qz.setSerialEnd(chr(13));
// Baud rate, data bits, stop bits, parity, flow control
// "9600", "7", "1", "even", "none" = Default for Mettler Toledo Scale
qz.setSerialProperties("9600", "7", "1", "even", "none");
// Send raw commands to the specified port.
// W = weight on Mettler Toledo Scale
qz.send(document.getElementById("port_name").value, "\nW\n");
// Automatically called when "qz.send()" is finished waiting for
// a valid message starting with the value supplied for setSerialBegin()
// and ending with with the value supplied for setSerialEnd()
window['qzSerialReturned'] = function(portName, data) {
if (qz.getException()) {
alert("Could not send data:\n\t" + qz.getException().getLocalizedMessage());
qz.clearException();
} else {
if (data == null || data == "") { // Test for blank data
alert("No data was returned.")
} else if (data.indexOf("?") !=-1) { // Test for bad data
alert("Device not ready. Please wait.")
} else { // Display good data
alert("Port [" + portName + "] returned data:\n\t" + data);
}
}
};
}
}
/***************************************************************************
****************************************************************************
* * HELPER FUNCTIONS **
****************************************************************************
***************************************************************************/
/***************************************************************************
* Gets the current url's path, such as http://site.com/example/dist/
***************************************************************************/
function getPath() {
var path = window.location.href;
return path.substring(0, path.lastIndexOf("/")) + "/";
}
/**
* Fixes some html formatting for printing. Only use on text, not on tags!
* Very important!
* 1. HTML ignores white spaces, this fixes that
* 2. The right quotation mark breaks PostScript print formatting
* 3. The hyphen/dash autoflows and breaks formatting
*/
function fixHTML(html) {
return html.replace(/ /g, "&nbsp;").replace(/’/g, "'").replace(/-/g,"&#8209;");
}
/**
* Equivelant of VisualBasic CHR() function
*/
function chr(i) {
return String.fromCharCode(i);
}
/***************************************************************************
* Prototype function for allowing the applet to run multiple instances.
* IE and Firefox may benefit from this setting if using heavy AJAX to
* rewrite the page. Use with care;
* Usage:
* qz.allowMultipleInstances(true);
***************************************************************************/
function allowMultiple() {
if (isLoaded()) {
var multiple = qz.getAllowMultipleInstances();
qz.allowMultipleInstances(!multiple);
alert('Allowing of multiple applet instances set to "' + !multiple + '"');
}
}
/***************************************************************************
* Prototype functions for demo the setPaperSize problem.
***************************************************************************/
function findPrinter1() {
// Fix printer1 name to anyname
var p = 'printer1';
if (isLoaded()) {
// Searches for locally installed printer with specified name
qz.findPrinter(p);
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
var p = document.getElementById('printer');
var printer = qz.getPrinter();
// Alert the printer name to user
alert(printer !== null ? 'Printer found: "' + printer +
'" after searching for "' + p.value + '"' : 'Printer "' +
p.value + '" not found.');
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
function findPrinter2() {
// Fix printer2 name to anyname
var p = 'printer2';
if (isLoaded()) {
// Searches for locally installed printer with specified name
qz.findPrinter(p);
// Automatically gets called when "qz.findPrinter()" is finished.
window['qzDoneFinding'] = function() {
var p = document.getElementById('printer');
var printer = qz.getPrinter();
// Alert the printer name to user
alert(printer !== null ? 'Printer found: "' + printer +
'" after searching for "' + p.value + '"' : 'Printer "' +
p.value + '" not found.');
// Remove reference to this function
window['qzDoneFinding'] = null;
};
}
}
function printImage1() {
if (notReady()) { return; }
//this is the size on Printer1
//
//qz.setOrientation("portrait");
qz.setPaperSize("0.74in", "11.3in");
qz.setAutoSize(true);
//qz.setOrientation("portrait");
qz.appendImage(getPath() + "img/image_sample.png");
//
// Automatically gets called when "qz.appendImage()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print PostScript.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
function printImage2() {
if (notReady()) { return; }
//this is the size on Printer2
//qz.setPaperSize("82.55mm", "127.0mm");
qz.setPaperSize("3.22in", "5.0in");
qz.setAutoSize(true);
//qz.setOrientation("portrait");
qz.appendImage(getPath() + "img/image_sample_bw.png");
// Automatically gets called when "qz.appendImage()" is finished.
window['qzDoneAppending'] = function() {
// Tell the applet to print PostScript.
qz.printPS();
// Remove reference to this function
window['qzDoneAppending'] = null;
};
}
</script>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript" src="js/html2canvas.js"></script>
<script type="text/javascript" src="js/jquery.plugin.html2canvas.js"></script>
</head>
<body id="content" bgcolor="#FFF380">
<div style="position:absolute;top:0;left:5;"><h1 id="title">QZ Print Plugin</h1></div><br /><br /><br />
<table border="1px" cellpadding="5px" cellspacing="0px"><tr>
<td valign="top"><h2>Sample Problem</h2>
<input type="button" onClick="findPrinter1()" value="1 Detect Printer 1"><br />
<input type="button" onClick="printImage1()" value="2 Print on Printer 1"><br />
<input type="button" onClick="findPrinter2()" value="3 Detect Printer 2"><br />
<input type="button" onClick="printImage2()" value="4 Print on Printer 2"><br />
<td valign="top"><h2>All Printers</h2>
<input type="button" onClick="findPrinter()" value="Detect Printer"><br />
<input id="printer" type="text" value="zebra" size="15"><br />
<input type="button" onClick="findPrinters()" value="List All Printers"><br />
<input type="button" onClick="useDefaultPrinter()" value="Use Default Printer"><br /><br />
<!-- NEW QZ APPLET TAG USAGE -- RECOMMENDED -->
<!--
<applet id="qz" archive="./qz-print.jar" name="QZ Print Plugin" code="qz.PrintApplet.class" width="55" height="55">
<param name="jnlp_href" value="qz-print_jnlp.jnlp">
<param name="cache_option" value="plugin">
<param name="disable_logging" value="false">
<param name="initial_focus" value="false">
</applet><br />
-->
<!-- OLD JZEBRA TAG USAGE -- FOR UPGRADES -->
<!--
<applet name="jzebra" archive="./qz-print.jar" code="qz.PrintApplet.class" width="55" height="55">
<param name="jnlp_href" value="qz-print_jnlp.jnlp">
<param name="cache_option" value="plugin">
<param name="disable_logging" value="false">
<param name="initial_focus" value="false">
<param name="printer" value="zebra">
</applet><br />
-->
</td><td valign="top"><h2>Raw Printers Only</h2>
<a href="http://qzindustries.com/WhatIsRawPrinting" target="new">What is Raw Printing?</a><br /><br />
<input type="button" onClick="printEPL()" value="Print EPL" /><br />
<input type="button" onClick="printZPL()" value="Print ZPL" /><br /><br />
<input type="button" onClick="printESCP()" value="Print ESCP" /><br />
<a href="javascript:findPrinter('Epson');">Epson</a>&nbsp;
<a href="javascript:findPrinter('Citizen');">Citizen</a>&nbsp;
<a href="javascript:findPrinter('Star');">Star</a> <br /><br />
<input type="button" onClick="printEPCL()" value="Print EPCL" /><br />
(Zebra Card Printer)<br /><br />
<input type="button" onClick="print64()" value="Print Base64" /><br />
<input type="button" onClick="printPages()" value="Print Spooling Every 2" /><br />
<input type="button" onClick="printXML()" value="Print XML" /><br />
<input type="button" onClick="printHex()" value="Print Hex" /><br /><br />
<input type="button" onClick="printFile('zpl_sample.txt')" value="zpl_sample.txt" /><br />
<input type="button" onClick="printFile('fgl_sample.txt')" value="fgl_sample.txt" /><br />
<input type="button" onClick="printFile('epl_sample.txt')" value="epl_sample.txt" /><br /><br />
<input type="button" onClick="printToFile()" value="Print To File" /><br />
<input type="button" onClick="printToHost()" value="Print To Host" /><br />
<input type="button" onClick="useAlternatePrinting()" value="Use Alternate Printing" /><br />
</td><td valign="top"><h2>PostScript Printers Only</h2>
<a href="http://qzindustries.com/WhatIsPostScriptPrinting" target="new">What is PostScript Printing?</a><br />
<p>First find <a href="javascript:findPrinter('XPS');">Microsoft XPS</a> or <a href="javascript:findPrinter('PDF');">PDF</a> printer</p>
<input type="button" onClick="printHTML()" value="Print HTML" /><br />
<input type="button" onClick="printPDF()" value="Print PDF" /><br />
<input type="button" onClick="printImage(false)" value="Print PostScript Image" /><br />
<input type="button" onClick="printImage(true)" value="Print Scaled PostScript Image" /><br />
<input type="button" onClick="printHTML5Page()" value="Print Current Page" /><br />
<input type="button" onClick="logFeatures()" value="Log Printer Features on Print" /><br />
</td><td valign="top"><h2>Serial</h2>
<input type="button" id="list_ports" onClick="listSerialPorts()" value="List Serial Ports" /><br />
<input type=text id="port_name" size="8" />
<input type="button" id="open_port" onClick="openSerialPort()" value="Open Port" /><br />
<input type="button" id="send_data" onClick="sendSerialData()" value="Send Port Cmd" /><br />
<input type="button" id="close_port" onClick="closeSerialPort()" value="Close Port" /><br />
<hr /><h2>Misc</h2>
<input type="button" onClick="listNetworkInfo()" value="List Network Info" /><br />
<input type="button" onClick="allowMultiple()" value="Allow Multiple Applets" /><br /></td></tr></table>
</body><canvas id="hidden_screenshot" style="display:none;"></canvas>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment