Работа с распечаткой билетов | С++

Документы XPS и Объектная модель XPS могут использовать объекты тикетов печати, которые описаны в Спецификации схемы печати, для указания настроек печати документа для принтеров и приложений просмотра.

Схема печати — это схема на основе XML, которая имеет иерархическую структуру и используется для организации и описания свойств принтера или задания печати. ​​Она состоит из двух основных компонентов: Ключевые слова схемы печати и Структура схемы печати. Print Schema keywords — это экземпляры элементов, которые описывают атрибуты принтера и форматирование задания печати, в то время как Print Schema Framework определяет коллекцию типов элементов XML в иерархической структуре и указывает, как эти типы элементов могут использоваться вместе.

Технология Print Schema, называемая PrintTicket, построена с использованием Print Schema keywords, как указано Print Schema Framework. Print Schema Specification поддерживает расширения схем третьими лицами, так что пользователи Print Schema не ограничены экземплярами Property, Feature, Option или ParameterInit, которые определены Print Schema keywords. Экземпляры сторонних элементов могут быть добавлены к экземплярам элементов, которые определены Print Schema keywords; однако частные сторонние экземпляры Property должны принадлежать пространству имен, которое явно связано со третьей стороной, создавшей пространство имен.

Поддержка Print Ticket в Aspose.Page для C++

API Aspose.Page для C++ включает набор классов, которые инкапсулируют элементы, определенные ключевыми словами Print Schema. Поскольку количество этих классов довольно велико, в этой статье рассматриваются только несколько наиболее распространенных методов управления тикетами печати в документе XPS с использованием API Aspose.Page. Сначала мы обсудим создание экземпляра каждого класса объектов, который мы хотим включить в тикет печати. ​​Затем мы увидим, как включить эти объекты в тикет печати.

Как указать входной лоток

Функция JobInputBin описывает установленный входной лоток на устройстве или полный список поддерживаемых лотков для устройства. Она позволяет указывать входной лоток для каждого задания. Также существуют функции DocumentInputBin и PageInputBin, которые позволяют указывать входной контейнер для каждого документа и каждой страницы соответственно. Предполагается, что любой документ Print Ticket включает только один из трех. Все они наследуются от класса InputBin и имеют конструкторы с одинаковой сигнатурой, поэтому мы будем использовать JobInputBin для демонстрационных целей.

Следующий код

1new JobInputBin(InputBin.InputBinOption.AutoSelect);

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

Класс InputBin.InputBinOption определяет статические поля, каждое из которых служит основой для различных вариантов входного лотка. Каждый параметр может содержать дополнительные свойства, такие как InputBin.BinType, InputBin.FeedDirection, InputBin.FeedFace, InputBin.FeedType, InputBin.MediaCapacity, InputBin.MediaPath, InputBin.MediaSizeAutoSense, InputBin.MediaTypeAutoSense и InputBin.MediaSheetCapacity. Чтобы указать их, необходимо сначала клонировать базовое свойство, а затем вызвать метод Add() со списком желаемых свойств:

1new JobInputBin(InputBin.InputBinOption.Manual.Clone().Add(
2    InputBin.FeedFace.FaceDown, InputBin.FeedDirection.LongEdgeFirst, new InputBin.MediaSheetCapacity(100)));

Как указать выходной лоток

Функция JobOutputBin описывает установленный выходной лоток на устройстве или полный список поддерживаемых лотков для устройства. Ключевые слова JobOutputBin, DocumentOutputBin и PageOutputBin являются взаимоисключающими; в одном тикете печати следует указывать только один из них.

Каждый параметр может содержать следующие свойства: OutputBin.BinType и OutputBin.MediaSheetCapacity. Таким образом, функцию JobOutputBin можно построить следующим образом:

1new JobOutputBin(new OutputBin.OutputBinOption(OutputBin.BinType.Sorter),
2    new OutputBin.OutputBinOption(OutputBin.BinType.Stacker, new OutputBin.MediaSheetCapacity(100)));

Как указать ориентацию страницы

Функция PageOrientation описывает ориентацию листа физического носителя. Доступные параметры перечислены в разделе класса PageOrientation.PageOrientationOption справочника API. Ниже приведен пример того, как создать функцию:

1new PageOrientation(PageOrientation.PageOrientationOption.Landscape);

Как указать дуплексный режим для вывода

Функция JobDuplexAllDocumentsContiguously описывает дуплексные характеристики вывода. Функция дуплекса позволяет печатать на обеих сторонах носителя. Все документы в задании дуплексируются вместе непрерывно. JobDuplexAllDocumentsContiguously и DocumentDuplex являются взаимоисключающими. Драйвер должен определить обработку ограничений между этими ключевыми словами. Последнее ключевое слово означает, что каждый документ в задании дуплексируется отдельно.

Для этой функции есть три параметра - OneSided, TwoSidedLongEdge и TwoSidedShortEdge. У первого нет свойств, а два других параметризованы с помощью Duplex.DuplexMode.

Например, если вы хотите указать двустороннюю печать для вашего файла XPS, чтобы страница переворачивалась параллельно MediaSizeHeight, вы можете сделать это следующим образом:

1new JobDuplexAllDocumentsContiguously(Duplex.DuplexOption.TwoSidedLongEdge(Duplex.DuplexMode.Automatic));

Если вы не хотите, чтобы ваш файл был двусторонним, вы можете добавить в тикет печати следующую функцию:

1new JobDuplexAllDocumentsContiguously(Duplex.DuplexOption.OneSided);

Как указать настройки цвета для вывода

Функция PageOutputColor описывает характеристики настроек цвета для вывода. Для этой функции есть три параметра: Color, Grayscale и Monochrome, каждый из которых имеет два целочисленных свойства: DeviceBitsPerPixel и DriverBitsPerPixel.

Например, если вы хотите, чтобы ваш цветной принтер печатал файл XPS в оттенках серого, вы можете добавить следующую функцию в тикет печати:

1new PageOutputColor(PageOutputColor.PageOutputColorOption.Grayscale(0, 8));

Как работать с тикетами печати разных уровней

Если вы работаете с файлом XPS, созданным кем-то другим, вы можете изменить его тикет печати, если он присутствует. Чтобы получить тикет печати уровня задания, вы можете просто использовать свойство JobPrintTicket объекта XpsDocument:

1JobPrintTicket pt = document.JobPrintTicket;

Чтобы получить тикет печати для определенного документа в файле XPS, следует использовать метод GetDocumentPrintTicket():

1DocumentPrintTicket pt = document.GetDocumentPrintTicket(<n>);

где <n> — это номер документа в файле XPS.

Чтобы получить тикет печати для определенной страницы в файле XPS, следует использовать метод GetPagePrintTicket():

1PagePrintTicket pt = document.GetPagePrintTicket(<m>, <n>);

где <m> — это номер документа в файле XPS, а <n> — это номер страницы в m-м документе.

После получения экземпляра билета печати, если он не null, вы можете добавить свои функции, сконструированные так, как показано в разделах выше:

1pt.Add(<features>);

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

Если вы не хотите изменять существующие тикеты печати, а вместо этого назначаете совершенно новый экземпляр (что также относится к новому файлу XPS), то для тикета печати уровня задания вам следует снова использовать свойство JobPrintTicket:

1document.JobPrintTicket = new JobPrintTicket(<features>);

где <features> — это массив функций переменной длины, подходящий для талона печати задания.

Если вы хотите назначить талон печати для определенного документа в файле XPS, следует использовать метод SetDocumentPrintTicket():

1document.SetDocumentPrintTicket(<n>, new DocumentPrintTicket(<features>));

где <n> — это номер документа в файле XPS, а <features> — это массив функций переменной длины, подходящий для билета печати на уровне документа.

Наконец, если вы хотите назначить билет печати для определенной страницы в файле XPS, вам следует использовать метод SetPagePrintTicket():

1document.SetPagePrintTicket(<m>, <n>, new PagePrintTicket(<features>));

где <m> — номер документа в файле XPS, <n> — номер страницы в m-м документе, а <features> — массив функций переменной длины, подходящий для билета печати на уровне страницы.

Ниже приведен полный пример кода для билета печати на уровне задания из примера проекта Aspose.Page для C++:

 1    // ExStart:CreateCustomPrintTicket
 2    // For complete examples and data files, please go to https://github.com/aspose-page/Aspose.Page-for-.NET
 3    // The path to the documents directory.
 4    System::String dir = RunExamples::GetDataDir_WorkingWithPrintTickets();
 5    
 6    // Create new XPS document
 7    {
 8        System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>();
 9        // Clearing resources under 'using' statement
10        System::Details::DisposeGuard<1> __dispose_guard_0({ document});
11        // ------------------------------------------
12        
13        try
14        {
15            // Set a custom job-level print ticket
16            document->set_JobPrintTicket(System::MakeObject<JobPrintTicket>(
17				System::MakeArray<System::SharedPtr<IJobPrintTicketItem>>({
18						// Specify input bin.
19						System::MakeObject<JobInputBin>(System::MakeArray<System::SharedPtr<InputBin::IInputBinItem>>({InputBin::InputBinOption::Manual->Clone()->Add(System::MakeArray<System::SharedPtr<InputBin::IInputBinOptionItem>>(
20							{InputBin::FeedFace::FaceDown, InputBin::FeedDirection::LongEdgeFirst, System::MakeObject<InputBin::MediaSheetCapacity>(100)}))})), 
21						// Specify output bin.
22						System::MakeObject<JobOutputBin>(System::MakeArray<System::SharedPtr<OutputBin::IOutputBinItem>>({
23								System::MakeObject<OutputBin::OutputBinOption>(System::MakeArray<System::SharedPtr<OutputBin::IOutputBinOptionItem>>(
24									{OutputBin::BinType::Sorter})),
25								System::MakeObject<OutputBin::OutputBinOption>(System::MakeArray<System::SharedPtr<OutputBin::IOutputBinOptionItem>>(
26									{OutputBin::BinType::Stacker, System::MakeObject<OutputBin::MediaSheetCapacity>(100)}))})),
27						// Specify page orientation.
28						System::MakeObject<PageOrientation>(System::MakeArray<System::SharedPtr<PageOrientation::PageOrientationOption>>(
29							{PageOrientation::PageOrientationOption::Landscape})),
30						// Specify duplex mode for the output.
31						System::MakeObject<JobDuplexAllDocumentsContiguously>(System::MakeArray<System::SharedPtr<Duplex::DuplexOption>>(
32							{Duplex::DuplexOption::TwoSidedLongEdge(Duplex::DuplexMode::Automatic)})), 
33						// Specify the color settings for the output.	
34						System::MakeObject<PageOutputColor>(System::MakeArray<System::SharedPtr<PageOutputColor::IPageOutputColorItem>>(
35							{PageOutputColor::PageOutputColorOption::Grayscale(0, 8)}))})));
36            
37            // Save the document with the custom job-level print ticket.
38            document->Save(dir + u"output1.xps");
39        }
40        catch(...)
41        {
42            __dispose_guard_0.SetCurrentException(std::current_exception());
43        }
44    }
45    // ExEnd:CreateCustomPrintTicket

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.