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

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

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

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

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

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

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

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

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

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

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

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

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

  • Файл на диске с использованием метода перегрузки Save
  • Поток с использованием перегрузки метода Save
  • Графический объект с использованием методов RenderToSize и RenderToScale

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = shape.getShapeRenderer();
// Define custom options which control how the image is rendered. Render the
// shape to the JPEG raster format.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.EMF);
imageOptions.setScale(1.5f);
// Save the rendered image to disk.
r.save(dataDir + "TestFile.RenderToDisk_Out.emf", imageOptions);

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = new ShapeRenderer(shape);
// Define custom options which control how the image is rendered. Render the
// shape to the vector format EMF.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.JPEG);
// Output the image in gray scale
imageOptions.setImageColorMode(ImageColorMode.GRAYSCALE);
// Reduce the brightness a bit (default is 0.5f).
imageOptions.setImageBrightness(0.45f);
FileOutputStream stream = new FileOutputStream(dataDir + "TestFile.RenderToStream_Out.jpg");
// Save the rendered image to the stream using different options.
r.save(stream, imageOptions);

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

Рендеринг в объект Graphics

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
// The shape renderer is retrieved using this method. This is made into a
// separate object from the shape as it internally
// caches the rendered shape.
ShapeRenderer r = shape.getShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and
// resolution.
Dimension shapeSizeInPixels = r.getSizeInPixels(1.0f, 96.0f);
// Rotating the shape may result in clipping as the image canvas is too small.
// Find the longest side
// and make sure that the graphics canvas is large enough to compensate for
// this.
int maxSide = Math.max(shapeSizeInPixels.width, shapeSizeInPixels.height);
BufferedImage image = new BufferedImage((int) (maxSide * 1.25), (int) (maxSide * 1.25),
BufferedImage.TYPE_INT_ARGB);
// Rendering to a graphics object means we can specify settings and
// transformations to be applied to
// the shape that is rendered. In our case we will rotate the rendered shape.
Graphics2D gr = (Graphics2D) image.getGraphics();
// Clear the shape with the background color of the document.
gr.setBackground(shape.getDocument().getPageColor());
gr.clearRect(0, 0, image.getWidth(), image.getHeight());
// Center the rotation using translation method below
gr.translate(image.getWidth() / 8, image.getHeight() / 2);
// Rotate the image by 45 degrees.
gr.rotate(45 * Math.PI / 180);
// Undo the translation.
gr.translate(-image.getWidth() / 8, -image.getHeight() / 2);
// Render the shape onto the graphics object.
r.renderToSize(gr, 0, 0, shapeSizeInPixels.width, shapeSizeInPixels.height);
ImageIO.write(image, "png", new File(dataDir + "TestFile.RenderToGraphics_out.png"));
gr.dispose();

Аналогично методу 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 отдельно от документа и сохранить его на диске:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
dataDir = dataDir + "TestFile.RenderShape_out.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape.getShapeRenderer().save(dataDir, null);

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
Point2D.Float shapeSizeInDocument = shape.getShapeRenderer().getSizeInPoints();
float width = shapeSizeInDocument.x; // The width of the shape.
float height = shapeSizeInDocument.y; // The height of the shape.
Dimension shapeRenderedSize = shape.getShapeRenderer().getSizeInPixels(1.0f, 96.0f);
BufferedImage image = new BufferedImage(shapeRenderedSize.width, shapeRenderedSize.height,
BufferedImage.TYPE_INT_RGB);
Graphics gr = image.getGraphics();
// Render shape onto the graphics object using the RenderToScale or RenderToSize
// methods of ShapeRenderer class.
gr.dispose();

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

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