Lavorare con il testo in PostScript | C++

Aggiungere testo in un documento PS

In questo articolo, consideriamo i modi in cui è possibile aggiungere testo a un documento PS.

Ovviamente, il testo deve essere scritto in un documento con un font specifico. I font possono essere memorizzati in cartelle di sistema e, in questo caso, li chiamiamo font di sistema e possono essere memorizzati in cartelle personalizzate, ovvero cartelle in cui vengono salvati font per un utilizzo specifico. Di solito, questi font non sono presenti nelle cartelle di sistema. Chiamiamo tali font font personalizzati. La libreria Aspose.Page per C++ offre metodi per utilizzare sia font di sistema che personalizzati.

Per utilizzare i font di sistema, basta riempire o delineare un testo con il metodo nativo System.Drawing.Font di C++. I numeri nella chiamata del metodo rappresentano le coordinate x e y dell’angolo in alto a sinistra del testo.

1document->FillText(str, System::MakeObject<System::Drawing::Font>(u"Times New Roman", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold), 50.0f, 100.0f);

Per utilizzare font personalizzati, aggiungi prima la cartella custom fonts in PsSaveOptions, quindi recupera Aspose.Page.Font.DrFont. Infine, riempi o delinea il testo con questo oggetto 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);

Un’altra opzione è lavorare con testo che appartiene anche a un font. Il font utilizzato per stampare il testo nel documento PostScript può essere incorporato in questo file o meno. Nel primo caso, il testo verrà sempre visualizzato in qualsiasi visualizzatore o editor PostScript perché si trova sempre insieme al testo. Nel secondo caso, dovremmo aspettarci che il font utilizzato esista nelle cartelle di sistema sull’host di destinazione. Se il font utilizzato non esiste, l’interprete PostScript potrebbe generare un errore.

Anche la terza opzione riguarda un font, perché un font è l’elemento principale per l’aggiunta di testo. Un font utilizzato per riempire o disegnare (o ritagliare) un testo può essere incorporato in un file PS in vari formati. Ora sono supportati i tipi di font TrueType e Type3 per l’incorporamento.

La quarta opzione è la possibilità di scrivere i glifi del testo con avanzamenti (larghezze) assegnati. Ciò consente di aggiungere un tocco artistico al testo.

Nell’esempio seguente mostriamo l’utilizzo di vari metodi per aggiungere testo in un documento PS con la libreria Aspose.Page per C++.

Un algoritmo per aggiungere testo in un nuovo documento PS include i seguenti passaggi:

  1. Creare un flusso di output per il file PS risultante.
  2. Creare PsSaveOptions. Se utilizziamo un font personalizzato, aggiungiamo le relative cartelle nelle opzioni di salvataggio.
  3. Creare PsDocument con il flusso di output e le opzioni di salvataggio già creati.
  4. Creare il font necessario, system o custom.
  5. Riempire o delineare il testo con il font creato. Qui possiamo assegnare System.Drawing.Brush o System.Drawing.Pen a seconda che si desideri riempire o disegnare il testo. Oppure possiamo riempire e delineare il testo con un unico metodo. Se utilizziamo il metodo senza System.Drawing.Brush o System.Drawing.Pen, il testo verrà riempito o contornato con il colore/tratto corrente nello stato grafico corrente.
  6. Chiudiamo la pagina.
  7. Salviamo il documento.

Abbiamo suddiviso il codice di esempio in piccoli frammenti di codice per separare la preparazione iniziale del documento PS, l’utilizzo di ciascun metodo per l’aggiunta di testo e il completamento del documento.

In questo frammento di codice, creiamo un flusso di output e PsSaveOptions, aggiungiamo una cartella font personalizzata per utilizzare il font personalizzato nel codice, creiamo un oggetto PsDocument, impostiamo il testo comune per tutti i metodi come variabile stringa e creiamo la variabile fontSize che viene utilizzata in ogni metodo utilizzato.

 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);

Qui mostriamo l’utilizzo del font di sistema per riempire il testo con il colore corrente dello stato grafico (ovvero nero) e con il nuovo 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            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Il risultato

Aggiungi testo immagine1

Aggiungi testo immagine2

Ora riempiamo il testo con il font personalizzato.

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            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Il risultato

Aggiungi testo immagine3

Aggiungi testo immagine4

Qui mostriamo l’utilizzo del font di sistema per delineare il testo con il tratto corrente dello stato grafico (ovvero nero) e con la nuova Penna.

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            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Il risultato

Aggiungi testo immagine5

Aggiungi testo immagine6

Ora tracciamo il contorno del testo con il font personalizzato.

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            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Il risultato

Aggiungi testo immagine8

Aggiungi testo immagine9

Qui mostriamo l’utilizzo del font di sistema per riempire e delineare il testo con i nuovi 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));

Il risultato

Aggiungi testo immagine7

Ora riempiamo e tracciamo il contorno del testo con il font personalizzato.

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));

Il risultato

Aggiungi testo immagine10

E infine riempiamo il testo assegnando le larghezze dei glifi. Il numero di larghezze deve essere uguale al numero di glifi.

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()));

Risultato

Aggiungi testo immagine11

Chiudi la pagina corrente e salva il 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    }

Vedere Lavorare con un testo nei documenti PS in Java.


Nell’esempio precedente, i font utilizzati sono incorporati nel file PostScript come font TrueType, poiché questo è il comportamento predefinito di salvataggio dei font nella classe PsDocument. Per modificare questo comportamento, utilizzare PsSaveOptions come segue:

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);

È possibile scaricare esempi e file di dati da GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.