Travailler avec du texte dans PostScript | C++
Ajouter du texte dans un document PS
Dans cet article, nous examinons les manières dont un texte peut être ajouté à un document PS.
Évidemment, le texte doit être rédigé dans un document avec une police de caractères. Les polices peuvent être stockées dans des dossiers système, et dans ce cas, nous les appelons polices système et peuvent être stockées dans des dossiers personnalisés, qui sont des dossiers dans lesquels quelqu’un place des polices pour un usage particulier. Habituellement, ces polices sont absentes des dossiers système. Nous appelons ces polices des polices personnalisées. La bibliothèque Aspose.Page pour C++ propose des méthodes pour utiliser les polices système et personnalisées.
Pour utiliser les polices système, nous remplissons ou décrivons simplement un texte avec System.Drawing.Font natif de C++. Les nombres dans l’appel de la méthode sont les coordonnées x et y du coin supérieur gauche du texte.
1document->FillText(str, System::MakeObject<System::Drawing::Font>(u"Times New Roman", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold), 50.0f, 100.0f);
Pour utiliser des polices personnalisées, ajoutez d’abord le dossier polices personnalisées dans PsSaveOptions, puis récupérez Aspose.Page.Font.DrFont. Et enfin, remplissez ou décrivez le texte avec cet objet 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);
Une autre option consiste à travailler avec du texte appartenant également à une police. La police est utilisée pour imprimer le texte dans le document PostScript et peut être intégrée ou non dans ce fichier. Dans le premier cas, le texte sera toujours rendu dans n’importe quel visualiseur ou éditeur PostScript car il se trouve toujours avec le texte. Dans le second cas, il faut s’attendre à ce que la police utilisée existe dans les dossiers système de l’hôte cible. Si la police utilisée n’existe pas, l’interpréteur PostScript peut générer une erreur.
La troisième option concerne également la police, car celle-ci est l’élément principal de l’ajout de texte. Une police utilisée pour remplir ou dessiner (ou découper) un texte peut être intégrée dans un fichier PS sous diverses formes. Les types de polices TrueType et Type3 dans l’intégration sont désormais pris en charge.
La quatrième option est la possibilité d’écrire les glyphes du texte avec des avances (largeurs) assignées. Cela permet d’ajouter un peu d’art au texte.
Dans l’exemple ci-dessous, nous démontrons l’utilisation de diverses méthodes d’ajout de texte dans un document PS avec la bibliothèque Aspose.Page pour C++.
Un algorithme pour ajouter un texte dans un nouveau document PS comprend les étapes suivantes :
- Créez un flux de sortie pour le fichier PS résultant.
- Créez PsSaveOptions. Si nous utilisons une police personnalisée, nous ajoutons un ou plusieurs dossiers de polices personnalisées dans les options de sauvegarde.
- Créez PsDocument avec le flux de sortie déjà créé et enregistrez les options.
- Créez la police nécessaire, système ou personnalisée.
- Remplissez ou décrivez le texte avec la police créée. Ici, nous pouvons attribuer System.Drawing.Brush ou System.Drawing.Pen selon que nous remplissons ou dessinons le texte. Ou nous pouvons remplir et décrire le texte en une seule méthode. Si nous utilisons la méthode sans System.Drawing.Brush ou System.Drawing.Pen, le texte sera rempli ou décrit avec la peinture/le trait actuel dans l’état graphique actuel.
- Fermez la page.
- Enregistrez le document.
Nous divisons l’exemple de code en petits extraits de code afin de séparer la préparation initiale du document PS, l’utilisation de chaque méthode d’ajout de texte et la finalisation du document.
Dans ce morceau de code, nous créons un flux de sortie et PsSaveOptions, ajoutons un dossier de polices personnalisées pour utiliser la police personnalisée dans le code, créons un objet PsDocument, définissons le texte commun à toutes les méthodes en tant que variable de chaîne et créons une variable fontSize qui est également utilisé dans chaque méthode utilisée.
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);
Nous démontrons ici l’utilisation de la police système pour remplir le texte avec la couleur actuelle de l’état graphique (c’est-à-dire le noir) et avec le nouveau 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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Le résultat
Maintenant, nous remplissons le texte avec la police personnalisée.
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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Le résultat
Nous démontrons ici l’utilisation de la police système pour décrire le texte avec le trait actuel de l’état graphique (c’est-à-dire noir) et avec le nouveau Pen.
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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Le résultat
Nous décrivons maintenant le texte avec la police personnalisée.
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Le résultat
Nous démontrons ici l’utilisation de la police système pour remplir et décrire le texte avec les nouveaux SolidBrush et 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));
Le résultat
Maintenant, nous remplissons et décrivons le texte avec la police personnalisée.
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));
Le résultat
Et enfin, nous remplissons le texte en attribuant des largeurs aux glyphes. Le nombre de largeurs doit être égal au nombre de glyphes.
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()));
Le résultat
Fermez la page actuelle, enregistrez le document.
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 }
Voir travailler avec un texte dans les documents PS dans Java.
Dans l’exemple ci-dessus, des polices sont utilisées intégrées dans le fichier PostScript en tant que polices TrueType, car il s’agit du comportement par défaut d’enregistrement des polices dans la classe PsDocument. Si vous devez modifier ce comportement, veuillez utiliser PsSaveOptions comme suit :
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);
Vous pouvez télécharger des exemples et des fichiers de données à partir de GitHub.