2011-08-24 20 views
8

Tôi có một tệp hoạt động tốt nếu tôi sử dụng lệnh lp filename.In qua ly bằng cách sử dụng javax.print

Tệp là tệp ESC/P cho máy in tác động biên nhận. Điều đó có trình điều khiển CUPS gốc của Linux và tất cả đều hoạt động.

Tôi đang cố gắng sử dụng API javax.print để tôi có thể kiểm soát tốt hơn việc in ấn và hy vọng giữ cho nền tảng tương thích, mặc dù Linux là nền tảng mục tiêu.

Tôi đã thử mọi sự kết hợp DocFlavor đối với loài người và tất cả các loại kiểu dữ liệu (InputStream, byte[], Reader vv)

Nó hoặc là chỉ cần bỏ qua lệnh print() tất cả cùng nhau hay chỉ là lật mặt một tờ giấy trắng của giấy. Chạy lp filename in nó hoàn hảo, vậy làm thế nào để tôi nhận được javax.print để chỉ làm tương đương chức năng của lp filename?

Tôi không được sử dụng javax.print Tôi có thể sử dụng "thứ" khác và có thể bắt đầu điều tra cups4J nhưng có vẻ như nó sẽ giới hạn tôi chỉ với Linux/* nix. dung dịch.

Tôi chỉ có thể phát hành lệnh hệ thống lp trên tệp nhưng, tôi cần kiểm soát chi tiết hơn. Đây không phải là biên nhận mà chúng tôi đang in, chúng là vé và vé có giá từ 5 đến 5 ngàn đô la. Hiện tại, nếu chúng tôi phát hiện sự cố in, chúng tôi sẽ hủy giao dịch và nếu bất kỳ nội dung nào được in, không hợp lệ, chúng tôi sẽ không in lại bản in nhẹ và phần lớn thời gian in bản sao mới nếu khách hàng mất bản sao của mình. Lý do để làm điều này là chúng tôi đang thay đổi hệ thống POS từ Windows sang Linux và máy in truy cập trực tiếp qua các cổng nối tiếp sang CUPS được quản lý qua USB. Đây là mã của tôi không hoạt động. Bất kỳ trợ giúp được đánh giá cao.

try { 
    // Find the default service 
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 

    PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

    // Create the print job 
    DocPrintJob job = service.createPrintJob(); 
    InputStream in = new FileInputStream("/home/bart/real.escp"); 
    Doc docNew = new SimpleDoc(in,flavor,null); 

    // Monitor print job events; for the implementation of PrintJobWatcher, 
    // see Determining When a Print Job Has Finished 
    PrintJobWatcher pjDone = new PrintJobWatcher(job); 

    // Print it 
    job.print(docNew, null); 

    // Wait for the print job to be done 
    pjDone.waitForDone(); 

    // It is now safe to close the input stream 
    in.close(); 
} catch (PrintException e) { 
} catch (IOException e) { 
} 
+1

In ấn từ Java trên Linux là dicey lúc tốt nhất. Tôi đã thực hiện để bắn phá ra các dòng lệnh với một lệnh lpr để làm một số in ấn của tôi. Một tùy chọn có thể là để xem liệu bạn có thể chuyển đổi tệp của mình sang định dạng mà Java hiểu, như PDF và sau đó sử dụng javax.print trên đó hay không. – Mitch

+0

Đó là vấn đề có thể có một trình chuyển đổi esc/p linux nhưng tại sao phải bận tâm khi lệnh lp in tốt, có vẻ như yêu cầu rắc rối để đi từ ESC/P (có thể được cấp trực tiếp cho máy in) -> PDF (để thực hiện Java Happy) -> ESC/P (thông qua trình điều khiển). Chúng tôi đang tạo ra các tập tin ESC/P. Dù sao hoạt động tốt với Cups4J, mất khoảng 15 phút để thực hiện. Đoán tôi sẽ sử dụng cups4J và đối phó với bất kỳ vấn đề hệ điều hành/in ấn khác khi chúng bật lên. –

Trả lời

0

Tôi ổn với cups4j. Đầu tiên hãy lấy máy in của bạn.

try { 
     CupsClient client = new CupsClient("addressOfTheCupsServer", 631); 
     List<CupsPrinter> printers = client.getPrinters(); 
     if (printers.size() == 0) { 
      throw new RuntimeException("Cant list Printer"); 
     } 
     for (CupsPrinter cupsPrinter : printers) { 
      if (cupsPrinter.getName().equals("NameOfPrinter")) { 
       selectedPrinter = cupsPrinter; 
      } 
     } 
    }catch (Exception ignored){ 
     ignored.printStackTrace(); 
    } 
} 

Sau đó, tạo ra một công việc in và gửi nó tới máy in

PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build(); 
    PrintRequestResult result = selectedPrinter.print(printJob); 
Các vấn đề liên quan