Робота з текстом у PostScript | C++
Додати текст у документ PS
У цій статті ми розглянемо способи додавання тексту в документ PS.
Очевидно, що текст має бути написаний у документі певним шрифтом. Шрифти можуть зберігатися в системних папках, і в цьому випадку ми називаємо їх системними шрифтами і можуть зберігатися в спеціальних папках, які є папками, в які хтось розміщує шрифти для певного використання. Зазвичай ці шрифти відсутні в системних папках. Ми називаємо такі шрифти спеціальними шрифтами.
Бібліотека Aspose.Page для C++ пропонує методи використання як системних, так і спеціальних шрифтів.
Для використання системних шрифтів ми просто заповнюємо або обводимо текст System.Drawing.Font C++. Числа у виклику методу є координатами 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 може видати помилку.
Третій варіант також стосується шрифту, оскільки шрифт є основним у додаванні тексту. Шрифт, який використовується для заповнення або малювання (або вирізання) тексту, може бути вбудований у файл PS у різних формах. Тепер підтримуються типи шрифтів TrueType і Type3 у вбудовуванні.
Четверта опція - це можливість писати гліфи тексту з призначеними випередженнями (шириною). Це дозволяє додати тексту артистизм.
У наведеному нижче прикладі ми демонструємо використання різних методів додавання тексту в документ PS за допомогою бібліотеки Aspose.Page для C++.
Алгоритм додавання тексту в новий документ PS включає наступні кроки:
- Створіть вихідний потік для отриманого файлу PS.
- Створіть PsSaveOptions. Якщо ми використовуємо спеціальний шрифт, ми додаємо папку(и) спеціальних шрифтів у параметрах збереження.
- Створіть PsDocument із уже створеним вихідним потоком і параметрами збереження.
- Створіть необхідний шрифт, системний або спеціальний.
- Заповніть або обведіть текст створеним шрифтом. Тут ми можемо призначити System.Drawing.Brush або System.Drawing.Pen залежно від того, заповнюємо чи малюємо текст. Або ми можемо заповнити та обвести текст одним способом. Якщо ми використовуємо метод без 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));
Результат
Тепер ми заповнюємо та обводимо текст спеціальним шрифтом.
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 }
Див. роботу з текстом у документах PS у Java.
У наведеному вище прикладі використані шрифти, вбудовані у файл 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.