Trabajar con texto en PostScript | C++
Agregar texto en un documento PS
En este artículo, consideramos las formas en que se puede agregar texto a un documento PS.
Evidentemente, el texto debe estar escrito en un documento con alguna fuente. Las fuentes se pueden almacenar en carpetas del sistema y, en este caso, las llamamos fuentes del sistema y se pueden almacenar en carpetas personalizadas, que son carpetas en las que alguien coloca fuentes para un uso particular. Por lo general, estas fuentes no están en las carpetas del sistema. A estas fuentes las llamamos fuentes personalizadas. La biblioteca Aspose.Page para C++ ofrece métodos para usar fuentes de sistema y personalizadas.
Para usar fuentes del sistema, simplemente completamos o delineamos un texto con System.Drawing.Font de C++ nativo. Los números en la llamada del método son las coordenadas xey de la esquina superior izquierda del texto.
1document->FillText(str, System::MakeObject<System::Drawing::Font>(u"Times New Roman", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold), 50.0f, 100.0f);
Para usar fuentes personalizadas, primero agregue la carpeta fuentes personalizadas en PsSaveOptions, luego busque Aspose.Page.Font.DrFont. Y finalmente complete o delinee el texto con este objeto DrFont.
1options->set_AdditionalFontsFolders(System::MakeArray<System::String>({FONTS_FOLDER}));
2System::SharedPtr<DrFont> drFont = ExternalFontCache::FetchDrFont(u"Palatino Linotype", static_cast<float>(fontSize), System::Drawing::FontStyle::Regular);
3document->FillText(str, drFont, 50.0f, 200.0f);
Otra opción es trabajar con texto que también pertenece a una fuente. La fuente que se utiliza para imprimir texto en el documento PostScript puede estar incrustada en este archivo o no. En el primer caso, el texto siempre se representará en cualquier visor o editor PostScript porque siempre se encuentra con el texto. En el segundo caso, deberíamos esperar que la fuente utilizada exista en las carpetas del sistema en el host de destino. Si la fuente utilizada no existe, el intérprete PostScript puede generar un error.
La tercera opción también tiene que ver con una fuente porque una fuente es lo principal al agregar texto. Una fuente utilizada para rellenar o dibujar (o recortar) un texto se puede incrustar en un archivo PS de varias formas. Ahora se admiten los tipos de fuente TrueType y Type3 incrustados.
La cuarta opción es la posibilidad de escribir los glifos del texto con avances asignados (anchos). Permite agregar algo de arte al texto.
En el siguiente ejemplo, demostramos el uso de varios métodos para agregar texto en un documento PS con la biblioteca Aspose.Page para C++.
Un algoritmo para agregar un texto en un nuevo documento PS incluye los siguientes pasos:
- Cree una secuencia de salida para el archivo PS resultante.
- Cree PsSaveOptions. Si usamos una fuente personalizada, agregamos carpetas de fuentes personalizadas en las opciones de guardar.
- Cree PsDocument con el flujo de salida ya creado y guarde las opciones.
- Cree la fuente necesaria, sistema o personalizado.
- Rellene o delinee el texto con la fuente creada. Aquí podremos asignar System.Drawing.Brush o System.Drawing.Pen dependiendo de si rellenamos o dibujamos el texto. O podemos completar y delinear el texto con un solo método. Si utilizamos el método sin System.Drawing.Brush o System.Drawing.Pen, el texto se rellenará o delineará con la pintura/trazo actual en el estado de gráficos actual.
- Cierra la página.
- Guarde el documento.
Dividimos el código de ejemplo en pequeños fragmentos de código para separar la preparación inicial del documento PS, el uso de cada método para agregar texto y la finalización del documento.
En este fragmento de código, creamos un flujo de salida y PsSaveOptions, agregamos una carpeta de fuentes personalizadas para usar la fuente personalizada en el código, creamos un objeto PsDocument, establecemos texto común para todos los métodos como una variable de cadena y creamos una variable fontSize que es También se utiliza en todos los métodos utilizados.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithText();
3
4 System::String FONTS_FOLDER = RunExamples::GetDataDir_Data() + u"necessary_fonts/";
5
6 //Create output stream for PostScript document
7 {
8 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"AddText_outPS.ps", System::IO::FileMode::Create);
9 // Clearing resources under 'using' statement
10 System::Details::DisposeGuard<1> __dispose_guard_0({ outPsStream});
11 // ------------------------------------------
12
13 try
14 {
15 //Create save options with A4 size
16 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
17 // Set custom fonts folder. It will be added to system fonts folders for finding needed font.
18 options->set_AdditionalFontsFolders(System::MakeArray<System::String>({FONTS_FOLDER}));
19 //A text to write to PS file
20 System::String str = u"ABCDEFGHIJKLMNO";
21 int32_t fontSize = 48;
22
23 // Create new 1-paged PS Document
24 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
Aquí demostramos el uso de la fuente del sistema para rellenar el texto con el color actual del estado de los gráficos (es decir, negro) y con el nuevo SolidBrush.
1 ////////////////////////////////////// Using sysem font (located in system fonts folders) for filling text //////////////////
2 System::SharedPtr<System::Drawing::Font> font = System::MakeObject<System::Drawing::Font>(u"Times New Roman", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold);
3 //Fill text with default or already defined color. In given case it is black.
4 document->FillText(str, font, 50.0f, 100.0f);
5 //Fill text with Blue color.
6 document->FillText(str, font, 50.0f, 150.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()));
7 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
el resultado
Ahora llenamos el texto con la fuente personalizada.
1 ////////////////////////////////////// Using custom font (located in custom fonts folders) for filling text /////////////////
2 System::SharedPtr<DrFont> drFont = ExternalFontCache::FetchDrFont(u"Palatino Linotype", static_cast<float>(fontSize), System::Drawing::FontStyle::Regular);
3 //Fill text with default or already defined color. In given case it is black.
4 document->FillText(str, drFont, 50.0f, 200.0f);
5 //Fill text with Blue color.
6 document->FillText(str, drFont, 50.0f, 250.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()));
7 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
el resultado
Aquí demostramos el uso de la fuente del sistema para delinear el texto con el trazo actual del estado de los gráficos (es decir, negro) y con el nuevo Pluma.
1 ////////////////////////////////////// Using sysem font (located in system fonts folders) for outlining text ////////////////
2 //Outline text with default or already defined pen. In given case it is black colored 1-points width pen.
3 document->OutlineText(str, font, 50.0f, 300.0f);
4 //Outline text with blue-violet colored 2-points width pen.
5 document->OutlineText(str, font, 50.0f, 350.0f, System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_BlueViolet()), 2.0f));
6 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
el resultado
Ahora delineamos el texto con la fuente personalizada.
1 ////////////////////////////////////// Using custom font (located in custom fonts folders) for outlining text /////////////////
2 //Outline text with default or already defined pen. In given case it is black colored 1-points width pen.
3 document->OutlineText(str, drFont, 50.0f, 450.0f);
4 //Outline text with blue-violet colored 2-points width pen.
5 document->OutlineText(str, drFont, 50.0f, 500.0f, System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_BlueViolet()), 2.0f));
6 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
el resultado
Aquí demostramos el uso de fuente del sistema para rellenar y delinear el texto con los nuevos SolidBrush y Pen.
1 //Fill text with orange color and stroke with blue colored 2-points width pen.
2 document->FillAndStrokeText(str, font, 50.0f, 400.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Yellow()), System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_BlueViolet()), 2.0f));
el resultado
Ahora rellenamos y delineamos el texto con la fuente personalizada.
1 //Fill text with orange color and stroke with blue colored 2-points width pen.
2 document->FillAndStrokeText(str, drFont, 50.0f, 550.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Orange()), System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()), 2.0f));
el resultado
Y finalmente llenamos el texto asignando anchos de glifos. El número de anchos debe ser igual al número de glifos.
1 //Glyphs widths
2 System::ArrayPtr<float> widths = System::MakeArray<float>({87, 87, 87, 87, 34, 87, 87});
3 //Fill ASCII text using with assigning glyphs widths.
4 document->FillText(u"BAMBOOK", widths, drFont, 50.0f, 600.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()));
5
6 //Glyphs widths
7 widths = System::MakeArray<float>({87, 34, 87, 87, 87, 87, 87});
8 //Fill Unicode text using with assigning glyphs widths.
9 document->FillText(u"ЗООПАРК", widths, drFont, 50.0f, 650.0f, System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Orange()));
el resultado
Cierre la página actual, guarde el documento.
1 //Close current page
2 document->ClosePage();
3
4 //Save the document
5 document->Save();
6 }
7 catch(...)
8 {
9 __dispose_guard_0.SetCurrentException(std::current_exception());
10 }
11 }
Ver cómo trabajar con un texto en documentos PS en Java.
En el ejemplo anterior, se utilizan fuentes incrustadas en el archivo PostScript como fuentes TrueType, porque es el comportamiento predeterminado al guardar fuentes en la clase PsDocument. Si necesita cambiar este comportamiento, utilice PsSaveOptions como se muestra a continuación:
1 //Do not embed used fonts.
2 options->set_EmbedFonts(false);
1 //Embed used fonts as Type3 fonts.
2 options->set_EmbedFontsAs(FontConstants::EMBED_FONTS_TYPE3);
Puede descargar ejemplos y archivos de datos desde GitHub.