Пакет javax.print.attribute
Что такое атрибут?
При настройке задания печати клиент задаёт две вещи: данные печати и инструкции по обработке. Данные печати — это фактическое содержимое, подлежащее печати. Инструкции по обработке сообщают принтеру, как печатать данные, например: какой носитель использовать, сколько копий печатать и печатать ли на одной или обеих сторонах листа. Клиент задаёт эти инструкции по обработке с помощью определений атрибутов API службы печати Java.Данные печати и инструкции по обработке являются отдельными сущностями. Это означает, что:
- Вы можете печатать одни и те же данные печати в разное время с использованием разных инструкций по обработке.
Например, вы можете напечатать презентацию слайдов на белой бумаге формата US Letter, двустороннюю, скреплённую степлером, в 20 копиях, чтобы сделать раздаточные материалы для доклада; и вы можете напечатать ту же презентацию слайдов на прозрачных плёнках формата US Letter, одностороннюю, в одной копии, чтобы сделать сами слайды для доклада. - Вы можете использовать одни и те же инструкции по обработке в разное время для печати разных данных. Например, вы можете установить свои стандартные инструкции по обработке: бумага формата US Letter, двусторонняя, скреплённая степлером. При каждой печати задания оно будет напечатано с этими параметрами, если вы их явно не переопределите.
Категории атрибутов и значения
Каждый принтер обладает набором возможностей, таких как печать на различных размерах бумаги или печать нескольких копий. Каждая из возможностей имеет диапазон значений. Например, возможность ориентации принтера может иметь такой диапазон значений: [альбомная, книжная]. Для каждого запроса на печать возможность устанавливается в одно из этих значений. API службы печати Java использует термин категория атрибута для обозначения возможности принтера и термин значение атрибута для обозначения значения возможности. В API службы печати Java категория атрибута представлена классом Java, реализующим интерфейс Attribute. Значения атрибутов являются экземплярами такого класса или одного из его подклассов. Например, для указания количества копий приложение создаёт экземпляр класса Copies с количеством требуемых копий и использует экземпляр Copies в качестве части запроса на печать. В этом случае, класс Copies представляет категорию атрибута, а экземпляр Copies — значение атрибута.
Роли атрибутов
При отправке задания печати на принтер клиент предоставляет атрибуты, описывающие характеристики данных печати, например, имя документа, и как данные печати должны быть напечатаны, например, двусторонние, пять копий. Если задание печати состоит из нескольких фрагментов данных печати, разные фрагменты могут иметь разные инструкции по обработке, например, носитель размером 8 x 11 дюймов для первого документа и носитель размером 11 x 17 дюймов для другого документа.После того, как принтер начинает обработку задания печати, становится доступна дополнительная информация о задании, которая может включать: состояние задания (например, завершён или в очереди) и количество напечатанных страниц. Эти элементы информации также являются атрибутами. Атрибуты также могут описывать сам принтер, например: имя принтера, местоположение принтера и количество заданий в очереди.
API службы печати Java определяет эти различные типы атрибутов с помощью пяти подинтерфейсов Attribute:
- DocAttribute определяет характеристику отдельного документа и параметры печати для применения к отдельным документам.
- PrintRequestAttribute определяет параметр, применяемый ко всему заданию печати и ко всем документам в задании печати.
- PrintJobAttribute сообщает о состоянии задания печати.
- PrintServiceAttribute сообщает о состоянии службы печати.
- SupportedValuesAttribute указывает поддерживаемые значения для другого атрибута.
DocAttribute или ко всему заданию печати в качестве PrintRequestAttribute. Некоторые атрибуты низкого уровня никогда не используются самостоятельно, но всегда агрегируются в атрибуты более высокого уровня. Эти классы атрибутов низкого уровня реализуют только интерфейс Attribute, а не какие-либо из подинтерфейсов тегов. API службы печати Java определяет группу стандартных классов атрибутов, основанных на атрибутах протокола печати по Интернету (IPP) версии 1.1. Стандартные классы атрибутов находятся в подпакете javax.print.attribute.standard для концептуального отделения фактических классов атрибутов от общего аппарата, определённого в пакете javax.print.attribute.
Наборы атрибутов
Клиент обычно должен предоставить более одной инструкции по обработке при отправке задания печати. Например, клиенту может потребоваться указать размер носителя А4 и альбомную ориентацию. Чтобы отправить более одной инструкции по обработке, клиент собирает атрибуты в набор атрибутов, который API службы печати Java представляет интерфейсом AttributeSet. Интерфейс AttributeSet аналогичен интерфейсу Map: он предоставляет отображение ключа к значениям, в котором каждый ключ уникален и может содержать не более одного значения. Однако, интерфейс AttributeSet разработан для специфических потребностей API службы печати Java. Набор AttributeSet требует, чтобы:
- Каждый ключ в наборе
AttributeSetсоответствует категории, и значение ключа может быть только одним из значений атрибутов, которые относятся к категории, представленной ключом. Таким образом, в отличие отMap, наборAttributeSetограничивает возможные значения ключа: категория атрибута не может быть установлена в значение атрибута, которое не относится к этой категории. - Два атрибута из одной категории не могут существовать в одном наборе. Например, набор атрибутов не должен содержать как атрибут «односторонняя печать», так и атрибут «двусторонняя печать», поскольку эти два атрибута дают принтеру противоречивые инструкции.
- В набор могут добавляться только атрибуты, реализующие интерфейс
Attribute.
javax.print.attribute включает HashAttributeSet в качестве конкретной реализации интерфейса набора атрибутов. HashAttributeSet предоставляет набор атрибутов, основанный на хэш-таблице. Вы можете использовать эту реализацию или предоставить собственную реализацию интерфейса AttributeSet. API службы печати Java предоставляет четыре специализации набора атрибутов, которые ограничены содержанием только одного из четырёх видов атрибутов, как обсуждалось в разделе Роли атрибутов:
Обратите внимание, что здесь перечислены только четыре типа наборов атрибутов, но существует пять типов атрибутов. Интерфейс SupportedValuesAttribute обозначает атрибут, который предоставляет поддерживаемые значения для другого атрибута. Атрибуты поддерживаемых значений никогда не агрегируются в наборы атрибутов, поэтому для них не определён подинтерфейс набора атрибутов. В некоторых контекстах набор атрибутов является только для чтения, что означает, что клиент может только просматривать содержимое набора атрибутов, но не изменять его. В других контекстах набор атрибутов является для чтения и записи, что означает, что клиент может как просматривать, так и изменять содержимое набора атрибутов. Для набора атрибутов только для чтения вызов мутирующей операции вызовет UnmodifiableSetException.
Пакет javax.print.attribute включает по одной конкретной реализации каждого из подинтерфейсов набора атрибутов:
- HashDocAttributeSet
- HashPrintRequestAttributeSet,
- HashPrintJobAttributeSet,
- HashPrintServiceAttributeSet.
Проектирование класса атрибута
Значение атрибута — это небольшой атомарный элемент данных, такой как целое число или перечисление. API службы печати Java не использует примитивные типы данных, такие как int, для представления значений атрибутов по следующим причинам:- Примитивные типы данных не безопасны с точки зрения типов. Например, компилятор не должен допускать использования значения атрибута «копии» для атрибута «стороны».
- Некоторые атрибуты должны представляться как запись нескольких значений. Примером является разрешение принтера, которое требует двух чисел, таких как 600 и 300, представляющих 600 x 300 точек на дюйм.
Copies, класс Sides и класс PrinterResolution. Каждый класс атрибута оборачивает один или несколько примитивных элементов данных, содержащих значение атрибута. Операции с наборами атрибутов часто сравнивают объекты категории атрибутов при добавлении атрибутов, поиске существующих атрибутов той же категории и поиске атрибута по его категории. Поскольку категория атрибута представлена классом, быстрые сравнения значений атрибутов можно выполнять с помощью метода Class.equals. Несмотря на то, что API службы печати Java включает большое количество различных категорий атрибутов, существует всего несколько различных типов значений атрибутов. Большинство атрибутов можно представить небольшим количеством типов данных, таких как: целочисленные значения, целочисленные диапазоны, текст или перечисление целочисленных значений. Тип значения атрибута, который принимает категория, называется абстрактной синтаксической структурой атрибута. Для обеспечения согласованности и сокращения дублирования кода API службы печати Java определяет классы абстрактной синтаксической структуры для представления каждой абстрактной синтаксической структуры, и эти классы используются в качестве родительских классов стандартных атрибутов, когда это возможно. Классы абстрактной синтаксической структуры:
- EnumSyntax предоставляет безопасный по типу перечисление, в котором значения перечисления представлены как одиночные объекты. Каждый одиночный объект перечисления является экземпляром класса перечисления, который оборачивает скрытое целое число.
- IntegerSyntax — это абстрактная синтаксическая конструкция для атрибутов с целочисленными значениями.
- TextSyntax — это абстрактная синтаксическая конструкция для атрибутов со строковыми значениями, и включает локаль, определяющую естественный язык текстовой строки.
- SetOfIntegerSyntax — это абстрактная синтаксическая конструкция для атрибутов, представляющих диапазон или множество целых чисел.
- ResolutionSyntax — это абстрактная синтаксическая конструкция для атрибутов, представляющих значения разрешения, такие как 600x300 dpi.
- Size2DSyntax — это абстрактная синтаксическая конструкция для атрибутов, представляющих двумерный размер, такой как размер бумаги 8,5 x 11 дюймов.
- DateTimeSyntax — это абстрактная синтаксическая конструкция для атрибутов, значением которых является дата и время.
- URISyntax — это абстрактная синтаксическая конструкция для атрибутов, значением которых является Указатель на универсальный ресурс.
Каждый класс атрибута реализует интерфейс Attribute, непосредственно или косвенно, чтобы отметить его как атрибут печати. Класс атрибута, который может появляться в ограниченных наборах атрибутов в определенных контекстах, также реализует один или несколько подинтерфейсов интерфейса Attribute. Большинство классов атрибутов также расширяют соответствующий класс абстрактного синтаксиса, чтобы получить реализацию. Рассмотрим класс атрибута Sides:
public class Sides extends EnumSyntax implements DocAttribute, PrintRequestAttribute, PrintJobAttribute { public final Object getCategory() { return Sides.class; } ... }
Поскольку каждый класс атрибута реализует Attribute, каждый класс атрибута должен предоставить реализацию метода getCategory, который возвращает категорию атрибута. В случае Sides, метод getCategory возвращает Sides.class. Метод getCategory является final, чтобы гарантировать, что все подклассы атрибута, определенные поставщиком, появляются в той же категории. Каждый объект атрибута является неизменяемым после создания, чтобы ссылки на объекты атрибутов можно было свободно передавать. Чтобы получить другое значение атрибута, создайте другой объект атрибута.
Поставщики атрибутов
API службы печати Java разработано таким образом, чтобы поставщики могли:- определять новые значения, специфичные для поставщика, для любого стандартного атрибута, определенного в javax.print.attribute.standard.
- определять новые категории атрибутов, представляющие собственные возможности принтера поставщика, которые еще не поддерживаются стандартными атрибутами.
EnumSyntax, определяет все возможные значения атрибутов во время компиляции как одиночные экземпляры класса атрибута. Это означает, что новые значения перечисления не могут быть созданы во время выполнения. Чтобы определить новые значения, специфичные для поставщика, для стандартного атрибута перечисления, поставщик должен определить новый класс атрибута, определяющий новые одиночные экземпляры. Чтобы гарантировать, что новые значения атрибутов попадают в ту же категорию, что и стандартные значения атрибутов, новый класс атрибута должен быть подклассом стандартного класса атрибута. Чтобы определить новую категорию атрибутов, поставщик определяет новый класс атрибута. Этот класс атрибута, как и стандартные классы атрибутов, реализует Attribute или один из его подинтерфейсов и расширяет класс абстрактного синтаксиса. Поставщик может использовать существующий класс абстрактного синтаксиса или определить новый. Новый атрибут, определенный поставщиком, может использоваться везде, где используется Attribute, например, в AttributeSet.
Использование атрибутов
Типичное приложение печати используетPrintRequestAttributeSet, так как атрибуты запроса печати — это те типы атрибутов, которые обычно указывает клиент. Этот пример демонстрирует создание набора атрибутов запроса печати и поиск принтера, который может распечатать документ в соответствии с указанными атрибутами: FileInputStream psStream; try { psstream = new FileInputStream("file.ps"); } catch (FileNotFoundException ffne) { } if (psstream == null) { return; } //Set the document type. See the DocFlavor documentation for //more information. DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT; Doc myDoc = new SimpleDoc(pstream, psInFormat, null); PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(new Copies(5)); aset.add(MediaSize.A4); aset.add(Sides.DUPLEX); PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset); if (services.length > 0) { DocPrintJob job = services[0].createPrintJob(); try { job.print(myDoc, aset); } catch (PrintException pe) {} }
Обратите внимание: в API javax.print, ссылка на параметр null в методах некорректна, если не документировано явным образом в методе, что она имеет осмысленное толкование. Использование в противном случае является неправильным кодированием и может привести к исключению во время выполнения — как сразу, так и в какой-то момент в будущем. IllegalArgumentException и NullPointerException являются примерами типичных и допустимых исключений во время выполнения для таких случаев.
- Since:
- 1.4
| Класс | Описание |
|---|---|
| Attribute | Интерфейс Attribute является базовым интерфейсом, реализуемым любым и каждым классом атрибута печати, чтобы указать, что класс представляет атрибут печати. |
| AttributeSet | Интерфейс AttributeSet определяет интерфейс для набора атрибутов печати. |
| AttributeSetUtilities | Класс AttributeSetUtilities предоставляет статические методы для управления AttributeSets. |
| DateTimeSyntax | Класс DateTimeSyntax является абстрактным базовым классом, предоставляющим общее реализацию всех атрибутов, значение которых является датой и временем. |
| DocAttribute | Интерфейс DocAttribute является интерфейсом-меткой, который класс атрибута печати реализует, чтобы указать, что атрибут обозначает настройку для документа. |
| DocAttributeSet | Интерфейс DocAttributeSet определяет интерфейс для набора атрибутов документа, т.е. атрибутов печати, которые реализуют интерфейс DocAttribute. |
| EnumSyntax | Класс EnumSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех объектов "безопасного перечисления типов". |
| HashAttributeSet | Класс HashAttributeSet предоставляет реализацию AttributeSet с характеристиками хэш-таблицы. |
| HashDocAttributeSet | Класс HashDocAttributeSet предоставляет набор атрибутов, который наследует свою реализацию от класса HashAttributeSet и обеспечивает соответствие семантическим ограничениям интерфейса DocAttributeSet. |
| HashPrintJobAttributeSet | Класс HashPrintJobAttributeSet предоставляет набор атрибутов, который наследует свою реализацию от класса HashAttributeSet и обеспечивает соответствие семантическим ограничениям интерфейса PrintJobAttributeSet. |
| HashPrintRequestAttributeSet | Класс HashPrintRequestAttributeSet наследует свою реализацию от класса HashAttributeSet и обеспечивает соответствие семантическим ограничениям интерфейса PrintRequestAttributeSet. |
| HashPrintServiceAttributeSet | Класс HashPrintServiceAttributeSet предоставляет набор атрибутов, который наследует свою реализацию от класса HashAttributeSet и обеспечивает соответствие семантическим ограничениям интерфейса PrintServiceAttributeSet. |
| IntegerSyntax | Класс IntegerSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов с целочисленными значениями. |
| PrintJobAttribute | PrintJobAttribute — это интерфейс-метка, который класс атрибута печати реализует, чтобы указать, что атрибут описывает состояние задания печати или какую-либо другую характеристику задания печати. |
| PrintJobAttributeSet | Интерфейс PrintJobAttributeSet определяет интерфейс для набора атрибутов заданий печати, т.е. атрибутов печати, которые реализуют интерфейс PrintJobAttribute. |
| PrintRequestAttribute | Интерфейс PrintRequestAttribute — это интерфейс-метка, который класс атрибута печати реализует, чтобы указать, что атрибут обозначает запрошенную настройку для задания печати. |
| PrintRequestAttributeSet | Интерфейс PrintRequestAttributeSet определяет интерфейс для набора атрибутов запроса на печать, т.е. атрибутов печати, которые реализуют интерфейс PrintRequestAttribute. |
| PrintServiceAttribute | Интерфейс PrintServiceAttribute — это интерфейс-метка, который класс атрибута печати реализует, чтобы указать, что атрибут описывает состояние службы печати или какую-либо другую характеристику службы печати. |
| PrintServiceAttributeSet | Интерфейс PrintServiceAttributeSet определяет интерфейс для набора атрибутов заданий печати, т.е. атрибутов печати, которые реализуют интерфейс PrintServiceAttribute. |
| ResolutionSyntax | Класс ResolutionSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов, обозначающих разрешение принтера. |
| SetOfIntegerSyntax | Класс SetOfIntegerSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов, значением которых является набор неотрицательных целых чисел. |
| Size2DSyntax | Класс Size2DSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов, обозначающих размер в двух измерениях. |
| SupportedValuesAttribute | Интерфейс SupportedValuesAttribute является интерфейсом-меткой, который класс атрибута печати реализует, чтобы указать, что атрибут описывает поддерживаемые значения для другого атрибута. |
| TextSyntax | Класс TextSyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов, значением которых является строка. |
| UnmodifiableSetException | Выбрасывается для указания того, что запрошенная операция не может быть выполнена, потому что набор не может быть изменён. |
| URISyntax | Класс URISyntax является абстрактным базовым классом, предоставляющим общую реализацию всех атрибутов, значением которых является универсальный идентификатор ресурса (URI). |
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.desktop/javax/print/attribute/package-summary.html