Trabalhar com Texto em PostScript | C++
Adicionar Texto em Documento PS
Neste artigo, consideramos as formas como um texto pode ser adicionado a um documento PS.
Obviamente, o texto deve ser escrito num documento com alguma fonte. As fontes podem ser armazenadas em pastas do sistema e, neste caso, chamamos-lhes fontes do sistema, e podem ser armazenadas em pastas personalizadas, que são pastas nas quais alguém coloca fontes para uso específico. Normalmente, estas fontes não estão presentes nas pastas do sistema. Chamamos a estas fontes fontes personalizadas. A biblioteca Aspose.Page para C++ oferece métodos para utilizar fontes do sistema e personalizadas.
Para utilizar tipos de letra do sistema, basta preencher ou contornar um texto com System.Drawing.Font nativo do C++. Os números na chamada do método são as coordenadas x e y do canto superior esquerdo do 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 utilizar tipos de letra personalizados, adicione primeiro a pasta custom fonts em PsSaveOptions e, em seguida, procure Aspose.Page.Font.DrFont. E, por fim, preencha ou contorne o texto com 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);
Outra opção é trabalhar com texto que também pertence a um tipo de letra. A fonte utilizada para imprimir texto no documento PostScript pode estar incorporada neste ficheiro ou não. No primeiro caso, o texto será sempre renderizado em qualquer visualizador ou editor PostScript, uma vez que estará sempre presente com o texto. No segundo caso, devemos esperar que a fonte utilizada exista em pastas do sistema no host de destino. Se a fonte utilizada não existir, o interpretador PostScript poderá gerar um erro.
A terceira opção também se refere à fonte, uma vez que é o principal componente na adição de texto. Uma fonte utilizada para preencher ou desenhar (ou recortar) um texto pode ser incorporada num ficheiro PS de várias formas. Agora, os tipos de fonte TrueType e Type3 são suportados na incorporação.
A quarta opção é a possibilidade de escrever os glifos do texto com avanços (larguras) atribuídos. Isto permite adicionar um toque artístico ao texto.
No exemplo abaixo, demonstramos a utilização de vários métodos para adicionar texto num documento PS com a biblioteca Aspose.Page para C++.
Um algoritmo para adicionar texto num novo documento PS inclui os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie PsSaveOptions. Se utilizarmos uma fonte personalizada, adicionaremos pasta(s) de fontes personalizadas nas opções de guardar.
- Crie PsDocument com o fluxo de saída já criado e as opções de guardar.
- Crie a fonte necessária, system ou custom.
- Preencha ou contorne o texto com a fonte criada. Aqui, podemos atribuir System.Drawing.Brush ou System.Drawing.Pen, dependendo se vamos preencher ou desenhar o texto. Ou podemos preencher e contorná-lo num único método. Se utilizarmos o método sem System.Drawing.Brush ou System.Drawing.Pen, o texto será preenchido ou contornado com a tinta/traço atual no estado gráfico atual.
- Feche a página.
- Guarde o documento.
Dividimos o código de exemplo em pequenos excertos de código para separar a preparação inicial do documento PS, a utilização de cada método para adicionar texto e a conclusão do documento.
Neste trecho de código, criamos um fluxo de saída e PsSaveOptions, adicionamos uma pasta de fontes personalizadas para utilizar a fonte personalizada no código, criamos um objeto PsDocument, definimos o texto comum a todos os métodos como uma variável de string e criamos a variável fontSize, que também é utilizada em todos os 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);
Aqui demonstramos a utilização da fonte do sistema para preencher o texto com a cor atual do estado gráfico (que é preto) e com o novo 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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
O resultado
Agora preenchemos o texto com a fonte 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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
O resultado
Aqui, demonstramos a utilização da fonte do sistema para contornar o texto com o traço atual do estado gráfico (i.e., preto) e com a nova Caneta.
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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
O resultado
Agora, contornamos o texto com a fonte 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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
O resultado
Aqui, demonstramos a utilização da fonte do sistema para preencher e contornar o texto com os novos SolidBrush e 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));
O resultado
Agora, preenchemos e contornamos o texto com a fonte 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));
O resultado
E, por fim, preenchemos o texto atribuindo as larguras dos glifos. O número de larguras deve ser igual ao 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()));
O resultado
Feche a página atual e guarde o 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 }
Veja como trabalhar com texto em documentos PS em Java.
No exemplo acima, as fontes utilizadas são incorporadas no ficheiro PostScript como fontes TrueType, pois este é o comportamento padrão de guardar fontes na classe PsDocument. Se precisar de alterar este comportamento, utilize PsSaveOptions como se mostra a seguir:
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);
Pode descarregar exemplos e ficheiros de dados do GitHub.