標籤:dir reg cancel 修改 jdk confirm 印表機 system div
最近項目中用到了印表機,最開始的完全不懂,現在弄好了,所以做了總結,該篇包括背景調用列印(兩種方式)跟前端的js的列印,但是只有IE現在支援列印,而且如果想遠端連線印表機,二維碼的產生和直接由印表機的命令進行操作,就要把修改瀏覽器的安全配置,下面再做詳細的介紹
第一種後台列印: 使用
javax中的
Prin
tServiceLookup類進行列印,可以直接調用預設的印表機,也可以使用下列的方法進行篩選列印:
PrintServiceLookup.
look
u
pMu
lt
iDocPrintServices(
flavors
,
attributes); 可執行代碼如下:
public static void main(String[] args) { FileInputStream textStream = null; try { textStream = new FileInputStream("地址"); } catch (FileNotFoundException e) { e.printStackTrace(); } if (textStream != null) // 當列印內容不為空白時 { // 指定列印輸出格式 DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;//SERVICE_FORMATTED.PRINTABLE // 定位預設的列印服務 PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); // 建立列印工作 DocPrintJob job = printService.createPrintJob(); // 設定列印屬性 PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); // 設定紙張大小,也可以建立MediaSize類來自訂大小 pras.add(MediaSizeName.ISO_A4); DocAttributeSet das = new HashDocAttributeSet(); // 指定列印內容 Doc doc = new SimpleDoc(textStream, flavor, das); // 不顯示列印對話方塊,直接進行列印工作 try { job.print(doc, pras); // 進行每一頁的具體列印操作 } catch (PrintException pe) { pe.printStackTrace(); } } else { // 如果列印內容為空白時,提示使用者列印將取消 JOptionPane.showConfirmDialog(null, "Sorry, Printer Job is Empty, Print Cancelled!", "Empty", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); } }
第二種後台列印: 注意:第二種跟第三種列印使用的是印表機的命令進行操作,這裡需要
jna的jar包,還有jdk要求是32位的,並且要要註冊對應的dll,對應不同的系統要在不同的Windows下進行
註冊DLL,註冊成功之後需要
win+R ,調用並運行
Regsvr32.exe TSCActiveX.dll 指令
可執行代碼如下:
public class JavaDemo { public interface TscLibDll extends Library { TscLibDll INSTANCE = (TscLibDll) Native.loadLibrary("TSCLIB", TscLibDll.class); int about(); int openport(String pirnterName); int closeport(); int sendcommand(String printerCommand); int setup(String width, String height, String speed, String density, String sensor, String vertical, String offset); int downloadpcx(String filename, String image_name); int barcode(String x, String y, String type, String height, String readable, String rotation, String narrow, String wide, String code); int printerfont(String x, String y, String fonttype, String rotation, String xmul, String ymul, String text); int clearbuffer(); int printlabel(String set, String copy); int formfeed(); int nobackfeed(); int windowsfont(int x, int y, int fontheight, int rotation, int fontstyle, int fontunderline, String szFaceName, String content); } public static void main(String[] args) { System.setProperty("jna.encoding", "GBK");// 支援中文 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = df.format(new Date()); String qrCode = "PD102011"; TscLibDll.INSTANCE.openport("TSC TTP-244 Pro");//印表機型號 TscLibDll.INSTANCE.setup("70","40","5","8","0","2","0"); TscLibDll.INSTANCE.clearbuffer(); String command = "QRCODE 120,90,Q,8,A,0,M1,S7,\"" + qrCode+"\""; //列印二維碼的參數和內容 TscLibDll.INSTANCE.sendcommand(command); //傳送指令 TscLibDll.INSTANCE.sendcommand("TEXT 300 70 36 0 0 0 arial"+ "辦公耗材-標籤紙"); //TscLibDll.INSTANCE.windowsfont(300, 70, 36, 0, 0, 0, "arial", "辦公耗材-標籤紙"); TscLibDll.INSTANCE.printlabel("1", "1"); TscLibDll.INSTANCE.closeport(); }}
注意:這種列印方式,需要USB串連(ttp-244 pro),如果想線上產生,遠端連線,需要使用第三種方式
第三種JS列印 在使用JS進行列印的時候要主要瀏覽器的限制,目前只有IE瀏覽器進行支援,在進行列印時,控制台出現Automation 伺服器不能建立對象的,請調節瀏覽器的安全中的自訂層級中的ActiveX中相關的設定為啟用,代碼如下:
<script type="text/javascript"> function printQRcode(){ var TSCObj = new ActiveXObject("TSCActiveX.TSCLIB");//印表機使用的dll //TSCObj.ActiveXabout(); // 印表機資訊 TSCObj.ActiveXopenport ("TSC TTP-244 Pro");//印表機名稱,不能寫錯 //TSCObj.ActiveXdownloadpcx ("D:/myeclipseproject/filesManager/trunk/doc/02-參考資料/03-二維碼印表機/01-開發協助/PHP調用範例/TSCActiveX.DLL-PHP-Example/","123.PCX"); TSCObj.ActiveXsetup("70","40","4","15","0","2.5","0");//印表機設定 //TSCObj.ActiveXsetup("標籤寬度","標籤高度","列印速度","列印濃度(0-15)","感應器類別字串型,0 表示使用垂直間距感測器(gap sensor), 1 表示使用黑標感測器(black mark senso)","Gap/Black mark垂直間距(mm)","Gap/Black mark位移距離(mm)"); //TSCObj.ActiveXformfeed(); //TSCObj.ActiveXnobackfeed(); TSCObj.ActiveXsendcommand("DIRECTION 1"); //設定標籤方向 ,DIRECTION 1 左上方 (x,y)={0,0};DIRECTION 0 右下角 (x,y)={0,0}; TSCObj.ActiveXsendcommand ("SET TEAR ON"); TSCObj.ActiveXclearbuffer(); //TSCObj.ActiveXsendcommand ("PUTPCX 0,0,\"123.PCX\""); /* 1、ActiveXprinterfont採用機器內建編碼通常用來打英文。 2、ActiveXwindowsfont可以輸出漢字,但是必須是系統中存在的字型。 TSCObj.ActiveXprinterfont ("a","b","c","d","e","f","g"); a:字串,文字X方向起始點,以點表示。 b:字串,文字Y方向起始點,以點表示。 c:內建字型名稱,共12種(1: 8*12 dots 2: 12*20 dots 3: 16*24 dots 4: 24*32 dots 5: 32*48 dots TST24.BF2: 繁體中文 24*24 TST16.BF2: 繁體中文 16*16 TTT24.BF2: 繁體中文 24*24 (電信碼) TSS24.BF2: 簡體中文 24*24 TSS16.BF2: 簡體中文 16*16 K: 韓文 24*24 L: 韓文 16*16 ) d:字串,旋轉角度 e:字串,X方向放大倍率1-8 f:字串,Y方向放大倍率1-8 g:字串,列印內容 ActiveXwindowsfont(a,b,c,d,e,f,g,h) 說明:使用Windows TTF字型列印文字。 參數: a:整數類型,文字X方向起始點,以點表示。 b:整數類型,文字Y方向起始點,以點表示。 c:整數類型,字型高度,以點表示。 d:整數類型,旋轉角度,逆時針方向旋轉。0-旋轉0°,90-旋轉90°,180-旋轉180°,270-旋轉270°。 e:整數類型,字型外形。0:標籤;1:斜體;2:粗體;3:粗斜體。 f:整數類型,底線,0:無底線;1:加底線。 g:字串類型,字型名稱。如:Arial,Times new Roman。 h:字串類型,列印文字內容。 */// TSCObj.ActiveXwindowsfont (500, 200, 48, 90, 0, 0, "Arial", "\u7f16\u7801"); TSCObj.ActiveXwindowsfont (260, 60, 60, 0, 2, 0, "Arial", "XX專用"); //var cmd = ‘QRCODE 條碼X方向起始點,條碼Y方向起始點,錯誤修正層級,二維碼高度,A(A和M),旋轉角度,M2(分為類型1和類型2),S1 (s1-s8,預設s7),\"1231你好2421341325454353\"‘; var cmd = ‘QRCODE 80,80,H,7,A,0,M2,S1,\"‘+"123456789"+‘\"‘; TSCObj.ActiveXsendcommand(cmd); TSCObj.ActiveXwindowsfont (280, 150, 40, 0, 0, 0, "Arial", "123456789"); TSCObj.ActiveXwindowsfont (180, 260, 30, 0, 0, 0, "Arial", "XXXXXXXX"); TSCObj.ActiveXprintlabel ("1","1");//(列印份數,每頁列印張數) TSCObj.ActiveXclearbuffer();//清除 TSCObj.ActiveXcloseport();//關閉列印連接埠} </script>
謝謝!!!
Java調用TSC印表機進行列印