Визуализация фигур отдельно от документа

При обработке документов обычной задачей является извлечение всех изображений, найденных в документе, и экспорт их во внешнее хранилище. Эта задача упрощается благодаря Aspose.Words API, который уже предоставляет функциональные возможности для извлечения и сохранения данных изображений. Однако иногда может потребоваться аналогичным образом извлечь графический контент других типов, представленный другим типом графического объекта, например, текстовое поле, содержащее абзацы, фигуры со стрелками и небольшое изображение. Простого способа визуализации этого объекта не существует, поскольку он представляет собой комбинацию отдельных элементов контента. Вы также можете столкнуться со случаем, когда содержимое было сгруппировано в объект, который выглядит как единое изображение.

Aspose.Words предоставляет функциональные возможности для извлечения этого типа содержимого таким же образом, как вы можете извлечь простое изображение из shape в качестве визуализируемого содержимого. В этой статье описывается, как использовать эту функциональность для визуализации фигур независимо от документа.

Типы фигур в Aspose.Words

Все содержимое слоя рисования документа представлено узлом Shape или GroupShape в модуле объектов документа (DOM) Aspose.Words. Таким содержимым могут быть текстовые поля, изображения, AutoShapes OLE-объекты и т.д. Некоторые поля также импортируются в виде фигур, например, поле INCLUDEPICTURE.

Простое изображение представлено узлом Shape из ShapeType.Image. Этот узел формы не имеет дочерних узлов, но к данным изображения, содержащимся в этом узле формы, можно получить доступ с помощью свойства Shape.ImageData. С другой стороны, фигура также может состоять из множества дочерних узлов. Например, форма текстового поля, которая представлена свойством ShapeType.TextBox, может состоять из множества узлов, таких как Paragraph и Table. Большинство форм могут включать узлы Paragraph и Table на уровне блоков. Это те же узлы, что и в основной части документа. Фигуры всегда являются частями какого-либо абзаца, либо включенными непосредственно в текст, либо привязанными к Paragraph,, но “плавающими” в любом месте страницы документа.

rendering-shapes-separately-from-a-document-aspose-words-cpp-1

Документ также может содержать фигуры, которые сгруппированы вместе. Группировку можно включить в Microsoft Word, выбрав несколько объектов и нажав “Сгруппировать” в контекстном меню.

rendering-shapes-separately-from-a-document-aspose-words-cpp-2

В Aspose.Words эти группы фигур представлены узлом GroupShape. Они также могут быть вызваны таким же образом, чтобы отобразить всю группу на изображении.

rendering-shapes-separately-from-a-document-aspose-words-cpp-3

Формат DOCX может содержать специальные типы изображений, такие как диаграммы. Эти фигуры также представлены с помощью узла Shape в Aspose.Words, который также предоставляет аналогичный метод для их отображения в виде изображений. По замыслу, фигура не может содержать другую фигуру в качестве дочерней, если только эта фигура не является изображением (ShapeType.Image). Например, Microsoft Word не позволяет вставлять текстовое поле внутрь другого текстового поля.

Типы фигур, описанные выше, предоставляют специальный метод для визуализации фигур с помощью класса ShapeRenderer. Экземпляр класса ShapeRenderer извлекается для Shape или GroupShape с помощью метода GetShapeRenderer или путем передачи Shape конструктору класса ShapeRenderer. Этот класс предоставляет доступ к элементам, которые позволяют отображать форму следующим образом:

  • Файл на диске с использованием метода перегрузки Save
  • Поток с использованием перегрузки метода Save
  • Объект Graphics с помощью методов RenderToSize и RenderToScale

Рендеринг в файл или поток

Метод Save предоставляет перегрузки, которые отображают фигуру непосредственно в файл или поток. Обе перегрузки поддерживают экземпляр класса ImageSaveOptions, который позволяет определять параметры для отображения фигуры. Это работает так же, как и метод Document.Save. Несмотря на то, что этот параметр является обязательным, вы можете передать нулевое значение, указав, что пользовательских параметров нет.

Фигура может быть экспортирована в любом графическом формате, указанном в перечислении SaveFormat. Например, изображение можно отобразить как растровое, например, в формате JPEG, указав значение SaveFormat.Jpeg, или как векторное, например, в формате EMF, указав значение SaveFormat.Emf.

Приведенный ниже пример кода иллюстрирует рендеринг фигуры в EMF-изображении отдельно от документа и сохранение на диск:

Приведенный ниже пример кода иллюстрирует рендеринг фигуры в формате JPEG отдельно от документа и сохранение в потоке:

Класс ImageSaveOptions позволяет задать множество параметров, управляющих отображением изображения. Функциональность, описанная выше, может быть применена таким же образом к узлам GroupShape и Shape.

Рендеринг в графический объект .NET

Визуализация непосредственно в объект Graphics позволяет вам определить свои собственные настройки и состояние объекта Graphics. Обычный сценарий предполагает визуализацию фигуры непосредственно в объект Graphics, полученный из Windows Form или растрового изображения. При отображении узла Shape параметры будут влиять на внешний вид фигуры. Например, вы можете поворачивать или масштабировать фигуру, используя методы RotateTransform или ScaleTransform для объекта Graphics.

В приведенном ниже примере показано, как отрисовать фигуру для объекта .NET Graphics отдельно от документа и применить поворот к отрисованному изображению:

Аналогично методу RenderToSize, метод RenderToSize , унаследованный от метода NodeRendererBase, полезен для создания эскизов содержимого документа. Размер фигуры задается с помощью конструктора. Метод RenderToSize принимает объект Graphics, координаты X и Y положения изображения и размер изображения (ширина и высота), которые будут отображены на объекте Graphics.

Изображение Shape может быть отрисовано в определенном масштабе с помощью метода ShapeRenderer.RenderToScale, унаследованного от класса NodeRendererBase. Это аналогично методу Document.RenderToScale, который принимает те же основные параметры. Разница между этими двумя методами заключается в том, что при использовании метода ShapeRenderer.RenderToScale вместо буквального размера вы выбираете значение с плавающей точкой, которое масштабирует фигуру во время ее рендеринга. Если значение с плавающей точкой равно 1.0 приводит к отображению фигуры в 100% своего первоначального размера. Значение с плавающей запятой, равное 0.5, уменьшит размер изображения вдвое.

Рендеринг изображения фигуры

Класс Shape представляет объекты на уровне рисования, такие как AutoShape, текстовое поле, произвольная форма, OLE-объект, элемент управления ActiveX или изображение. Используя класс Shape, вы можете создавать или изменять фигуры в документе Microsoft Word. Важным свойством фигуры является ее значение ShapeType. Фигуры разных типов могут иметь разные возможности в документе Word. Например, только изображения и OLE-фигуры могут содержать изображения внутри себя, в то время как большинство фигур могут содержать только текст.

В следующем примере показано, как преобразовать изображение фигуры в формат JPEG отдельно от документа и сохранить его на диск:

Получение размера фигуры

Класс ShapeRenderer также предоставляет функциональные возможности для получения размера фигуры в пикселях с помощью метода GetSizeInPixels. Этот метод принимает два параметра типа float (одиночных) – масштаб и DPI, которые используются при расчете размера фигуры при ее визуализации. Метод возвращает объект Size, который содержит ширину и высоту вычисленного размера. Это полезно, когда требуется заранее знать размер визуализируемой фигуры, например, при создании нового растрового изображения на основе результатов визуализации.

В приведенном ниже примере показано, как создать новое растровое изображение и графический объект с шириной и высотой фигуры, которая будет отображаться:

При использовании методов RenderToSize или RenderToScale размер отображаемого изображения также возвращается в объект SizeF. Это значение можно присвоить переменной и использовать при необходимости.

Свойство SizeInPoints возвращает размер фигуры, измеренный в точках (см. ShapeRenderer. Результатом является объект SizeF, содержащий ширину и высоту.