Печать с атрибутами (управление лотком, дуплекс и т. Д.) С использованием библиотеки javax.print
Некоторое время я пытался определить способ использованиястандартная библиотека Java Print печатать файлы - в частности, документы PDF - сопределенные атрибуты - в частности, для определенных лотков или с использованием дуплекса.
Существует множество документов о том, как это сделать, и я действительно исследовал и попробовал эти методы. Типичный способ примерно такой:
public static void main (String [] args) {
try {
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(null, null);
//Acquire Printer
PrintService printer = null;
for (PrintService serv: pservices) {
System.out.println(serv.toString());
if (serv.getName().equals("PRINTER_NAME_BLAH")) {
printer = serv;
}
}
if (printer != null) {
System.out.println("Found!");
//Open File
FileInputStream fis = new FileInputStream("FILENAME_BLAH_BLAH.pdf");
//Create Doc out of file, autosense filetype
Doc pdfDoc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
//Create job for printer
DocPrintJob printJob = printer.createPrintJob();
//Create AttributeSet
PrintRequestAttributeSet pset = new HashPrintRequestAttributeSet();
//Add MediaTray to AttributeSet
pset.add(MediaTray.TOP);
//Add Duplex Option to AttributeSet
pset.add(Sides.DUPLEX);
//Print using Doc and Attributes
printJob.print(pdfDoc, pset);
//Close File
fis.close();
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
Короче говоря, вы делаете следующее
Найти принтерСоздать PrinterJobСоздать набор атрибутовДобавьте атрибуты в набор атрибутов, такие как лоток и дуплексВызовите печать на задании принтера с помощью AttributeSetПроблема здесь в том, что, несмотря на то, что это документированный способ сделать это, а также то, что я нашел в нескольких уроках, этот метод ...не работает, Имейте в виду, я знаю, это звучит не очень описательно, но выслушайте меня.Я не говорю это легко...
Официальная документация для PrinterJob на самом деле упоминается, что AttributeSet игнорируется в реализации по умолчанию.Исходный код виден здесь показывает, что это правда - атрибуты передаются и полностью игнорируются.
Очевидно, вам нужна какая-то расширенная версия класса, которая, возможно, основана на конкретных принтерах и их возможностях? Я попытался написать некоторый тестовый код, который сообщал бы мне о таких возможностях - у нас в офисе установлено большое количество принтеров, больших или маленьких, простых или полных наворотов - не говоря уже о нескольких драйверах на моем компьютере только для псевдо -принтеры, которые просто создают документы и имитируют принтеры, не прибегая к какому-либо оборудованию. Тестовый код выглядит следующим образом:
public static void main (String [] args) {
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(null, null);
for (PrintService serv: pservices) {
System.out.println(serv.toString());
printFunctionality(serv, "Trays", MediaTray.class);
printFunctionality(serv, "Copies", Copies.class);
printFunctionality(serv, "Print Quality", PrintQuality.class);
printFunctionality(serv, "Color", ColorSupported.class);
printFunctionality(serv, "Media Size", MediaSize.class);
printFunctionality(serv, "Accepting Jobs", PrinterIsAcceptingJobs.class);
}
}
private static void printFunctionality(PrintService serv, String attrName, Class<? extends Attribute> attr) {
boolean isSupported = serv.isAttributeCategorySupported(attr);
System.out.println(" " + attrName + ": " + (isSupported ? "Y" : "N"));
}
Результаты, которые я обнаружил, состояли в том, что каждый принтер без исключения возвращал, что «копии» были поддержаны, а все остальные атрибуты - нет. Кроме того, возможности каждого принтера были идентичны, независимо от того, насколько неправдоподобным это могло бы показаться.
Неизбежный вопрос является многослойным: как отправить атрибуты таким образом, чтобы они были зарегистрированы? Кроме того, как правильно определить возможности принтера? Действительно, действительно ли класс PrinterJob расширен в удобном для использования виде или атрибуты всегда игнорируются?
Примеры, которые я нашел по всему Интернету, дают мне понять, что ответ на последний вопрос - «Нет, они всегда игнорируются», что мне кажется смешным (но все более правдоподобным, когда я просеиваю сотни страниц).Это код, который Sun просто установил, но так и не получил? в завершенное состояние? Если так,есть ли альтернативы?