Trabalhar com tickets de impressão | C++

Esquema de Impressão

Os documentos XPS e o Modelo de Objecto XPS podem utilizar os objectos de ticket de impressão, descritos na Especificação do Esquema de Impressão, para especificar as preferências de impressão de um documento para impressoras e aplicações de visualização.

O Esquema de Impressão é um esquema baseado em XML, estruturado hierarquicamente e utilizado para organizar e descrever as propriedades de uma impressora ou de um trabalho de impressão. É constituído por dois componentes principais: as Palavras-chave do Esquema de Impressão e a Estrutura do Esquema de Impressão. As Palavras-chave do Esquema de Impressão são instâncias de elementos que descrevem os atributos da impressora e a intenção de formatação do trabalho de impressão, enquanto a Estrutura do Esquema de Impressão define uma coleção de tipos de elementos XML numa estrutura hierárquica e especifica como estes tipos de elementos podem ser utilizados em conjunto.

A tecnologia Print Schema, denominada PrintTicket, é construída utilizando as palavras-chave do Print Schema, conforme especificado pelo Print Schema Framework. A especificação do Print Schema suporta extensões de esquema de terceiros, para que os utilizadores do Print Schema não fiquem restritos às instâncias de Property, Feature, Option ou ParameterInit definidas pelas palavras-chave do Print Schema. As instâncias de elementos de terceiros podem ser adicionadas a instâncias de elementos definidas pelas palavras-chave do Print Schema; no entanto, as instâncias privadas de Property de terceiros devem pertencer a um namespace claramente associado ao terceiro que criou o namespace.

Suporte de Print Ticket no Aspose.Page para C++

A API Aspose.Page para C++ inclui um conjunto de classes que encapsulam elementos definidos pelas palavras-chave do Print Schema. Uma vez que o número destas classes é bastante grande, este artigo aborda apenas algumas das técnicas mais comuns para manipular tickets de impressão num documento XPS utilizando a API Aspose.Page. Em primeiro lugar, iremos discutir a instanciação de cada classe de recurso que desejamos incluir no ticket de impressão. Em seguida, veremos como incluir estes recursos num ticket de impressão.

Como especificar o compartimento de entrada

A funcionalidade JobInputBin descreve o compartimento de entrada instalado num dispositivo ou a lista completa de compartimentos suportados para um dispositivo. Permite a especificação do compartimento de entrada por trabalho. Existem ainda as funcionalidades DocumentInputBin e PageInputBin que permitem a especificação do compartimento de entrada por documento e por página, respectivamente. Qualquer documento Print Ticket deve incluir apenas um dos três. Todos eles herdam da classe InputBin e têm construtores com a mesma assinatura, pelo que utilizaremos o JobInputBin para efeitos de demonstração.

O código a seguir

1new JobInputBin(InputBin.InputBinOption.AutoSelect);

Cria uma funcionalidade para um ticket de impressão de trabalho que instrui um dispositivo de impressão a escolher automaticamente a melhor opção com base na configuração.

A classe InputBin.InputBinOption define campos estáticos, cada um dos quais serve de base para várias opções de compartimento de entrada. Cada opção pode conter propriedades adicionais, como InputBin.BinType, InputBin.FeedDirection, InputBin.FeedFace, InputBin.FeedType, InputBin.MediaCapacity, InputBin.MediaPath, InputBin.MediaSizeAutoSense, InputBin.MediaTypeAutoSense, e InputBin.MediaSheetCapacity. Para os especificar, deve primeiro clonar a propriedade base e, em seguida, chamar o método Add() com uma lista das propriedades pretendidas:

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

Para obter a lista completa dos valores de propriedade disponíveis, consulte a Especificação do Esquema de Impressão e a secção relevante da referência da API do Aspose.Page.

Como especificar o compartimento de saída

A funcionalidade JobOutputBin descreve o compartimento de saída instalado num dispositivo ou a lista completa de compartimentos suportados para um dispositivo. As palavras-chave JobOutputBin, DocumentOutputBin e PageOutputBin são mutuamente exclusivas; apenas uma deve ser especificada num único ticket de impressão.

Cada opção pode conter as seguintes propriedades: OutputBin.BinType e OutputBin.MediaSheetCapacity. Assim sendo, um recurso JobOutputBin pode ser construído da seguinte forma:

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

Como especificar a orientação da página

A funcionalidade PageOrientation descreve a orientação da folha de suporte físico. As opções disponíveis estão listadas na secção de classe PageOrientation.PageOrientationOption da referência da API. Abaixo, um exemplo de como construir o recurso:

1new PageOrientation(PageOrientation.PageOrientationOption.Landscape);

Como especificar o modo duplex para a saída

A funcionalidade JobDuplexAllDocumentsContiguously descreve as características duplex da saída. A funcionalidade duplex permite a impressão em ambos os lados dos suportes. Todos os documentos de trabalho são duplexados de forma contígua. JobDuplexAllDocumentsContiguously e DocumentDuplex são mutuamente exclusivos. Cabe ao driver determinar o tratamento de restrições entre estas palavras-chave. A última palavra-chave significa que cada documento de trabalho é duplexado separadamente.

Existem três opções para esta funcionalidade: OneSided, TwoSidedLongEdge e TwoSidedShortEdge. A primeira não tem propriedades e as outras duas estão parametrizadas com Duplex.DuplexMode.

Por exemplo, se pretender especificar a impressão frente e verso para o seu ficheiro XPS de modo a que a página seja virada paralelamente à MediaSizeHeight, faça o seguinte:

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

Se não pretender que o seu ficheiro seja duplexado, pode adicionar o seguinte recurso ao ticket de impressão:

1new JobDuplexAllDocumentsContiguously(Duplex.DuplexOption.OneSided);

Como especificar as definições de cor para a saída

A funcionalidade PageOutputColor descreve as características das definições de cor para a saída. Existem três opções para esta funcionalidade: Color, Grayscale e Monochrome, cada uma com duas propriedades inteiras: DeviceBitsPerPixel e DriverBitsPerPixel.

Por exemplo, se pretender que a sua impressora a cores imprima um ficheiro XPS em escala de cinzentos, pode adicionar o seguinte recurso ao ticket de impressão:

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

Como trabalhar com tickets de impressão de diferentes níveis

Se estiver a trabalhar com um ficheiro XPS criado por outra pessoa, poderá querer modificar o ticket de impressão, caso este esteja presente. Para obter um ticket de impressão ao nível da tarefa, basta utilizar a propriedade JobPrintTicket do objeto XpsDocument:

1JobPrintTicket pt = document.JobPrintTicket;

Para obter um ticket de impressão para um documento específico no ficheiro XPS, deve utilizar o método GetDocumentPrintTicket():

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

em que <n> é o número do documento no ficheiro XPS.

Para obter um ticket de impressão para uma página específica no ficheiro XPS, deve utilizar o método GetPagePrintTicket():

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

em que <m> é o número do documento no ficheiro XPS e <n> é o número da página no m-ésimo documento.

Após obter uma instância do ticket de impressão, se não for null, pode adicionar os seus recursos construídos como mostrado nas secções acima:

1pt.Add(<features>);

onde <features> é um array de tamanho variável de recursos apropriados para o ticket de impressão do nível específico. Se o bilhete de impressão antigo já contivesse alguns dos recursos que está a tentar adicionar, estes serão substituídos pelas novas instâncias.

Se não quiser modificar os tickets de impressão existentes, mas sim atribuir uma instância totalmente nova (o que também é o caso de um novo ficheiro XPS), para o ticket de impressão do nível de tarefa, deve utilizar novamente a propriedade JobPrintTicket:

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

onde <recursos> é um array de tamanho variável de recursos apropriados para o ticket de impressão do trabalho.

Caso pretenda atribuir um ticket de impressão a um documento específico dentro do ficheiro XPS, deve ser utilizado o método SetDocumentPrintTicket():

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

em que <n> é o número do documento dentro do ficheiro XPS e <features> é uma matriz de tamanho variável de características apropriadas para o ticket de impressão ao nível do documento.

Por fim, se pretender atribuir um ticket de impressão a uma página específica dentro do ficheiro XPS, deve utilizar o método SetPagePrintTicket():

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

em que <m> é o número do documento no ficheiro XPS, <n> é o número da página no m-ésimo documento e <features> é uma matriz de tamanho variável de características apropriadas para o ticket de impressão ao nível da página.

Abaixo está o exemplo de código completo para o ticket de impressão ao nível da tarefa do projeto de exemplo Aspose.Page para 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.