NWJS实现页面打印和导出PDF

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

--- END ---