2016-09-08 60 views
1

我正在Java(Struts2框架)中開發我的應用程序中的Billing模塊。成功提交賬單表單後,我的代碼生成賬單PDF。我想要實現的是,在成功提交表單併成功生成PDF的同時,生成的PDF應該從打印機打印出來。我編寫了用於打印PDF的代碼,但這裏的問題是,通過該代碼,只能從應用程序部署和打印機連接的同一臺計算機上打印PDF文件。但是,這不會是完成申請後的體系結構。將會有客戶機 - 服務器體系結構,我的應用程序將部署在一臺服務器上,許多客戶機將從它們各自的機器使用該應用程序。Java代碼打印來自客戶端機器的PDF文件

所以這裏的問題是,每臺其他機器都連接到不同的打印機,並且通過我當前的代碼,只能從應用程序部署的地方打印PDF,即在這種情況下是服務器。

現在,這裏我的問題是:

  1. 是否有可能實現PDF打印,在這樣的情況下,使用Java的 ,我的意思是,從打印機打印PDF連接到相應的客戶端機器?

  2. 如果是,我該怎麼做?

這裏是我的代碼片段:

import java.io.FileInputStream; 
import javax.print.Doc; 
import javax.print.DocFlavor; 
import javax.print.DocPrintJob; 
import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 
import javax.print.SimpleDoc; 
import javax.print.attribute.HashPrintRequestAttributeSet; 
import javax.print.attribute.PrintRequestAttributeSet; 
import javax.print.attribute.standard.Copies; 
import javax.print.attribute.standard.Sides; 

public class PDFPrintDemo { 

    public static void main(String[] args) { 
     try { 

      System.out.println("Printing PDF demo using JAVA."); 

      DocFlavor docFlavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE; 

     PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet(); 

     attributeSet.add(Sides.ONE_SIDED); 
     attributeSet.add(new Copies(2)); 

     PrintService[] printServices = PrintServiceLookup 
       .lookupPrintServices(docFlavor, attributeSet); 

     if (printServices.length == 0) { 
      System.out.println("No printer found..."); 
     } 

     PrintService myService = null; 

     for (PrintService service : printServices) { 
      System.out.println("Connected printer name is :: " 
        + service.getName()); 
      if (service.getName().equals(
        "Hewlett-Packard-HP-LaserJet-Pro-MFP-M126nw")) { 

       myService = service; 

       break; 

      } 
     } 

     FileInputStream inputStream = new FileInputStream(
       "/home/roshan/Downloads/rudhiraBillDemo.pdf"); 

     Doc pdfDoc = new SimpleDoc(inputStream, 
       DocFlavor.INPUT_STREAM.AUTOSENSE, null); 

     DocPrintJob printJob = myService.createPrintJob(); 

     printJob.print(pdfDoc, attributeSet); 

     inputStream.close(); 

     System.out.println("PDF printed successfully.."); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 
} 

} 

回答

0

您的最後一個項目是一個網站,它的客戶端需要下載並打印PDF文件。

如果我的猜測是真的,那麼你的答案是否定的!客戶可以download,但你不能強迫它printed

你可以寫一個支柱action它返回一個PDF文件(與你在上面做了),而是(因爲安全問題),沒有辦法,你可以開發任何html+javascript代碼生成的PDF發送到客戶端打印機。如您所知,html+javascript還有其他限制,例如您無法訪問客戶端相機或麥克風。

如果您非常想要這個,您應該使用Java Applet,Flash Player或ActiveX(僅限Windows)。這些技術可以訪問客戶機上的任何設備。

+0

謝謝。所以如果我想實現它,我該如何使用Java Applet來做到這一點?我的意思是可以將它遷移到我的struts2框架中嗎? –

+0

你需要一個applet從'url'讀取數據並打印出來,這個'url'可以是一個struts動作。這可能是一個高層次的解決方案,編寫一個可以訪問打印機和打印的小程序,創建一個支持PDF文件的struts動作,調用struts動作(打開url)獲取PDF文件發送給打印機 –

相關問題