Sistema de coordenadas

En un documento PDF y al trabajar con la biblioteca Aspose.PDF, el sistema de coordenadas comienza desde la esquina inferior izquierda de la página. El punto (0,0) corresponde a la esquina inferior izquierda. Esto significa que al colocar imágenes, texto u otros objetos, es importante recordar que el eje Y aumenta hacia arriba, a diferencia de algunos otros sistemas de coordenadas. Cada página tiene su propio sistema de coordenadas. Las coordenadas se especifican en unidades independientes de la plataforma. La especificación PDF establece que PDF opera con múltiples espacios de coordenadas.

Espacio del dispositivo

Cada dispositivo de salida —ya sea una pantalla, impresora, etc.— utiliza su propio sistema de coordenadas para renderizar imágenes. Este sistema se llama espacio del dispositivo. El origen (punto 0,0) puede estar ubicado en diferentes posiciones dependiendo del dispositivo. Además, la orientación de los ejes de coordenadas puede variar: el eje Y vertical puede aumentar ya sea de abajo hacia arriba o de arriba hacia abajo. Las resoluciones de los dispositivos también varían. Las pantallas a menudo tienen una resolución de 72 o 96 píxeles por pulgada, mientras que las impresoras pueden tener 300, 600 o incluso más puntos por pulgada. Algunos dispositivos también pueden tener diferentes resoluciones a lo largo de los ejes horizontal y vertical. Si los elementos gráficos se especifican directamente en coordenadas del espacio del dispositivo, el resultado se vuelve dependiente de las características del dispositivo particular. Esto puede llevar a un renderizado distorsionado: el mismo objeto puede aparecer de manera diferente en pantalla y en impresión. Por ejemplo, una línea de 8 pulgadas de largo, especificada en coordenadas de pantalla con una resolución de 72 ppi, ocuparía menos de una pulgada cuando se imprime en una impresora de 600 dpi.

Espacio del usuario

Para evitar tales problemas, PDF utiliza un sistema de coordenadas independiente del dispositivo (espacio del usuario) que asegura un renderizado gráfico consistente independientemente del dispositivo de salida. Durante el renderizado de la página, el contenido se transforma del espacio del usuario al espacio del dispositivo, teniendo en cuenta las características específicas del dispositivo de salida. Cada página en el documento tiene su propio sistema de coordenadas del espacio del usuario. La longitud de una unidad a lo largo de ambos ejes es igual a 1/72 de pulgada. Puedes cambiar las unidades de medida configurando el UserUnit, que por defecto es igual a 1. Este valor se puede especificar utilizando la propiedad UserUnit del objeto de la página. El UserUnit actúa como un multiplicador de 1/72 de pulgada.

La transformación del espacio del usuario al espacio del dispositivo está definida por la Matriz de Transformación Actual (CTM).

Transformación de la matriz del espacio de coordenadas. Tomado de la especificación ISO 32000-2:2020

Imagen 1. Transformación de la matriz del espacio de coordenadas. Tomado de la especificación ISO 32000-2:2020

Si estás creando contenido de página utilizando operadores PDF, puedes modificar la CTM (Matriz de Transformación Actual) utilizando el operador Aspose.Pdf.ConcatenateMatrix, que concatena la matriz actual con la que proporcionas. Esto te permite realizar rotación, traducción y escalado del contenido renderizado.

Transformación al espacio del dispositivo.

Imagen 2. Transformación al espacio del dispositivo. Tomado de la especificación ISO 32000-2:2020

Además del espacio del usuario y el espacio del dispositivo, PDF utiliza varios otros sistemas de coordenadas, cada uno con propósitos específicos:

Espacio de texto

El texto se posiciona en su propio sistema de coordenadas: espacio de texto. La transformación del espacio de texto al espacio del usuario se realiza utilizando una matriz de texto dedicada junto con varias configuraciones de renderizado de texto.

Espacio de glifos

Los caracteres de fuente (glifos) se definen en el espacio de glifos. Este espacio se transforma en el espacio de texto a través de la matriz de fuente. Para la mayoría de las fuentes, se utiliza una escala de 1000 unidades de espacio de glifos = 1 unidad de espacio de texto. En algunas fuentes, como las fuentes de tipo 3, esta matriz se define explícitamente.

Espacio de imagen

Las imágenes rasterizadas se definen en su propio espacio de imagen. Este espacio siempre se transforma automáticamente en el espacio del usuario: las imágenes se consideran que tienen un ancho y una altura de 1 unidad, independientemente de su resolución real. Para mostrar correctamente una imagen, su escala y posición se establecen modificando la matriz de transformación (escalado, rotación).

Espacio de formulario

Los formularios (Form XObjects) son fragmentos de contenido independientes que pueden integrarse como elementos gráficos. Cada formulario se define en su propio espacio de formulario, que luego se transforma en el espacio del usuario utilizando una matriz de formulario.

Relaciones entre espacios de coordenadas.

Imagen 3. Relaciones entre espacios de coordenadas. Tomado de la especificación ISO 32000-2:2020

Matriz de transformación

Esta matriz permite operaciones como escalado, rotación, traducción, cizallamiento y reflexión de objetos en la página. Es una matriz bidimensional de 3×3, pero en PDF solo se utilizan 6 parámetros numéricos: [a b c d e f]. Esta matriz se aplica a cada punto (x, y) del espacio transformado utilizando las siguientes fórmulas: x’ = a * x + c * y + e
y’ = b * x + d * y + f

Ecuación de transformación de coordenadas

Imagen 4. Ecuación de transformación de coordenadas. Tomado de la especificación ISO 32000-2:2020

Fórmula de transformación de coordenadas — tomada de la especificación ISO 32000-2:2020. Dependiendo de los valores de los elementos de la matriz, se pueden definir diferentes tipos de transformaciones:

  • Traducción: [1 0 0 1 e f] — mueve un objeto e unidades a lo largo del eje X y f unidades a lo largo del eje Y.
  • Escalado: [a 0 0 d 0 0] — escala un objeto a veces a lo largo de X y d veces a lo largo de Y.
  • Rotación: [cos(θ) sin(θ) -sin(θ) cos(θ) 0 0] — rota un objeto por un ángulo θ (en radianes).
  • Cizallamiento: A lo largo de X [1 0 c 1 0 0], A lo largo de Y [1 b 0 1 0 0].
  • Reflexión: A través del eje X [1 0 0 -1 0 0], A través del eje Y [-1 0 0 1 0 0]

Ejemplo de configuración de una matriz de transformación:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
var matrix = new Aspose.Pdf.Matrix(new double[]{a, b, c, d, e, f});
page.Contents.Add(new Aspose.Pdf.Operators.ConcatenateMatrix(matrix));

En el Ejemplo 1, puedes ver que intentar renderizar texto en las coordenadas de la esquina de la página resulta en que solo el texto en el origen es visible. El resto del texto cae fuera del área visible y es recortado.

Imagen 5. El resultado de la ejecución del ejemplo 1.

En el Ejemplo 2, escalamos el sistema de coordenadas y lo desplazamos al centro de la página.

Imagen 6. El resultado de la ejecución del ejemplo 2.

Comprendiendo los sistemas de coordenadas y el posicionamiento en Aspose.PDF

Al trabajar con Aspose.PDF, es importante entender las diferencias entre los objetos utilizados para el posicionamiento y sus respectivos sistemas de coordenadas. A continuación se presenta una explicación detallada de los objetos clave (TextFragment, TextStamp, FloatingBox, Rectangle) y sus casos de uso, junto con sus pros y contras.

TextFragment

Sistema de coordenadas: Posicionamiento absoluto (origen en la esquina inferior izquierda). Descripción: La clase TextFragment permite agregar texto a una posición específica en la página utilizando coordenadas absolutas. Pros:

  • Simple y eficiente para agregar texto en posiciones precisas.
  • Operación ligera en comparación con TextStamp. Contras:
  • No admite transformaciones avanzadas como rotación o escalado. Caso de uso: Utilizar cuando necesites agregar texto en una posición específica en la página sin complejidad adicional.

TextStamp

Sistema de coordenadas: Posicionamiento absoluto (origen en la esquina inferior izquierda). Descripción: La clase TextStamp agrega texto como un sello a la página. Internamente, crea un formulario en los recursos de la página, lo que lo convierte en una operación más compleja que TextFragment. Pros:

  • Admite transformaciones avanzadas como rotación, escalado y opacidad.
  • Ideal para agregar marcas de agua o texto repetido. Contras:
  • Más intensivo en recursos en comparación con TextFragment.
  • Un poco más complejo de configurar. Caso de uso: Utilizar para agregar marcas de agua, encabezados o pies de página donde se requieren transformaciones o uso repetido.

FloatingBox

Sistema de coordenadas: Posicionamiento relativo (basado en márgenes de página). Descripción: La clase FloatingBox es un contenedor que puede contener texto u otros elementos. Su posición se define en relación con los márgenes de la página. Pros:

  • Fácil de posicionar elementos en relación con el diseño de la página.
  • Admite redimensionamiento dinámico y ajuste del contenido. Contras:
  • No es adecuado para colocación precisa y perfecta en píxeles.
  • Requiere ajustes adicionales para diseños complejos. Caso de uso: Utilizar para crear diseños donde el contenido necesita fluir dinámicamente, como encabezados, pies de página o barras laterales.

Rectangle

Sistema de coordenadas: Posicionamiento absoluto (origen en la esquina inferior izquierda). Descripción: La clase Rectangle se utiliza para dibujar áreas o formas en la página. También se puede utilizar con el TextFragmentAbsorber para buscar texto dentro de un área rectangular específica. Pros:

  • Útil para dibujar elementos gráficos como marcos o resaltados.
  • Puede combinarse con otros elementos como texto o imágenes. Contras:
  • Limitado a formas rectangulares.
  • Requiere pasos adicionales para integrarse con otro contenido. Caso de uso: Utilizar para dibujar marcos alrededor de elementos o resaltar áreas en la página. Utilizar con TextFragmentAbsorber para buscar texto dentro de un área específica.