Работа с текстом в 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 включает следующие шаги:

  1. Создайте выходной поток для полученного PS-файла.
  2. Создайте PsSaveOptions. Если мы используем собственный шрифт, мы добавляем папку(и) с пользовательскими шрифтами в параметры сохранения.
  3. Создайте PsDocument с уже созданным потоком вывода и сохраните параметры.
  4. Создайте необходимый шрифт: системный или пользовательский.
  5. Заполните или обведите текст созданным шрифтом. Здесь мы можем назначить System.Drawing.Brush или System.Drawing.Pen в зависимости от того, заполняем или рисуем текст. Или мы можем заполнить и обвести текст одним методом. Если мы используем метод без System.Drawing.Brush или System.Drawing.Pen, текст будет заполнен или обведен текущей краской/обводкой в ​​текущем графическом состоянии.
  6. Закройте страницу.
  7. Сохраните документ.

Мы разбили пример кода на небольшие фрагменты кода, чтобы разделить первоначальную подготовку документа 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

Добавить текстовое изображение2

Теперь мы заполняем текст собственным шрифтом.

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

Результат

Добавить текстовое изображение3

Добавить текстовое изображение4

Здесь мы демонстрируем использование системного шрифта для обводки текста с текущим штрихом графического состояния (то есть черным) и с новым Перо.

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

Результат

Добавить текстовое изображение5

Добавить текстовое изображение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            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Результат

Добавить текстовое изображение8

Добавить текстовое изображение9

Здесь мы демонстрируем использование системного шрифта для заполнения и обводки текста с помощью новых 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));

Результат

Добавить текстовое изображение7

Теперь мы заполняем и обводим текст собственным шрифтом.

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

Результат

Добавить текстовое изображение10

И, наконец, заполняем текст, задавая ширину глифов. Количество ширин должно быть равно количеству глифов.

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

Результат

Добавить текстовое изображение11

Закройте текущую страницу, сохраните документ.

 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.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.