Поделиться через


Стандартные фильтры XPS

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Windows предоставляет два (стандартных) фильтра XPS для поддержки встроенного преобразования из XPS в PCL6 и PostScript уровня 3.

Фильтры, предоставляемые Windows, доступны как для драйверов классов печати, так и драйверов печати для конкретной модели версии 4. Эти фильтры XPS можно объединить с фильтрами компонентов IHV, а также фильтрами после обработки IHV, чтобы обеспечить совместимость с существующими реализациями встроенного ПО.

Фильтры XPS, предоставляемые Windows, не распространяются повторно и недоступны для драйверов печати версии 3.

Файл манифеста

Чтобы использовать фильтры XPS, предоставляемые Windows, файл манифеста драйвера версии 4 должен использовать директиву RequiredFiles в разделе DriverConfig , чтобы указать фильтры. Это имена фильтров:

MSxpsPCL6.dll. Предоставляет преобразование из XPS в PCL6. MSxpsPS.dll. Предоставляет преобразование из XPS в PostScript уровня 3. Для использования одного из этих фильтров не требуется никаких обновлений INF, а распространение не поддерживается. Рекомендуется прекратить использование этих фильтров XPS.

Чтобы настроить конвейер фильтра печати для использования этих фильтров, необходимо создать файлы конфигурации, как показано в следующих примерах.

Пример файла конфигурации, указывающего преобразование в PCL6.

<?xml version="1.0" encoding="utf-8"?>
<Filters>
  <Filter dll="MSxpsPCL6.dll" clsid="{3821E518-33AF-4d17-92B3-28EB410D46B6}" name="Microsoft XPS to PCL6">
    <Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
    <Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
  </Filter>  
</Filters>

Пример файла конфигурации, указывающего преобразование в PostScript.

<?xml version="1.0" encoding="utf-8"?>
<Filters>
  <Filter dll="MSxpsPS.dll" clsid="{8636D90A-5E03-4d62-9269-E06493C57473}" name="Microsoft XPS to PS">
    <Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
    <Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
  </Filter>  
</Filters>

Поддерживаемые возможности

Стандартные фильтры XPS поддерживают множество распространенных функций. Все определения функций используют файл GPD или PPD для драйвера. Фильтр MSxpsPCL6.dll требует использования GPD-файла для настройки, а фильтр MSxpsPS.dll требует использования PPD-файла для настройки. Если не указано иное, если для функции указана настраиваемая команда PDL, она будет использоваться.

Если строки внедрения существуют в любом конкретном разделе (указанном с помощью команды *Order ), то в случае файлов GPD фильтр будет делать ряд предположений о содержимом этих строк и не будет отправлять команды по умолчанию. Это связано с тем, что отправка команд по умолчанию в этом случае может привести к конфликтам команд. Поэтому создатель GPD-файла должен следовать следующим рекомендациям:

  • JOB_SETUP. #

    • Заголовок двоичного потока PCL6 (например, ")<SP>HP-PCL XL;1;<CR><LF>") должен существовать.

    • Оператор BeginSession должен существовать, включая все обязательные атрибуты.

    • Оператор OpenDataSource должен существовать, включая все обязательные атрибуты.

  • PAGE_SETUP. #

    • Оператор BeginPage должен существовать, включая все обязательные атрибуты.
  • PAGE_FINISH. #

    • Должен существовать оператор EndPage.
  • JOB_FINISH. #

    • Оператор CloseDataSource должен существовать.

    • Должен существовать оператор EndSession.

    • Должен существовать оператор EndPJLCommands.

Фильтры XPS Standard создают соответствующие данные PDL для задания источника страницы на основе команд *PrintableArea, *PrintableOrigin или *ImageableArea. Чтобы избежать дополнительного смещения от ожидаемого источника, файлы GPD не должны указывать команды =SetPageOrigin в определении строки *Cmd для размера бумаги.

Дополнительные сведения о функциях PrintTicket, поддерживаемых стандартными фильтрами XPS, см. в разделе "Поддерживаемые функции PrintTicket".

Получение PrintTicket в фильтрах после обработки

В модели драйверов версии 4, выпущенной с Windows 8, при добавлении фильтра после одного из фильтров MSxps иногда также пришлось добавить фильтр предварительной обработки. Чтобы записать билет на печать на уровне задания, необходимо добавить фильтр предварительной обработки. Но этот подход по сути добавил фильтр на основе объектной модели перед одним из фильтров MSxps на основе потока, что приводит к десериализации, а затем сериализация данных печати для простого извлечения PrintTicket.

В Windows 8.1 пользователь по умолчанию PrintTicket объединяется с заданием PrintTicket в фильтрах MSxps, а объединенный PrintTicket добавляется в контейнер свойств конвейера печати. Объединенный PrintTicket добавляется в контейнер свойств конвейера печати таким же образом, как и user PrintTicket. Свойство называется следующим образом:

#define XPS_FP_JOB_LEVEL_PRINTTICKET    "JobPrintTicket"

Во время InitializeFilter фильтры MTI добавят реализацию IPrintReadStreamFactory в контейнер свойств. Этот интерфейс является одним из методов GetStream, будет блокироваться до тех пор, пока поток PrintTicket не будет доступен. Это обеспечивает возможность синхронизации доступа к свойству.

Важно: если GetStream вызывается из InitializeFilter, это приведет к взаимоблокировки.

Другие возможности

В случае функций PrintTicket, которые не поддерживаются стандартными фильтрами XPS, фильтры будут проверять все элементы PrintTicket, чтобы узнать, ссылаются ли они на них в GPD/PPD, а затем указать команды, которые будут выводиться. В этом случае будут созданы указанные команды.

Функции GPD сопоставляются в следующем порядке:

  1. Значение PrintSchemaKeywordMap указано и соответствует имени функции PrintTicket.

  2. Указан атрибут PrintSchemaPrivateNamespaceURI, а имя функции GPD соответствует имени функции PrintTicket. Совпадающие имена функций не являются простыми и соответствуют ряду правил:

    1. Если раздел *Order первого параметра имеет значение PAGE_SETUP или PAGE_FINISH, а функция GPD не начинается с "Page", то перед попыткой сопоставления функция GPD добавляется в имя функции GPD.

    2. Если раздел *Order первого параметра имеет значение DOC_SETUP или DOC_FINISH, а компонент GPD не начинается с "Документ", то перед попыткой сопоставления элемент "Документ" добавляется к имени функции GPD.

    3. Если раздел *Order первого параметра имеет значение JOB_SETUP или JOB_FINISH, а компонент GPD не начинается с "Задание", то "Задание" добавляется к имени функции GPD перед попыткой сопоставления.

    4. Любой символ, не имеющий значения [A-Z], [a-z], [0-9] или "_", заменяется символом "_" перед попыткой сопоставления. Однако если *NoPunctuationCharSubstitute? атрибут имеет значение TRUE, то фильтр не заменяет ""." или "-" символом "_".

Функции PPD сопоставляются в следующем порядке:

  1. Указано значение PrintSchemaKeywordMap и соответствует имени функции PrintTicket.

  2. Указан атрибут PrintSchemaPrivateNamespaceURI, а имя компонента PPD соответствует имени функции PrintTicket. Совпадающие имена функций не являются простыми и соответствуют ряду правил:

    1. Если раздел OrderDependency имеет значение ExitServer, Prolog или JCLSetup, а имя функции PPD не начинается с "Job", то "Задание" добавляется к имени функции PPD перед попыткой сопоставления.

    2. Если раздел OrderDependency имеет значение DocumentSetup, а имя функции PPD не начинается с "Document", то "Document" добавляется к имени функции PPD перед попыткой сопоставления.

    3. Если раздел OrderDependency имеет значение AnySetup, фильтр выполняет две проверки соответствия:

      1. Если имя функции PPD не начинается с "Document", перед попыткой сопоставления перед попыткой сопоставить его имя добавляется к имени функции PPD.

      2. Если совпадение не найдено, или если имя функции PPD не начинается с "Job", то "Задание" добавляется к имени функции PPD перед попыткой сопоставления.

    4. Если раздел OrderDependency имеет значение PageSetup, а имя функции PPD не начинается с page, то перед попыткой сопоставления функция PPD добавляется в имя функции PPD.

    5. Любой символ, не имеющий значения [A-Z], [a-z], [0-9] или "_", заменяется символом "_" перед попыткой сопоставления. Однако если *MSNoPunctuationCharSubstitute? Строка имеет значение TRUE, фильтр не заменяет "". Или "-" символом "_".

Параметры GPD и PPD сопоставляются в следующем порядке:

  1. Указано значение PrintSchemaKeywordMap, и оно соответствует имени параметра PrintTicket.

  2. Указан атрибут PrintSchemaPrivateNamespaceURI, а имя параметра GPD/PPD соответствует имени параметра PrintTicket. Имена параметров сопоставления не являются простыми и соответствуют ряду правил:

    1. Если имя параметра GPD/PPD начинается с [0-9] или "_", перед попыткой сопоставления символ "_" добавляется к имени параметра GPD/PPD. Однако применяются следующие дополнительные правила:

      1. Если это параметр GPD и *NoPunctuationCharSubstitute? атрибут имеет значение TRUE, то фильтр не предопределен "_" с символом "_".

      2. Если это параметр PPD и *MSNoPunctuationCharSubstitute? строка имеет значение TRUE, то фильтр не предопределен "_" с символом "_".

    2. Любой символ, не имеющий значения [A-Z], [a-z], [0-9] или "_", заменяется символом "_" перед попыткой сопоставления. Однако применяются следующие дополнительные правила:

      1. Если это параметр GPD и *NoPunctuationCharSubstitute? атрибут имеет значение TRUE, то фильтр не заменяет ""." или "-" символом "_".

      2. Если это параметр PPD и *MSNoPunctuationCharSubstitute? Строка имеет значение TRUE, а фильтр не заменяет ""." или "-" символом "_".

Сопоставление области с областью

Фильтры XPS для PCL6 и XPS для PS поддерживают таблицу сопоставления форм и области. Если несколько лотков поддерживают выбранный размер носителя (например, буква), фильтры разбивают галстук следующим образом:

  1. Если область по умолчанию (как указано в файле GPD или PPD) настроена для использования указанного размера носителя, используется область по умолчанию.

  2. В противном случае фильтр выбирает первый лоток (сверху вниз, так как они были указаны в файле GPD/PPD), настроенный с указанным размером носителя.

Дополнительное подавление страницы backside

По умолчанию фильтры XPS для PCL6 и XPS для PS обрабатывают дуплексную печать документов, содержащих смешанные размеры носителей, типы носителей, входные или выходные ячейки, вставляя пустую страницу. Когда фильтры вставляют эту пустую страницу, устройство выводит следующую страницу на передней части нового носителя. Для устройств, которые не требуют вывода обратной страницы, это поведение можно отключить, добавив следующие ключевые слова в GPD или PPD-файл драйвера.

Тип файла Ключевое слово подавления страницы на задней стороне
GPD *SuppressExtraBacksidePages?: TRUE
PPD *MSSuppressExtraBacksidePages: True

Оптимизация команд SetPageDevice

Поведение по умолчанию устройства PostScript, использующего драйвер с MSxpsPS.dll, заключается в том, что для каждой страницы выдается команда SetPageDevice, и эта команда указывает полный набор параметров, указанных для страницы. Обратите внимание, что некоторые устройства могут работать неправильно с помощью этого метода.

Однако если устройство использует MSxpsPS.dll и сопровождающий PPD-файл указывает *MSOptimizeSetPageDevice: True, то для каждой страницы, в которой произошло изменение любой части команды SetPageDevice с предыдущей страницы, будет выдана новая команда SetPageDevice, указывающая набор параметров, указанных для страницы. Но если никаких изменений в любой части команды SetPageDevice с предыдущей страницы не было, команда SetPageDevice не будет выдана для страницы.

Поддерживаемые функции PrintTicket

Отрисовка драйвера принтера версии 4