Печать с атрибутами (управление лотком, дуплекс и т. Д.) С использованием библиотеки 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 просто установил, но так и не получил? в завершенное состояние? Если так,есть ли альтернативы?

Ответы на вопрос(4)

Ваш ответ на вопрос