Working with Text in PostScript | .NET

Contents
[ Hide Show ]

Add Text in PS Document

In this article, we consider the ways how a text can be added to a PS document.
Obviously, the text should be written in a document with some font. Fonts can be stored in system folders, and in this case, we call them system fonts and can be stored in custom folders, which are folders in which someone puts fonts for particular usage. Usually, these fonts are absent in system folders. We call such fonts custom fonts. Aspose.Page for .NET library offers methods for using both system and custom fonts.

For using system fonts we just fill or outline a text with native .NET’s System.Drawing.Font. Numbers in the method’s call are the x and y coordinates of the top-left corner of the text.

1document.FillText(str, new System.Drawing.Font("Times New Roman", fontSize, FontStyle.Bold), 50, 100);

For using custom fonts, first add custom fonts folder in PsSaveOptions, then fetch Aspose.Page.Font.DrFont. And finally fill or outline text with this DrFont object.

1options.AdditionalFontsFolders = new string[] { FONTS_FOLDER };
2Aspose.Page.Font.DrFont drFont = ExternalFontCache.FetchDrFont("Palatino Linotype", fontSize, FontStyle.Regular);
3document.FillText(str, drFont, 50, 100);

Another option is working with text that also belongs to a font. The font is used to print text in the PostScript document can be embedded in this file or not embedded. In the first case, the text will always be rendered in any PostScript viewer or editor because it always lies with the text. In the second case, we should expect that the used font exists in system folders on the target host. If the used font doesn’t exist PostScript interpreter can throw an error.
The third option is also about a font because a font is the main thing in adding text. A font used for filling or drawing (or clipping) a text can be embedded in a PS file in various forms. Now TrueType and Type3 font types in embedding are supported.
The fourth option is the possibility to write the glyphs of the text with assigned advances (widths). It allows adding some artistry to the text.

In the example below we demonstrate the usage of various methods of adding text in a PS document with Aspose.Page for .NET library.

An algorithm for adding a text in new PS document includes the following steps:

  1. Create an output stream for the resulting PS file.
  2. Create PsSaveOptions. If we use a custom font we add custom fonts folder(s) in the save options.
  3. Create PsDocument with the already created output stream and save options.
  4. Create the necessary font, system, or custom.
  5. Fill or outline the text with the created font. Here we can assign System.Drawing.Brush or System.Drawing.Pen depending on whether we fill or draw the text. Or we can fill and outline the text in one method. If we use the method without System.Drawing.Brush or System.Drawing.Pen, the text will be filled or outlined with current paint/stroke in the current graphics state.
  6. Close the page.
  7. Save the document.

We split the example code into little code snippets in order to separate the initial preparation for the PS document, the usage of every method for adding text, and the completion of the document.

In this piece of code, we create an output stream and PsSaveOptions, add a custom fonts folder for using the custom font in the code, create a PsDocument object, set common for all methods text as a string variable, and create fontSize variable that is also used in every used method.

 1//Create an output stream for the PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "AddText_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with the A4 size
 5    PsSaveOptions options = new PsSaveOptions();
 6    // Set the custom fonts folder. It will be added to system fonts folders for finding the needed font.
 7    options.AdditionalFontsFolders = new string[] { FONTS_FOLDER };
 8    //A text to write to the PS file
 9    string str = "ABCDEFGHIJKLMNO";
10    int fontSize = 48;
11
12    // Create a new 1-paged PS Document
13    PsDocument document = new PsDocument(outPsStream, options, false);

Here we demonstrate the usage of the system font for filling the text with the current color of the graphics state (that is black) and with the new SolidBrush.

1////////////////////////////////////// Using the sysem font (located in system fonts folders) for filling the text //////////////////
2    Font font = new Font("Times New Roman", fontSize, FontStyle.Bold);
3    //Fill the text with the default or already defined color. In given case it is black.
4    document.FillText(str, font, 50, 100);
5    //Fill the text with Blue color.
6    document.FillText(str, font, 50, 150, new SolidBrush(Color.Blue));
7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

For Linux, MacOS, and other non-Windows operation systems we offer to use our Aspose.Page.Drawing Nuget package. It uses Aspose.Drawing backend instead of System.Drawing system library.

So import Aspose.Page.Drawing namespace instead of System.Drawing one. In the above and the following code snippets Aspose.Page.Drawing.Font will be used instead of System.Drawing.Font, Aspose.Page.Drawing.SolidBrush will be used instead of System.Drawing.SolidBrush and so on. Our code examples on GitHub contain all the necessary substitutions.

The result

Add Text image1

Add Text image2

Now we fill the text with the custom font.

1////////////////////////////////////// Using the custom font (located in custom fonts folders) for filling the text /////////////////
2	  DrFont drFont = ExternalFontCache.FetchDrFont("Palatino Linotype", fontSize, FontStyle.Regular);
3	  //Fill the text with default or already defined color. In the given case it is black.
4	  document.FillText(str, drFont, 50, 200);
5	  //Fill the text with the Blue color.
6	  document.FillText(str, drFont, 50, 250, new SolidBrush(Color.Blue));
7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

The result

Add Text image3

Add Text image4

Here we demonstrate the usage of the system font for outlining the text with the current stroke of graphics state (that is black) and with the new Pen.

1////////////////////////////////////// Using the sysem font (located in system fonts folders) for outlining the text ////////////////
2	  //Outline the text with default or already defined pen. In the given case it is a black colored 1-points width pen.
3	  document.OutlineText(str, font, 50, 300);
4	  //Outline the text with the blue-violet colored 2-points width pen.
5	  document.OutlineText(str, font, 50, 350, new Pen(new SolidBrush(Color.BlueViolet), 2));
6/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

The result

Add Text image5

Add Text image6

Now we outline the text with the custom font.

1////////////////////////////////////// Using the custom font (located in custom fonts folders) for outlining the text /////////////////
2		//Outline the text with the default or already defined pen. In given case it is a black colored 1-points width pen.
3		document.OutlineText(str, drFont, 50, 450);
4		//Outline the text with the blue-violet colored 2-points width pen.
5		document.OutlineText(str, drFont, 50, 500, new Pen(new SolidBrush(Color.BlueViolet), 2));		
6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

The result

Add Text image8

Add Text image9

Here we demonstrate the usage of system font for filling and outlining the text with new SolidBrush and Pen.

1    //Fill the text with the orange color and stroke with the blue colored 2-points width pen.
2    document.FillAndStrokeText(str, font, 50, 400, new SolidBrush(Color.Yellow), new Pen(new SolidBrush(Color.BlueViolet), 2));

The result

Add Text image7

Now we fill and an outline the text with the custom font.

1		//Fill the text with the orange color and stroke with the blue colored 2-points width pen.
2		document.FillAndStrokeText(str, drFont, 50, 550, new SolidBrush(Color.Orange), new Pen(new SolidBrush(Color.Blue), 2));

The result

Add Text image10

And finally we fill the text with assigning glyphs widths. The number of widths must be equal to the number of glyphs.

1	//Glyphs widths
2    float[] widths = new float[] { 87, 87, 87, 87, 34, 87, 87 };    
3    //Fill ASCII text using with assigning glyphs widths.
4    document.FillText("BAMBOOK", widths, drFont, 50, 600, new SolidBrush(Color.Blue));
5    
6    //Glyphs widths
7    widths = new float[] { 87, 34, 87, 87, 87, 87, 87 };
8    //Fill Unicode text using with assigning glyphs widths.
9    document.FillText("ЗООПАРК", widths, drFont, 50, 650, new SolidBrush(Color.Orange));

The result

Add Text image11

Close the current page, save the document.

1    //Close the current page
2    document.ClosePage();
3    
4    //Save the document
5    document.Save();

See working with a text in PS documents in Java.


In the example above, there are used fonts embedded in the PostScript file as TrueType fonts, because it is the default behavior of saving fonts in PsDocument class. If you need to change this behavior, please, use PsSaveOptions like the following:

1		//Do not embed used fonts.
2		options.EmbedFonts = false;
1		//Embed used fonts as Type3 fonts.
2		options.EmbedFontsAs = FontConstants.EMBED_FONTS_TYPE3;

You can download examples and data files from GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.