日期:2014-05-16  浏览次数:20457 次

用javascript判定在.pirnt()方法调用前其是否为虚拟打印机的问题

有使用者提出jatoolsPrinter打印控件的功能需求如下:

?

打印前判断一下是真实打印机还是虚拟打印机,以防止有些需要打印份数限制的文档被打印到虚拟打印机后行形成电子文档,导致无法控制打印份数。

?

做为基本使用原理可以使用以下方法,来判断其是否为虚似打印机:

?

function isVirtualPrinter(){ ? ??

? ? ? ? ?var port = jatoolsPrinter.getPrinterInfo('联想 laser jet').port; ? ? // 通过jatoolsPrinter取得打印机的port ? ??

? ? ? ? ?return port.match(/(usb|lpt|com)/i); ? ? // 一般不是虚拟打印机,都直接输出到 usb,lpt,com等物理端口

}

?

?

原理是取得打印机端口信息,一般虚拟打印机,不用物理端口,用一些非常怪的端口地址,下面是常用的虚拟打印机端口:

pdffactory : FPP3

pdfcreator: pdfcmon

xps writer: XPSPort

?

?

?

具体到jatoolsPrinter打印控件下的代码为:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="stylesheet" type="text/css" href="guide.css" />

<title>判断是否是虚拟打印机</title>

<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"></OBJECT> ?//打印控件的设置(不需改动)

<script type="text/javascript">

function loadPrinters()

{

//打印文档对象

?

? ? ?var printers = jatoolsPrinter.getPrinters(); ? // 打印机列表是一个字符串数组

? ? ?if(printers)

? ? ?{

? ? ? ? ?for (i=0;i< printers.length;i++)

? ? ? ? ? ? ?printer_list.options[i+1]=new Option(printers[i],printers[i]);

? ? ? ? ? ? ?

? ? ? ? ?printer_list.options[0].selected = true;

? ? ?}

}

function testVirtual()

{

if(printer_list.value)

{

var port = jatoolsPrinter.getPrinterInfo(printer_list.value).port;

var virtual = !port.match(/(usb|lpt|com)/i);

document.getElementById('isVirtual').innerText=virtual ? '是':'否';

}

}

?

</script>

</head>

<body onload='loadPrinters()'>

<p ?class="normal"> 选择打印机:

? <select name="printer_list" onchange='testVirtual()'>

? ? <option>--默认--</option>

? </select>

? <br>

? 虚拟打印机? <span style='font-weight:700' id='isVirtual'></span>

</p>

</body>有

</html>

?

当然如果你偏说要将虚拟打印机的端口设置为LPT3或其他没有用过的端口,那么也没办法,毕竟就现阶段而言window也没有相关的api来区分打印机是虚拟或是真实。

?