Anotaciones interactivas usando Python

Este artículo muestra cómo trabajar con anotaciones interactivas en documentos PDF utilizando Aspose.PDF for Python via .NET.

El script de ejemplo muestra varios flujos de trabajo comunes:

  • agregar una anotación de enlace al texto existente
  • obtener los rectángulos de anotación de enlace de una página
  • eliminar anotaciones de enlace
  • crear botones de navegación
  • crear un botón de impresión

Anotación de enlace

Agregar anotación de enlace

Este ejemplo busca en la primera página el fragmento de texto "file" y coloca una anotación de enlace clicable sobre el área de texto coincidente. Cuando el usuario hace clic en la anotación, el PDF abre la dirección web especificada.

Cargue el documento y encuentre el texto objetivo

Crear una Document objeto y usar TextFragmentAbsorber buscar el texto que se volverá interactivo.

document = ap.Document(infile)
text_fragment_absorber = ap.text.TextFragmentAbsorber("file")

document.pages[1].accept(text_fragment_absorber)
phone_number_fragment = text_fragment_absorber.text_fragments[1]

Crear la anotación de enlace

Construir un LinkAnnotation usando el rectángulo del fragmento de texto coincidente y asignar una acción URI a él.

link_annotation = ap.annotations.LinkAnnotation(
    document.pages[1], phone_number_fragment.rectangle
)
link_annotation.action = ap.annotations.GoToURIAction("https://www.aspose.com")

Añade la anotación y guarda el PDF

Agregue la anotación a la página y guarde el archivo actualizado.

document.pages[1].annotations.append(link_annotation)
document.save(outfile)

Ejemplo completo

def link_add(infile, outfile):
    document = ap.Document(infile)
    text_fragment_absorber = ap.text.TextFragmentAbsorber("file")

    document.pages[1].accept(text_fragment_absorber)
    phone_number_fragment = text_fragment_absorber.text_fragments[1]

    link_annotation = ap.annotations.LinkAnnotation(
        document.pages[1], phone_number_fragment.rectangle
    )
    link_annotation.action = ap.annotations.GoToURIAction("https://www.aspose.com")

    document.pages[1].annotations.append(link_annotation)
    document.save(outfile)

Obtener anotación de enlace

Para inspeccionar los enlaces interactivos existentes, filtre la colección de anotaciones en la primera página y conserve solo los elementos cuyo tipo es LINK. La muestra luego imprime el rectángulo para cada anotación coincidente.

Cargar el PDF y recopilar anotaciones de enlace

document = ap.Document(infile)
link_annotations = [
    a
    for a in document.pages[1].annotations
    if (a.annotation_type == ap.annotations.AnnotationType.LINK)
]

Leer los rectángulos de anotación

Recorra las anotaciones filtradas y muestre las coordenadas de cada área de enlace.

for link_annotation in link_annotations:
    print(link_annotation.rect)

Ejemplo completo

def link_get(infile, outfile):
    document = ap.Document(infile)
    link_annotations = [
        a
        for a in document.pages[1].annotations
        if (a.annotation_type == ap.annotations.AnnotationType.LINK)
    ]

    for link_annotation in link_annotations:
        print(link_annotation.rect)

Eliminar anotación de enlace

Este flujo de trabajo elimina todas las anotaciones de enlaces de la primera página y guarda el PDF limpio como un nuevo archivo.

Encuentra las anotaciones de enlace para eliminar

document = ap.Document(infile)
link_annotations = [
    a
    for a in document.pages[1].annotations
    if (a.annotation_type == ap.annotations.AnnotationType.LINK)
]

Eliminar cada anotación de enlace

for link_annotation in link_annotations:
    document.pages[1].annotations.delete(link_annotation)

Guardar el documento actualizado

document.save(outfile)

Ejemplo completo

def link_delete(infile, outfile):
    document = ap.Document(infile)
    link_annotations = [
        a
        for a in document.pages[1].annotations
        if (a.annotation_type == ap.annotations.AnnotationType.LINK)
    ]

    for link_annotation in link_annotations:
        document.pages[1].annotations.delete(link_annotation)

    document.save(outfile)

Anotación de widget

Agregar botón de navegación

Los botones de navegación son útiles en PDFs de varias páginas cuando deseas que los lectores se desplacen entre páginas sin usar la interfaz del visor. Este ejemplo agrega Previous Page y Next Page botones a cada página.

Definir configuración del botón

Almacena los textos de los botones, sus posiciones y acciones predefinidas en una lista de configuración simple.

button_config = [
    ("Previous Page", 120.0, ap.annotations.PredefinedAction.PREV_PAGE),
    ("Next Page", 230.0, ap.annotations.PredefinedAction.NEXT_PAGE),
]

Cargue el PDF y asegúrese de que existan varias páginas

El ejemplo abre el documento fuente y agrega una página más para que las acciones de navegación tengan al menos dos páginas con las que trabajar.

document = ap.Document(infile)
document.pages.add()

Cree los botones en cada página

Para cada página, crea un ButtonField, establezca su texto y colores, asigne una acción de navegación predefinida y agréguelo al formulario.

for page in document.pages:
    for name, x_pos, action in button_config:
        rect = ap.Rectangle(x_pos, 10.0, x_pos + 100, 40.0, True)
        button = ap.forms.ButtonField(page, rect)
        button.partial_name = name
        button.value = name
        button.characteristics.border = ap.Color.red.to_rgb()
        button.characteristics.background = ap.Color.orange.to_rgb()
        button.actions.on_release_mouse_btn = ap.annotations.NamedAction(action)
        document.form.add(button)

Guardar el resultado

document.save(outfile)

Ejemplo completo

def navigation_buttons_add(infile, outfile):
    button_config = [
        ("Previous Page", 120.0, ap.annotations.PredefinedAction.PREV_PAGE),
        ("Next Page", 230.0, ap.annotations.PredefinedAction.NEXT_PAGE),
    ]

    document = ap.Document(infile)
    document.pages.add()

    for page in document.pages:
        for name, x_pos, action in button_config:
            rect = ap.Rectangle(x_pos, 10.0, x_pos + 100, 40.0, True)
            button = ap.forms.ButtonField(page, rect)
            button.partial_name = name
            button.value = name
            button.characteristics.border = ap.Color.red.to_rgb()
            button.characteristics.background = ap.Color.orange.to_rgb()
            button.actions.on_release_mouse_btn = ap.annotations.NamedAction(action)
            document.form.add(button)

    document.save(outfile)

Agregar botón de impresión

Este ejemplo crea un PDF de una sola página y coloca un botón de impresión cerca de la parte superior de la página. Al hacer clic en el botón se activa la acción de impresión predefinida en un visor de PDF compatible.

Crear un nuevo PDF y añadir una página

document = ap.Document()
page = document.pages.add()

Crear y configurar el botón

Definir el rectángulo del botón, crear el ButtonField, establezca su leyenda y adjunte la acción de impresión.

rect = ap.Rectangle(72, 748, 164, 768, True)

print_button = ap.forms.ButtonField(page, rect)
print_button.alternate_name = "Print current document"
print_button.color = ap.Color.black
print_button.partial_name = "printBtn1"
print_button.value = "Print Document"
print_button.actions.on_release_mouse_btn = ap.annotations.NamedAction(
    ap.annotations.PredefinedAction.FILE_PRINT
)

Establecer estilos de borde y fondo

El ejemplo define un borde sólido y aplica colores personalizados para hacer que el botón sea visible en el documento.

border = ap.annotations.Border(print_button)
border.style = ap.annotations.BorderStyle.SOLID
border.width = 2
print_button.border = border

print_button.characteristics.border = ap.Color.blue.to_rgb()
print_button.characteristics.background = ap.Color.light_blue.to_rgb()

Añade el botón y guarda el PDF

document.form.add(print_button)
document.save(outfile)

Ejemplo completo

def print_button_add(infile, outfile):
    document = ap.Document()
    page = document.pages.add()

    rect = ap.Rectangle(72, 748, 164, 768, True)

    print_button = ap.forms.ButtonField(page, rect)
    print_button.alternate_name = "Print current document"
    print_button.color = ap.Color.black
    print_button.partial_name = "printBtn1"
    print_button.value = "Print Document"
    print_button.actions.on_release_mouse_btn = ap.annotations.NamedAction(
        ap.annotations.PredefinedAction.FILE_PRINT
    )

    border = ap.annotations.Border(print_button)
    border.style = ap.annotations.BorderStyle.SOLID
    border.width = 2
    print_button.border = border

    print_button.characteristics.border = ap.Color.blue.to_rgb()
    print_button.characteristics.background = ap.Color.light_blue.to_rgb()

    document.form.add(print_button)
    document.save(outfile)

Temas relacionados