确定打印机的便携方式是物理的或虚拟的

Mud*_*Mud 6 java printing hardware flash silverlight

我的网站需要直接打印机功能,能够区分物理打印机和虚拟打印机(文件).

Coupons.com通过本机二进制文件具有此功能,必须由用户安装.我宁愿避免这种情况.

SmartSource.com通过Java applet实现:

智能源Java小程序

有谁知道这是怎么做的?我对Java API进行了一些挖掘,除了查看名称(看起来容易出现错误识别)之外,没有看到任何可以让您确定物理与虚拟的内容.能够用Java做它会很好,因为我已经知道如何编写Java applet了.如果失败了,有没有办法在Flash或Silverlight中执行此操作?

提前致谢.

编辑:杰森Sperske获得了当之无愧的奖励,他们制定了优雅的解决方案.感谢那些分享想法的人,以及那些实际调查过SmartSource.com解决方案的人(比如Adrian).

Jas*_*ske 6

好的,这是我到目前为止所发现的(这不是一个详尽无遗的测试,但尝试和解决这个问题是一个有趣的问题).通过查看PrinterJob类中的validatePage()方法是如何工作的,似乎可能会有一些帮助.似乎如果打印机作业是虚拟的,那么任何设置页面的尝试ImageableArea将始终返回一个完全等于默认页面ImageableArea的值,而尝试与真实打印机相同的值将返回略小的值(以考虑到打印机机制所持有的纸张边缘.对于这个问题有什么帮助,如果你在调用验证之前只询问打印机的默认特性,你会得到一个乐观的结果,如果你将它与经过验证的响应进行比较,你可以做一个简单,如果测试.我已经写了一些代码,这似乎与我在桌面上的图像打印机和真正的打印机一起工作(再次这不是详尽的,但它可以作为一个起点)

import java.awt.print.*;

import javax.print.PrintService;
import javax.print.attribute.Attribute;

public class DetectFilePrinter {

  public static void main(String[] args) {
    PrinterJob job = PrinterJob.getPrinterJob();
    PrintService printer = job.getPrintService();
    System.out.println("Printer Name:"+printer.getName());

    System.out.println(printer.toString());
    PageFormat page = job.defaultPage();
    double default_width = page.getWidth();
    double default_height = page.getHeight();

    Paper paper = new Paper();
    paper.setImageableArea(0, 0, Double.MAX_VALUE, Double.MAX_VALUE);
    page.setPaper(paper);

    PageFormat fixed_page = job.validatePage(page);

    double fixed_width = fixed_page.getImageableWidth();
    double fixed_height = fixed_page.getImageableHeight();

    //So far all of my tested "image printers" return the same 
    //height and width after calling validatePage()
    if(default_height == fixed_height && default_width == fixed_width) {
      System.out.println("This looks like a \"image printer\"");
    } else {
      System.out.println("This looks like a \"real printer\"");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)