Работа с текстом в PostScript | С++
Добавить текст в документ PS
В этой статье мы рассмотрим способы добавления текста в документ PS.
Очевидно, что текст должен быть написан в документе каким-либо шрифтом. Шрифты могут храниться в системных папках, и в этом случае мы называем их системными шрифтами и могут храниться в пользовательских папках, которые представляют собой папки, в которые кто-то помещает шрифты для определенного использования. Обычно эти шрифты отсутствуют в системных папках. Мы называем такие шрифты пользовательскими шрифтами. Библиотека Aspose.Page для 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);
Чтобы использовать пользовательские шрифты, сначала добавьте папку custom Fonts в 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.