Renderizar Formas por Separado de un Documento

Al procesar documentos, una tarea común es extraer todas las imágenes que se encuentran en el documento y exportarlas a una ubicación externa. Esta tarea se simplifica con Aspose.Words API, que ya proporciona la funcionalidad para extraer y guardar datos de imagen. Sin embargo, a veces es posible que desee extraer de manera similar otros tipos de contenido gráfico que están representados por un tipo diferente de objeto de dibujo, por ejemplo, un cuadro de texto que contiene párrafos, formas de flechas y una imagen pequeña. No hay una forma sencilla de representar este objeto, ya que es una combinación de elementos de contenido individuales. También puede encontrarse con un caso en el que el contenido se haya agrupado en el objeto que parece una sola imagen.

Aspose.Words proporciona funcionalidad para extraer este tipo de contenido de la misma manera que puede extraer una imagen simple de la forma como contenido renderizado. En este artículo se describe cómo utilizar esta funcionalidad para representar formas independientemente del documento.

Tipos de formas en Aspose.Words

Todo el contenido de una capa de dibujo de documento está representado por el nodo Shape o GroupShape en el Módulo de objetos de documento Aspose.Words (DOM). Dichos contenidos pueden ser cuadros de texto, imágenes, AutoShapes, OLE objetos, etc. Algunos campos también se importan como formas, por ejemplo, el campo INCLUDEPICTURE.

Una imagen simple está representada por un nodo Shape de ShapeType.Image. Este nodo de forma no tiene nodos secundarios, pero la propiedad Shape.ImageData puede acceder a los datos de imagen contenidos en este nodo de forma. Por otro lado, una forma también puede estar formada por muchos nodos secundarios. Por ejemplo, la forma de un cuadro de texto, que está representada por la propiedad ShapeType.TextBox, puede estar formada por muchos nodos, como Paragraph y Table. La mayoría de las formas pueden incluir los nodos Paragraph y Table a nivel de bloque. Estos son los mismos nodos que aparecen en el cuerpo principal. Las formas siempre son partes de algún párrafo, ya sea incluidas directamente en línea o ancladas al Paragraph, pero “flotando” en cualquier parte de la página del documento.

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

Un documento también puede contener formas agrupadas. La agrupación se puede habilitar en Microsoft Word seleccionando varios objetos y haciendo clic en “Agrupar” en el menú contextual.

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

En Aspose.Words, estos grupos de formas están representados por el nodo GroupShape. Estos también se pueden invocar de la misma manera para representar todo el grupo en la imagen.

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

El formato DOCX puede contener tipos especiales de imágenes, como diagramas o gráficos. Estas formas también se representan a través del nodo Shape en Aspose.Words, que también proporciona un método similar para representarlas como imágenes. Por diseño, una forma no puede contener otra forma secundaria, a menos que esa forma sea una imagen (ShapeType.Image). Por ejemplo, Microsoft Word no le permite insertar un cuadro de texto dentro de otro cuadro de texto.

Los tipos de formas descritos anteriormente proporcionan un método especial para representar las formas a través de la clase ShapeRenderer. Una instancia de la clase ShapeRenderer se recupera para un Shape o GroupShape a través del método GetShapeRenderer o pasando el Shape al constructor de la clase ShapeRenderer. Esta clase proporciona acceso a los miembros, que permiten representar una forma de la siguiente manera:

  • Archivo en el disco usando la sobrecarga del método Save
  • Transmitir usando la sobrecarga del método Save
  • Objeto de gráficos mediante los métodos RenderToSize y RenderToScale

Renderizado a Archivo o Transmisión

El método Save proporciona sobrecargas que representan una forma directamente en un archivo o secuencia. Ambas sobrecargas aceptan una instancia de la clase ImageSaveOptions, que permite definir opciones para representar la forma. Esto funciona de la misma manera que el método Document.Save. Aunque este parámetro es obligatorio, puede pasar un valor nulo, especificando que no hay opciones personalizadas.

La forma se puede exportar en cualquier formato de imagen especificado en la enumeración SaveFormat. Por ejemplo, la imagen se puede representar como una imagen ráster, como JPEG especificando la enumeración SaveFormat.Jpeg, o como una imagen vectorial, como EMF especificando SaveFormat.Emf.

El siguiente ejemplo de código ilustra cómo representar una forma en una imagen EMF por separado del documento y guardarla en el disco:

El siguiente ejemplo de código ilustra cómo representar una forma en una imagen JPEG por separado del documento y guardarla en una secuencia:

La clase ImageSaveOptions le permite especificar una variedad de opciones que controlan cómo se procesa la imagen. La funcionalidad descrita anteriormente se puede aplicar de la misma manera a los nodos GroupShape y Shape.

Renderizado a un objeto Graphics

Renderizar directamente en un objeto Graphics le permite definir su propia configuración y el estado del objeto Graphics. Un escenario común implica representar una forma directamente en un objeto Graphics recuperado de un Formulario Windows o un mapa de bits. Cuando se representa el nodo Shape, la configuración afectará la apariencia de la forma. Por ejemplo, puede rotar o escalar la forma utilizando los métodos RotateTransform o ScaleTransform para el objeto Graphics.

El siguiente ejemplo muestra cómo renderizar una forma en un objeto Graphics por separado del documento y aplicar rotación a la imagen renderizada:

De manera similar al método RenderToSize, el método RenderToSizeheredado del NodeRendererBase es útil para crear miniaturas del contenido del documento. El tamaño de la forma se especifica a través del constructor. El método RenderToSize acepta el objeto Graphics, las coordenadas X e Y de la posición de la imagen y el tamaño de la imagen (ancho y alto) que se dibujará en el objeto Graphics.

El Shape se puede representar a cierta escala utilizando el método ShapeRenderer.RenderToScale heredado de la clase NodeRendererBase. Esto es similar al método Document.RenderToScale que acepta los mismos parámetros principales. La diferencia entre estos dos métodos es que con el método ShapeRenderer.RenderToScale, en lugar de un tamaño literal, elige un valor flotante que escala la forma durante su representación. Si el valor flotante es igual a 1.0, hace que la forma se represente al 100% de su tamaño original. Un valor flotante de 0.5 reducirá el tamaño de la imagen a la mitad.

Renderizar una Imagen de Forma

La clase Shape representa objetos en la capa de dibujo, como AutoShape, cuadro de texto, forma libre, objeto OLE, control ActiveX o una imagen. Con la clase Shape, puede crear o modificar formas en un documento Microsoft Word. Una propiedad importante de una forma es su ShapeType. Las formas de diferentes tipos pueden tener diferentes capacidades en un documento de Word. Por ejemplo, solo las imágenes y las formas OLE pueden tener imágenes dentro de ellas, mientras que la mayoría de las formas solo pueden tener texto.

El siguiente ejemplo muestra cómo renderizar una imagen de forma en una imagen JPEG por separado del documento y guardarla en el disco:

Recuperando un Tamaño de Forma

La clase ShapeRenderer también proporciona funcionalidad para recuperar el tamaño de la forma en píxeles a través del método GetSizeInPixels. Este método acepta dos parámetros flotantes (individuales): la escala y DPI, que se utilizan en el cálculo del tamaño de la forma cuando se representa la forma. El método devuelve el objeto Size, que contiene el ancho y el alto del tamaño calculado. Esto es útil cuando se requiere conocer el tamaño de la forma renderizada de antemano, por ejemplo, al crear un nuevo mapa de bits a partir de la salida renderizada.

El siguiente ejemplo muestra cómo crear un nuevo objeto de mapa de bits y gráficos con el ancho y alto de la forma que se va a representar:

Cuando se utilizan los métodos RenderToSize o RenderToScale, el tamaño de la imagen renderizada también se devuelve en el objeto SizeF. Esto se puede asignar a una variable y usarse si es necesario.

La propiedad SizeInPoints devuelve el tamaño de la forma medido en puntos (consulte ShapeRenderer). El resultado es un objeto SizeF que contiene el ancho y el alto.