龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java打印程序设计全攻略(4)

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
打印图形 1、应用场景 在实际应用中,我们还需要打印图形。譬如,我们有时需要将一个Java Applet的完整界面或一个应用程序窗体及其所包含的全部组件都

    打印图形

  1、应用场景

  在实际应用中,我们还需要打印图形。譬如,我们有时需要将一个Java Applet的完整界面或一个应用程序窗体及其所包含的全部组件都打印出来,又应该如何实现呢?

  2、解决方法

  基本思路如下:在Java的Component类及其派生类中都提供了print和printAll方法,只要设置好属性就可以直接调用这两个方法,从而实现对组件及图形的打印。

  /*打印指定的窗体及其包含的组件*/
  private void printFrameAction() {
  Toolkit kit = Toolkit.getDefaultToolkit(); //获取工具箱
  Properties props = new Properties();
  props.put("awt.print.printer", "durango"); //设置打印属性
  props.put("awt.print.numCopies", "2");
  if (kit != null) {
  //获取工具箱自带的打印对象
  PrintJob printJob = kit.getPrintJob(this, "Print Frame", props);
  if (printJob != null) {
   Graphics pg = printJob.getGraphics(); //获取打印对象的图形环境
   if (pg != null) {
    try {
     this.printAll(pg); //打印该窗体及其所有的组件
    }
    finally {
     pg.dispose(); //注销图形环境
    }
   }
   printJob.end(); //结束打印作业
  }
  }
  }

  打印文件

  1、应用场景

  在很多实际应用情况下,我们可能都需要打印用户指定的某一个文件。该文件可能是图形文件,如GIF、JPEG等等;也可能是文本文件,如TXT、Java文件等等;还可能是复杂的PDF、DOC文件等等。那么对于这样的打印需求,我们又应该如何实现呢?

  2、解决方法

  基本思路:在jdk1.4以前的版本,要实现这样的打印功能将非常麻烦和复杂,甚至是难以想象的。但幸运的是,jdk1.4的打印服务API提供了一整套的打印文件流的类和方法。利用它们,我们可以非常方便快捷地实现各式各样不同类型文件的打印功能。下面给出一个通用的处理方法。

  /*打印指定的文件*/
  private void printFileAction() {
  //构造一个文件选择器,默认为当前目录
  JFileChooser fileChooser = new JFileChooser(SystemProperties.USER_DIR);
  int state = fileChooser.showOpenDialog(this); //弹出文件选择对话框
  if (state == fileChooser.APPROVE_OPTION) //如果用户选定了文件
  {
  File file = fileChooser.getSelectedFile(); //获取选择的文件
  //构建打印请求属性集
  PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
  //设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
  DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
  //查找所有的可用打印服务
  PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
  //定位默认的打印服务
  PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
  //显示打印对话框
  PrintService service = ServiceUI.printDialog(null, 200, 200, printService, defaultService, flavor, pras);
  if (service != null) {
   try {
    DocPrintJob job = service.createPrintJob(); //创建打印作业
    FileInputStream fis = new FileInputStream(file); //构造待打印的文件流
    DocAttributeSet das = new HashDocAttributeSet();
    Doc doc = new SimpleDoc(fis, flavor, das); //建立打印文件格式
    job.print(doc, pras); //进行文件的打印
   }
   catch(Exception e) {
    e.printStackTrace();
   }
  }
  }
  }

  在上面的示例中,因尚未确定文件的类型,所以将指定文件的打印格式定义为DocFlavor.INPUT_STREAM.AUTOSENSE。事实上,如果在进行打印之前,就已确定地知道文件的格式,如为GIF,就应定义为DocFlavor.INPUT_STREAM.GIF ;如为PDF,就应该定义为DocFlavor.INPUT_STREAM.PDF;如为纯ASCII文件,就可以定义为 DocFlavor.INPUT_STREAM.TEXT_HTML_US_ASCII。等等。

  jdk1.4的javax.print.DocFlavor提供了极为丰富的文件流类型,你可以根据具体的应用需求进行合适的选择。具体的API参考文档可见本文的参考资料3。

  结束语

  以上是本人在两年多J2EE应用开发中,总结的关于用Java进行打印程序设计的一些经验,希望能给大家一些启示和裨益。尽管目前用Java来实现打印功能与用Microsoft的MFC API相比确实有更多的麻烦。但jdk1.4的推出,对Java以前较弱的打印功能是一个极好的补充。相信大家如果能够很好地理解前文所述的打印程序设计实例,并加以应用和拓展,应该可以解决目前大部分应用的实际编程问题。而随着Java的进一步发展和完善,必将更好地充实其基础类库及打印API,相信用Java实现高级打印功能也将越来越不成为我们这些Java痴迷者头痛的问题。

精彩图集

赞助商链接