PostScript でのテキスト操作 | C++
PSドキュメントにテキストを追加する
この記事では、PSドキュメントにテキストを追加する方法について説明します。
当然のことながら、テキストは何らかのフォントを使用してドキュメントに記述する必要があります。フォントはシステムフォルダーに保存することができ、この場合はシステムフォントと呼びます。また、カスタムフォルダーに保存することもできます。カスタムフォルダーとは、特定の用途のためにフォントを配置するフォルダーです。通常、これらのフォントはシステムフォルダーには存在しません。このようなフォントをカスタムフォントと呼びます。 Aspose.Page for C++ライブラリは、システムフォントとカスタムフォントの両方を使用するためのメソッドを提供します。
システムフォントを使用する場合は、ネイティブC++のSystem.Drawing.Fontを使用してテキストを塗りつぶしたりアウトライン表示したりするだけです。メソッド呼び出し内の数値は、テキストの左上隅のx座標とy座標です。
1document->FillText(str, System::MakeObject<System::Drawing::Font>(u"Times New Roman", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold), 50.0f, 100.0f);
カスタムフォントを使用するには、まずPsSaveOptionsにカスタムフォントフォルダーを追加し、 Aspose.Page.Font.DrFontを取得します。最後に、この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);
もう一つの選択肢は、フォントにも属するテキストを扱うことです。PostScript文書内のテキストを印刷するために使用されるフォントは、このファイルに埋め込むことも、埋め込まないこともできます。
前者の場合、テキストは常にテキストと共に存在するため、どのPostScriptビューアやエディタでも常に表示されます。後者の場合、使用されているフォントがターゲットホストのシステムフォルダに存在することを想定する必要があります。使用されているフォントが存在しない場合、PostScriptインタープリタはエラーをスローする可能性があります。
3つ目の選択肢もフォントに関するもので、テキストを追加する上でフォントが中心となるためです。テキストの塗りつぶしや描画(またはクリッピング)に使用されるフォントは、様々な形式でPSファイルに埋め込むことができます。現在、埋め込みにはTrueTypeとType3フォントがサポートされています。
4つ目の選択肢は、テキストのグリフを指定されたアドバンス(幅)で書き込む機能です。これにより、テキストに芸術的な表現を加えることができます。
以下の例では、Aspose.Page for C++ ライブラリを使用して PS ドキュメントにテキストを追加する様々な方法の使用方法を示します。
新しい PS ドキュメントにテキストを追加するアルゴリズムは、以下の手順で構成されます。
- 生成される PS ファイルの出力ストリームを作成します。
- PsSaveOptions を作成します。カスタムフォントを使用する場合は、保存オプションにカスタムフォントフォルダーを追加します。
- 既に作成済みの出力ストリームと保存オプションを使用して PsDocument を作成します。
- 必要なフォント(システム または カスタム)を作成します。
- 作成したフォントでテキストを塗りつぶすか、アウトライン化します。ここでは、テキストを塗りつぶすか描画するかに応じて、System.Drawing.Brush または System.Drawing.Pen を割り当てることができます。あるいは、1つのメソッドでテキストの塗りつぶしとアウトライン化を行うこともできます。System.Drawing.Brush または System.Drawing.Pen を指定せずにメソッドを使用した場合、現在のグラフィックス状態において、現在のペイント/ストロークでテキストが塗りつぶされるかアウトライン化されます。
- ページを閉じます。
- ドキュメントを保存します。
サンプルコードを小さなコードスニペットに分割することで、PSドキュメントの初期準備、テキスト追加のための各メソッドの使用、そしてドキュメントの完成を分離しています。
このコードでは、出力ストリームとPsSaveOptionsを作成し、コード内でカスタムフォントを使用するためのカスタムフォントフォルダを追加し、PsDocumentオブジェクトを作成し、すべてのメソッドに共通するテキストを文字列変数として設定し、使用されるすべてのメソッドで使用されるfontSize変数を作成します。
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);
ここでは、グラフィックス状態の現在の色 (黒) と新しい 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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
結果
ここで、カスタム フォント を使用してテキストを入力します。
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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
結果
ここでは、現在のグラフィック状態のストローク (黒) と新しい ペン を使用してテキストのアウトラインを作成するための システム フォント の使用方法を示します。
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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
結果
ここで、カスタム フォント を使用してテキストのアウトラインを作成します。
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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
結果
ここでは、新しい SolidBrush と 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));
結果
Now we fill and an outline the text with the custom font.
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));
結果
最後に、グリフの幅を指定してテキストを埋めていきます。幅の数はグリフの数と同じでなければなりません。
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()));
結果
現在のページを閉じて、ドキュメントを保存します。
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 }
Java の PS ドキュメント内のテキストの操作を参照してください。
上記の例では、PostScriptファイルに埋め込まれたフォントがTrueTypeフォントとして使用されています。これは、PsDocumentクラスでフォントを保存する際のデフォルトの動作です。この動作を変更する必要がある場合は、 PsSaveOptionsを以下のように使用してください。
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);
サンプルとデータ ファイルは GitHub からダウンロードできます。