Saltar al contenido

En PDFBox, ¿cómo cambiar el punto de origen (0,0) de un objeto PDRectangle?

Solución:

Puede cambiar un poco los sistemas de coordenadas, pero lo más probable es que las cosas no se pongan más elegantes al final.

Para empezar…

En primer lugar, aclaremos algunos conceptos erróneos:

Asumes

En PDFBox, el origen predeterminado de los objetos PDRectangle (0,0) parece ser la esquina inferior izquierda de una página.

Esto no es cierto para todos los casos, solo a menudo.

El área que contiene el área de la página mostrada (en papel o en pantalla) generalmente está definida por el CropBox entrada de la página en cuestión:

CropBox rectángulo (Opcional; heredable) Un rectángulo, expresado en unidades de espacio de usuario predeterminadas, que definirá la región visible del espacio de usuario predeterminado. Cuando la página se muestra o imprime, su contenido se recortará (recortará) en este rectángulo y luego se impondrá en el medio de salida de alguna manera definida por la implementación.

… El eje x positivo se extiende horizontalmente hacia la derecha y el eje y positivo verticalmente hacia arriba, como en la práctica matemática estándar (sujeto a alteración por el Girar entrada en el diccionario de la página).

… En PostScript, el origen del espacio de usuario predeterminado siempre corresponde a la esquina inferior izquierda del medio de salida. Si bien esta convención también es común en los documentos PDF, no es necesaria; el diccionario de la página CropBox La entrada puede especificar cualquier rectángulo del espacio de usuario predeterminado para que se haga visible en el medio.

Por lo tanto, el origen (0,0) puede estar literalmente en cualquier lugar, puede estar en la parte inferior izquierda, en la parte superior izquierda, en el medio de la página o incluso fuera del área de la página mostrada.

Y por medio del Girar entrada, esa área incluso se puede rotar (por 90 °, 180 ° o 270 °).

Poner el origen (como parece haber observado) en la parte inferior izquierda simplemente se hace por convención.

Además, parece pensar que el sistema de coordenadas es constante. Este tampoco es el caso, hay operaciones mediante las cuales puede transformar drásticamente el sistema de coordenadas del espacio del usuario, ¡puede trasladarlo, rotarlo, reflejarlo, sesgarlo y / o escalarlo!

Por lo tanto, incluso si al principio el sistema de coordenadas es el habitual, el origen en la parte inferior izquierda, el eje x va a la derecha, el eje y sube, puede cambiar a algo extraño de alguna manera en la descripción del contenido de la página. Dibujando tu rectángulo new PDRectangle(0, 0, 100, 100) podría producirse una forma romboide justo a la derecha del centro de la página.

Lo que puedes hacer…

Como ve, las coordenadas en el espacio de usuario de PDF son un asunto muy dinámico. lo que puede hacer para dominar la situación depende del contexto en el que use su rectángulo.

Desafortunadamente, fue bastante vago en la descripción de lo que hace. Por lo tanto, esto también será algo vago.

Coordenadas en el contenido de la página

Si desea dibujar un rectángulo en una página existente, primero necesita un flujo de contenido de página para escribir, es decir, un PDPageContentStream ejemplo, y debe prepararse de manera que se garantice que el sistema de coordenadas del espacio de usuario original no se haya alterado. Obtienes una instancia de este tipo usando el constructor con tres argumentos booleanos configurándolos todos en true:

PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);

Luego, puede aplicar una transformación al sistema de coordenadas. Desea que la parte superior izquierda sea el origen y el valor de y aumente hacia abajo. Si el cuadro de recorte de la página le dice que la parte superior izquierda tiene coordenadas (xtl, ytl), entonces aplica

contentStream.concatenate2CTM(new AffineTransform(1, 0, 0, -1, xtl, ytl));

y a partir de aquí tiene un sistema de coordenadas que deseaba, el origen en la parte superior izquierda y las coordenadas y reflejadas.

Sin embargo, tenga en cuenta una cosa: si también va a dibujar texto, no solo se refleja la coordenada y del punto de inserción de texto, sino también el texto en sí, a menos que lo contrarreste agregando una matriz de texto que también refleje. Por lo tanto, si desea agregar mucho texto, es posible que este no sea tan elegante como desea.

Coordenadas para anotaciones

Si no desea utilizar el rectángulo en el flujo de contenido, sino para agregar anotaciones, no está sujeto a las transformaciones mencionadas anteriormente, pero tampoco puede hacer uso de él.

Por lo tanto, en este contexto, debe tomar el cuadro de recorte tal como está y transformar su rectángulo en consecuencia.

Por que las coordenadas de extracción de texto de PDFBox son como son

Básicamente, para poner líneas de texto juntas en el orden correcto y ordenar las líneas correctamente, no desea una situación tan extraña sino un sistema de coordenadas estable y simple. Algunos desarrolladores de PDFBox eligieron la variante de origen superior izquierdo, y aumentando hacia abajo para eso, por lo que TextPosition las coordenadas se han normalizado a ese esquema.

En mi opinión, una mejor opción habría sido utilizar las coordenadas del espacio de usuario predeterminadas para facilitar la reutilización de las coordenadas. Por lo tanto, es posible que desee intentar trabajar con textPosition.getTextMatrix().getTranslateX(), textPosition.getTextMatrix().getTranslateY() para TextPosition textPosition

La siguiente parece ser la mejor manera de “ajustar” las coordenadas de TextPosition:

x_adjusted =  x_original + page.findCropBox().getLowerLeftX();
y_adjusted = -y_original + page.findCropBox().getUpperRightY();

dónde page es el PDPage en el que el TextPosition se encuentra el objeto

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *