1、实现页面内容的直接打印,跳过预览页面
var win = nw.Window.get();
win.print({printer: "HP LaserJet 1020",headerFooterEnabled:false})
(这里的print函数是nw经过包装的,可以传入打印参数进行,不同于DOM中的window.print函数)
参数中需要传入打印机名,如果没提供打印机名则会停在预览页面,手动选择打印机,再打印;
打印机名可通过win.getPrinters()读取,在返回的打印机数组中读取deviceName属性;
因为无法读取系统默认打印机名,所以可以生成一个select给用户选择然后保存起来。
// ==读取打印机信息,用localStorage保存用户设置
win.getPrinters(function(data){
var str="";
for (var i=0; i<data.length; i++){
str += "<option value='" + data[i].deviceName + "' >" + data[i].printerName + "</option>";
}
$("#printer_selector").innerHTML = str;
var myPrinter = localStorage.getItem("myprinter");
if(!myPrinter){
alert("首次使用请先设置打印机!!!");
$('#setting_box').showModal();
}else{
$("#printer_selector").value = myPrinter;
}
});
//页面中设置一个打印机的对话框HTML
<dialog id="setting_box" class="noprint">
<p>打印机设置:<select id="printer_selector"></select></p>
<p><input type="button" value="保存" onclick="localStorage.setItem('myprinter',$('printer_selector').value)"></p>
</dialog>
2、导出PDF(其实就是使用了Chrome浏览器打印功能中的“另存为PDF”的功能)
win.print({pdf_path:"D:/file.pdf",headerFooterEnabled:false})
参数需要传入完整的pdf文件名,才会跳过预览界面,如果没有提供文件名也会停在预览页面,需要手动 “另存为PDF”。
为了跳过难看的预览界面,我们可先使用nw中的另存文件对话框的功能,让用户选择保存的文件名,然后再调用win.print();
1)首先做一个文件标签,注意加上nwsaveas属性,并隐藏起来(因为也很难看)
<input type="file" nwsaveas="savefile.pdf" id="savepath" onchange="printPage(true)" style="display:none;">
2)再做一个导出PDF的按钮,模拟点击文件标签
<input type="button" value="导出PDF" onclick="$('savepath').value='';$('savepath').click();">
3、因为打印和导出PDF都是用win.print(),所以我们可以做在一个函数里面,打印和导出均执行这个函数即可
// 打印和导出PDF函数(参数传入true,及执行导出PDF)
function printPage(isPDF){
if(isPDF){
win.print({pdf_path:$("#savepath").value,headerFooterEnabled:false});
}else{
win.print({printer:localStorage.getItem("myprinter"),headerFooterEnabled:false});
}
}
4、注册表中的默认打印机(可读取注册表获取默认打印机?有机会再试试)
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows
位置下的Device键值,“devicename,,,***”为逗号分隔的字符串,第一部分即为默认打印机的deviceName