es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué pymupdf tiene un origen que no está en la esquina superior izquierda?

No parece que pueda entender por qué las herramientas de pymupdf para colocar objetos en documentos PDF tienen el origen establecido en una ubicación aparentemente aleatoria. Ten en cuenta que (0,0,100,100), que corresponde a x0 y1 x2 y2 (donde y comienza desde arriba), comienza desde el centro de la página para el eje y. El eje x parece estar bien. No puedo encontrar nada al respecto en la documentación.

import fitz
doc = fitz.open('PDF4.pdf')
page = doc.load_page(0)
box = page.new_shape()
box.draw_rect(fitz.Rect(0, 0, 100, 100)) # x0, y0-2505, x2, y2
box.finish(color=(0, 0, 0), fill=(0, 0, 1), fill_opacity=0.25)
box.commit()
doc.save('x.pdf')

Observa que la caja está en la esquina superior izquierda

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás experimentando con las herramientas de pymupdf para colocar objetos en documentos PDF se debe a que el origen del eje y está configurado en la parte superior de la página, en lugar de en la parte inferior como suele ser común.

    Esto significa que cuando usas el método draw_rect para dibujar un rectángulo en las coordenadas (0,0,100,100), que corresponden a x0, y0, x2, y2 respectivamente, el rectángulo se dibuja en la esquina superior izquierda de la página (es decir, el origen), en lugar de la esquina inferior izquierda como se esperaría.

    Desafortunadamente, parece que no hay documentación sobre este comportamiento en la documentación de pymupdf. Sin embargo, esto se puede solucionar fácilmente modificando las coordenadas y de tu rectángulo para que sean relativas a la parte inferior de la página en lugar de la parte superior.

    Para hacer esto, puedes usar el siguiente código:

    import fitz
    
    doc = fitz.open('PDF4.pdf')
    page = doc.load_page(0)
    
    page_height = page.bound().y1 #obtener la altura de la página
    
    box = page.new_shape()
    box.draw_rect(fitz.Rect(0, page_height-100, 100, page_height)) #modifica las coordenadas y para que sean relativas a la parte inferior de la página
    box.finish(color=(0, 0, 0), fill=(0, 0, 1), fill_opacity=0.25)
    box.commit()
    
    doc.save('x.pdf')
    

    Esto debería colocar tu rectángulo en la esquina inferior izquierda de la página como se esperaba.

Comments are closed.