Java의 특정 프린터(IPP URI)로 인쇄
-
11-09-2019 - |
문제
Java에서 특정 IPP 프린터로 인쇄할 수 있는 방법이 있습니까?내가 찾은 모든 샘플 코드와 튜토리얼은 다음과 같은 방법을 사용하여 특정 유형의 문서를 인쇄하는 방법에 중점을 둡니다.
DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
DocPrintJob pj = pservices[0].createPrintJob();
try {
FileInputStream fis = new FileInputStream("test.ps");
Doc doc = new SimpleDoc(fis, flavor, null);
pj.print(doc, aset);
} catch (FileNotFoundException fe) {
} catch (PrintException e) {
}
}
이 조각은 문서를 인쇄할 수 있는 첫 번째 프린터로 인쇄합니다.내 경우에는 URI로 프린터를 조회하고 싶지만 PrintServiceLookup
이것을 지원하지 않는 것 같습니다.나는 PrintServiceAttributeSet
, 대신에 PrintRequestAttributeSet
, 그리고 PrinterURI
속성이지만 프린터를 반환하지 않습니다.조회 서비스가 해당 URI가 있는 프린터를 찾는 대신 대상 URI를 변경할 수 있는 프린터를 찾고 있는 것 같습니다.
최후의 수단으로, 나는 모든 것을 열거하는 것에 대해 생각했습니다. PrintService
에 의해 반환됨 lookupPrintServices
, 이지만 URI가 어떤 속성에도 없습니다.프린터 이름이 있지만 URI가 필요합니다.
배경의 경우 내 웹앱은 현재 사용자를 기반으로 바코드를 특정 프린터로 인쇄해야 합니다.각 사용자는 CUPS 서버의 프린터를 가리키는 프린터 URI와 연결됩니다.프린터 URI는 내가 갖고 있는 유일한 정보이며 프린터 이름을 URI 또는 URI의 하위 문자열과 일치하도록 제한할 수 없습니다.
편집하다: 좀 더 명확하게 설명하자면 데이터를 렌더링할 필요가 없으며 블롭을 특정 프린터에 복사하기만 하면 됩니다.내가 알 수 없는 부분은 IPP URI로 프린터를 식별하는 방법입니다.
해결책
마침내 다음을 사용하여 이 작업을 수행하는 방법을 찾았습니다. jipsi
:
URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);
특정 프린터로 인쇄하는 것처럼 간단해 보이는 작업을 수행하기 위해 타사 라이브러리를 사용해야 한다는 점에 실망했다는 점을 인정해야 합니다.
업데이트
DR은 다음과 같이 지적합니다. 코멘트 그 집시한테 새로운 게 생겼어 집, 그리고 새로운 이름.
컵4J 좋은 대안이지만 이름에서 알 수 있듯이 대상이 CUPS 서버가 아닌 경우 올바르게 작동하지 않을 수 있습니다.저는 Cups4J를 사용하여 Zebra 열전사 프린터로 직접 인쇄하여 좋은 결과를 얻었습니다.
다른 팁
나는 당신이 원하는 방식으로 프린터를 얻을 수 있다고 생각하지 않습니다. (제 생각에는 Java Print 메커니즘이 IPP보다 앞선 것 같습니다.)
그러나 제 기억으로는 인쇄 작업을 로컬로 올바르게 렌더링한 다음 출력 스트림의 바이트를 대상 CUPS 서버에 "수동으로" 전달할 수 있을 것입니다.이것이 당신에게 "충분히 좋은" 것이겠습니까?