Я пытался какое-то время определить способ использования стандартной стандартной библиотеки 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, такие как Tray и Duplex
- Вызов печати на задании принтера с помощью параметра 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 просто настроил, но никогда не работал в состоянии завершен? Если да, есть альтернативы?