Хорошо, вот то, что я нашел до сих пор (это не исчерпывающий тест, но попытка решить его была забавной).кажется, что может быть некоторая помощь, если посмотреть, как работает метод validatePage () в классе PrinterJob.Кажется, что если задание принтера является виртуальным, то любая попытка установить ImageableArea страницы всегда будет возвращать значение, точно равное страницам по умолчанию ImageableArea, в то время как попытка того же самого на реальном принтере будет возвращать немного меньшие значения (для учетакрая бумаги, удерживаемые механикой принтера. Что помогает в этой проблеме, так это то, что если вы просто спросите принтер о его характеристиках по умолчанию перед вызовом validate, вы получите оптимистичный результат, и если вы сравните это с проверенным ответом, вы можете сделатьпростой тест if. Я написал некоторый код для этого, который, кажется, работает с принтерами изображений и реальными принтерами, которые у меня есть на рабочем столе (опять же, это не исчерпывающе, но это может послужить отправной точкой)
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\"");
}
}
}