웹에서 로컬 프린터 호출 - Java 구현

아이디어 실현:
자바로 로컬 프린터 기능을 호출하여 자바 프로그램을 실행 가능한 파일로 포장하고 로컬 등록표에 URL 프로토콜을 추가합니다. 마지막으로 웹측은 이 프로토콜을 통해 로컬 exe 프로그램을 시작하여 인쇄합니다.
구현 프로세스:
1. 32비트 TSCActiveX를 다운로드합니다.dll, 윈도우즈 환경에 등록, 명령은 Regsvr32.exe TSCActiveX.dll 다운로드 주소:https://download.csdn.net/download/u010188178/10642451
2. 자바 프로젝트 만들기(이 단계는 하지 않아도 된다. 왜냐하면 나는 일반 자바 프로젝트로 결국 실패했기 때문이다. 여기서 당시의 해결 과정을 설명하기 위해서이다)
3. 핵심 코드(페이지 하단 참조), 여기에 외부 패키지 jna-3.0.9를 도입해야 한다.jar
4. 입구 클래스(main 방법 클래스)를 추가한 다음jar 파일로 포장
5,jar를 실행,java-jar*****.jar
이때 "Class not fond"를 잘못 보내서 com을 찾을 수 없습니다.sun.jna.Library, 타사 패키지 도입 실패, 솔루션: 참조https://blog.csdn.net/u010188178/article/details/82454220
문제가 해결되었습니다. 이 단계에서jar 파일을 실행하여 로컬 인쇄를 호출할 수 있습니다.
6. exe4j를 사용하여jar 파일을 exe 파일 도구로 포장하고 사용 설명의 다운로드 주소:https://download.csdn.net/download/u010188178/10643229
exe 파일을 생성한 후 실행합니다.그리고 또 오류 보고:java.lang.NoClass Def Found Error:com/sun/jna/Library, 위에서 보고한 오류 원인과 유사하여 제3자 가방을 찾을 수 없습니다.
여러 차례의 시도에 실패하여 결국 해결하지 못했기 때문에 상기에서 언급한 제2단계로 돌아가면 일반 공사에서 제3자jar백을 도입하여 자신의 포장 과정에 이렇게'불행'할 수 있기 때문에 마벤트를 사용하여 프로젝트를 구축하고 포장할 생각이다.웹 쪽과exe 실행 프로그램 간의 매개 변수 전달 문제를 고려하여springboot+maven 프로젝트를 사용하기로 결정했습니다.핵심 코드는 변하지 않으며, 다른 절차와 마찬가지로 최종적으로 실행 가능한exe 파일을 생성합니다.
7. 사용자 정의 URL 프로토콜 추가
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\TscPrint]

"URL Protocol"="D:\\test\\tsc_printer.exe"

@="TscPrintProtocol"

[HKEY_CLASSES_ROOT\TscPrint\DefaultIcon]

@="D:\\test\\tsc_printer.exe,1"

[HKEY_CLASSES_ROOT\TscPrint\shell]

[HKEY_CLASSES_ROOT\TscPrint\shell\open]

[HKEY_CLASSES_ROOT\TscPrint\shell\open\command]

@="\"D:\\test\\tsc_printer.exe\" \"%1\""

 
8, 페이지에서 사용자 정의 프로토콜 시작 프린터 호출
 
참고 사항:
1. 프린터의 명령을 사용하여 조작한다. 여기에 jna의jar 패키지가 필요하고 jdk의 요구는 32비트이며 대응하는 dll을 등록해야 한다. 대응하는 시스템은 서로 다른 윈도에서 DLL을 등록해야 한다. 등록이 성공한 후에 win+R이 필요하고 Regsvr32를 호출하고 실행해야 한다.exe TSCActiveX.dll 명령
2、제3자jar 패키지, jna 필요
3. 그림을 인쇄하는 지령인'PUTPCX'는 단색 PCX 이미지만 지원하고 프린터에 올리기 전에 그림을 단색 PCX 형식으로 변환해야 한다.
변환 단계:
(1) 그림을 단색 비트맵으로 변환한다. 예를 들어 윈도우즈 자체 그림 그리기 도구를 사용할 수 있다. 그림 열기 - 단색 비트맵으로 저장
(2) 단색 비트맵을 PCX 형식으로 변환한다. 예를 들어 PS 도구로 PCX로 저장할 수 있다.
(당시 이 문제를 해결한 과정에 대해 말하자면 프린터 PUTPCX 명령을 호출하여 그림을 인쇄하는 것은 시종 성공하지 못했다. 그리고 이 모델의 프린터 프로그래밍 API를 읽고 이 명령은 단색 PCX 이미지만 지원한다고 언급하여 PCX에 창을 겨누었다. 인터넷 조회를 통해 PCX 형식의 헤드 파일 구조를 이해하면 단색은 이런 두 가지 특징을 가지고 있어야 한다. 즉, 파일 헤드 3바이트의'비트/픽셀'이다.값이 1이고 65바이트 평면수도 1이다.이러한 것을 알게 된 후 흥분해 마지않았다. 자신이 대학 시절에 도상은사 기술을 배웠기 때문에 이미지 헤더 파일의 일부 위치를 수정함으로써 그림이 이상하게 보이지 않기 때문에 당연히 제3과 65 바이트의 16진수 값을 직접 수정하고 싶었다.그리고 그림을 저장하고 프린터를 호출하여 인쇄에 성공했지만 그림이 완전히 변형된 것을 발견했다. 이것은 PCX 포맷 파일 헤더의 이 두 위치는 직접 수정할 수 없다는 것을 의미한다.마지막으로 기술 담당자의 지시를 받아 PCX를 단색으로 변환하는 방법을 모르는데 왜 다른 포맷의 그림을 단색으로 변환하지 않고 PCX 포맷으로 변환하는지 실험을 통해 방안이 가능하다.)
 
존재 부족:
1. 코드는 기술적인 실현일 뿐 실제 업무와 결합하여 최적화되지 않는다
2. 그림 인쇄는 지원되지 않습니다(해결됨)
3. 부족한 점은 지적하고 메일박스를 지적해 주십시오[email protected]
 
핵심 코드:
import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import com.sun.jna.Library;

import com.sun.jna.Native;



public class JavaPrinter {

private static JavaPrinter instance = null;

private JavaPrinter(){

}

public static JavaPrinter getInstance(){

if (instance == null) {

synchronized (JavaPrinter.class) {

if (instance == null) {

instance = new JavaPrinter();

}

}

}

return instance;

}

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);

}

/**

*      ,   80.6*201mm

* @param tscName      

* @param title     

* @param others          

* @param qrCode      

* @param copies     

* @auther WolfShadow

* @date 2018 9 4 

*/

public void printTickt(String tscName, String title, List others, String qrCode, int copies){

System.setProperty("jna.encoding", "GBK");//     

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String time = df.format(new Date());

// TscLibDll.INSTANCE.about();

TscLibDll.INSTANCE.openport(tscName);

// TscLibDll.INSTANCE.downloadpcx("C:\\UL.PCX", "UL.PCX");

//        、  、    、    、     、Gap/Black mark    、Gap/Black mark    

TscLibDll.INSTANCE.setup("80.6", "201", "5", "8", "1", "2", "0");

TscLibDll.INSTANCE.clearbuffer();

// TscLibDll.INSTANCE.sendcommand("PUTPCX 550,10,\"UL.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:     ,      。

int startX = 200, startY = 1300, angle = 90, rowHight = 50;

TscLibDll.INSTANCE.windowsfont(startX, startY, 42, angle, 2, 0, "Arial", title);

int index = 1;

for(String str : others){

TscLibDll.INSTANCE.windowsfont(startX+(index++)*rowHight, startY, 36, angle, 0, 0, "Arial", str);

}

/*

    :L、M、Q、H

*/

//var cmd = 'QRCODE   X     ,  Y     ,    ,     ,A(A M),    ,M2(    1   2),S1 (s1-s8,  s7),\"1231  2421341325454353\"';

String command = "QRCODE 200,600,Q,7,A,0,M2,S7,\"" + qrCode + "\""; //            

TscLibDll.INSTANCE.sendcommand(command); //     

// (    ,      )

TscLibDll.INSTANCE.printlabel(""+copies, "1");

TscLibDll.INSTANCE.closeport();

System.exit(0);

}

}

 

좋은 웹페이지 즐겨찾기