Trabajar con tickets impresos | C++
Esquema de impresión
Los documentos XPS y el modelo de objetos XPS pueden utilizar los objetos de ticket de impresión, que se describen en la Especificación del esquema de impresión, para especificar las preferencias de impresión de un documento para impresoras y aplicaciones de visualización.
El Esquema de impresión es un esquema basado en XML que está estructurado jerárquicamente y se utiliza para organizar y describir las propiedades de una impresora o trabajo de impresión. Consta de dos componentes principales: las Palabras clave del esquema de impresión y el Marco del esquema de impresión. Las palabras clave del esquema de impresión son instancias de elementos que describen los atributos de la impresora y la intención de formato del trabajo de impresión, mientras que el marco del esquema de impresión define una colección de tipos de elementos XML en una estructura jerárquica y especifica cómo se pueden usar estos tipos de elementos juntos.
La tecnología Print Schema, denominada PrintTicket, se crea utilizando las palabras clave del Print Schema según lo especificado en Print Schema Framework. La especificación del esquema de impresión admite extensiones de esquema de terceros, de modo que los usuarios del esquema de impresión no están restringidos a las instancias Property, Feature, Option o ParameterInit definidas por las palabras clave del esquema de impresión. Se pueden agregar instancias de elementos de terceros a instancias de elementos definidas por las palabras clave del esquema de impresión; sin embargo, las instancias privadas de Propiedad de terceros deben pertenecer a un espacio de nombres que esté claramente asociado con el tercero que creó el espacio de nombres.
El soporte de Print Ticket en Aspose.Page para C++
La API Aspose.Page para C++ incluye un conjunto de clases que encapsulan elementos definidos por las palabras clave del esquema de impresión. Dado que la cantidad de estas clases es bastante grande, este artículo cubre solo algunas de las técnicas más comunes para manipular tickets de impresión en un documento XPS utilizando la API Aspose.Page. Primero discutiremos la creación de instancias de cada clase de entidad que queremos incluir en el ticket de impresión. Luego, veremos cómo incluir estas características en un ticket impreso.
Cómo especificar la bandeja de entrada
La función JobInputBin describe el contenedor de entrada instalado en un dispositivo o la lista completa de contenedores compatibles para un dispositivo. Permite la especificación del contenedor de entrada por trabajo. También existen las funciones DocumentInputBin y PageInputBin que permiten la especificación de la bandeja de entrada por documento y por página, respectivamente. Se supone que cualquier documento Print Ticket debe incluir solo uno de los tres. Todos ellos heredan de la clase InputBin y tienen constructores con la misma firma, por lo que usaremos JobInputBin con fines de demostración.
El siguiente código
1new JobInputBin(InputBin.InputBinOption.AutoSelect);
crea una función para un ticket de impresión de trabajo que indica a un dispositivo de impresión que elija automáticamente la mejor opción según la configuración.
La clase
InputBin.InputBinOption define campos estáticos, cada uno de los cuales sirve como base para varias opciones de contenedor de entrada. Cada opción puede contener propiedades adicionales como
InputBin.BinType,
InputBin.FeedDirection,
InputBin.FeedFace,
InputBin.FeedType,
InputBin.MediaCapacity,
InputBin.MediaPath,
InputBin.MediaSizeAutoSense,
InputBin.MediaTypeAutoSense y
InputBin.MediaSheetCapacity. Para especificarlas, primero debe clonar la propiedad base y luego llamar al método Add()
con una lista de las propiedades deseadas:
1new JobInputBin(InputBin.InputBinOption.Manual.Clone().Add(
2 InputBin.FeedFace.FaceDown, InputBin.FeedDirection.LongEdgeFirst, new InputBin.MediaSheetCapacity(100)));
Para obtener la lista completa de valores de propiedades disponibles, consulte la Especificación del esquema de impresión y la sección correspondiente de Aspose.Page referencia de API.
Cómo especificar la bandeja de salida
La función
JobOutputBin describe la bandeja de salida instalada en un dispositivo o la lista completa de bandejas compatibles para un dispositivo. Las palabras clave JobOutputBin
,
DocumentOutputBin y
PageOutputBin son mutuamente excluyentes; sólo se debe especificar uno en un único ticket impreso.
Cada opción puede contener las siguientes propiedades:
OutputBin.BinType y
OutputBin.MediaSheetCapacity. Por lo tanto, una característica JobOutputBin
se puede construir de la siguiente manera:
1new JobOutputBin(new OutputBin.OutputBinOption(OutputBin.BinType.Sorter),
2 new OutputBin.OutputBinOption(OutputBin.BinType.Stacker, new OutputBin.MediaSheetCapacity(100)));
Cómo especificar la orientación de la página
La función PageOrientation describe la orientación de la hoja de soporte físico. Las opciones disponibles se enumeran en la sección de clase PageOrientation.PageOrientationOption de la referencia de API. A continuación se muestra un ejemplo de cómo construir la característica:
1new PageOrientation(PageOrientation.PageOrientationOption.Landscape);
Cómo especificar el modo dúplex para la salida
La función
JobDuplexAllDocumentsContiguamente describe las características dúplex de la salida. La función dúplex permite imprimir en ambas caras del soporte. Todos los documentos del trabajo se colocan a dos caras de forma contigua. JobDuplexAllDocumentsContigufully
y
DocumentDuplex son mutuamente excluyentes. Depende del conductor determinar el manejo de restricciones entre estas palabras clave. La última palabra clave significa que cada documento del trabajo se imprime a doble cara por separado.
Hay
tres opciones para esta función: OneSided
, TwoSidedLongEdge
y TwoSidedShortEdge
. El primero no tiene propiedades y los otros dos están parametrizados con
Duplex.DuplexMode.
Por ejemplo, si desea especificar la impresión a dos caras para su archivo XPS de modo que la página se voltee en paralelo a MediaSizeHeight, puede hacerlo de la siguiente manera:
1new JobDuplexAllDocumentsContiguously(Duplex.DuplexOption.TwoSidedLongEdge(Duplex.DuplexMode.Automatic));
Si no desea que su archivo se imprima a doble cara, puede agregar la siguiente función al ticket de impresión:
1new JobDuplexAllDocumentsContiguously(Duplex.DuplexOption.OneSided);
Cómo especificar la configuración de color para la salida
La función PageOutputColor describe las características de la configuración de color para la salida. Hay tres opciones para esta función: “Color”, “Escala de grises” y “Monocromo”, cada una de las cuales tiene dos propiedades enteras: “DeviceBitsPerPixel” y “DriverBitsPerPixel”.
Por ejemplo, si desea que su impresora a color imprima un archivo XPS en escala de grises, puede agregar la siguiente función al ticket de impresión:
1new PageOutputColor(PageOutputColor.PageOutputColorOption.Grayscale(0, 8));
Cómo trabajar con tickets impresos de diferentes niveles.
Si está trabajando con un archivo XPS creado por otra persona, es posible que desee modificar su ticket de impresión en caso de que esté presente. Para obtener un ticket de impresión a nivel de trabajo, simplemente puede usar la propiedad
JobPrintTicket del objeto XpsDocument
:
1JobPrintTicket pt = document.JobPrintTicket;
Para obtener un ticket de impresión para un documento específico en el archivo XPS, debe utilizar el método GetDocumentPrintTicket():
1DocumentPrintTicket pt = document.GetDocumentPrintTicket(<n>);
donde <n>
es el número del documento dentro del archivo XPS.
Para obtener un ticket de impresión para una página específica en el archivo XPS, debe utilizar el método GetPagePrintTicket():
1PagePrintTicket pt = document.GetPagePrintTicket(<m>, <n>);
donde <m>
es el número del documento dentro del archivo XPS y <n>
es el número de la página dentro del m-ésimo documento.
Después de obtener una instancia de ticket de impresión, si no es “nula”, puede agregar sus funciones construidas como se muestra en las secciones anteriores:
1pt.Add(<features>);
donde <características>
es una matriz de longitud variable de características apropiadas para el ticket de impresión del nivel particular. Si el ticket de impresión anterior ya tenía algunas de las funciones que está intentando agregar, las nuevas instancias las sobrescribirán.
Si no desea modificar los tickets de impresión existentes, sino asignar una instancia completamente nueva (que también es el caso de un nuevo archivo XPS), entonces, para el ticket de impresión a nivel de trabajo, debe usar la propiedad JobPrintTicket
nuevamente. :
1document.JobPrintTicket = new JobPrintTicket(<features>);
donde <características>
es una matriz de longitud variable de características apropiadas para el ticket de impresión del trabajo.
En caso de que desee asignar un ticket de impresión para un documento específico dentro del archivo XPS, se debe utilizar el método
SetDocumentPrintTicket():
1document.SetDocumentPrintTicket(<n>, new DocumentPrintTicket(<features>));
donde <n>
es el número del documento dentro del archivo XPS y <features>
es una matriz de características de longitud variable apropiada para el ticket de impresión a nivel de documento.
Finalmente, si desea asignar un ticket de impresión para una página específica dentro del archivo XPS, debe usar el método SetPagePrintTicket():
1document.SetPagePrintTicket(<m>, <n>, new PagePrintTicket(<features>));
donde <m>
es el número del documento dentro del archivo XPS, <n>
es el número de la página dentro del m-ésimo documento y <features>
es una matriz de características de longitud variable apropiada para el ticket de impresión a nivel de página.
A continuación se muestra el ejemplo de código completo para el ticket de impresión a nivel de trabajo del proyecto de ejemplo 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