Annotations interactives avec Python

Cet article montre comment travailler avec les annotations interactives dans les documents PDF en utilisant Aspose.PDF for Python via .NET.

Le script d’exemple démontre plusieurs flux de travail courants :

  • ajouter une annotation de lien au texte existant
  • obtenir les rectangles d’annotation de lien d’une page
  • supprimer les annotations de lien
  • créer des boutons de navigation
  • Créer un bouton d’impression

Annotation de lien

Ajouter une annotation de lien

Cet exemple recherche le fragment de texte sur la première page "file" et place une annotation de lien cliquable sur la zone de texte correspondante. Lorsque l’utilisateur clique sur l’annotation, le PDF ouvre l’adresse web spécifiée.

Chargez le document et trouvez le texte cible

Créer un Document objet et utilisation TextFragmentAbsorber pour rechercher le texte qui deviendra interactif.

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]

Créer l’annotation de lien

Construire un LinkAnnotation en utilisant le rectangle du fragment de texte correspondant et en lui assignant une action URI.

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

Ajoutez l’annotation et enregistrez le PDF

Ajoutez l’annotation à la page et enregistrez le fichier mis à jour.

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

Exemple complet

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)

Obtenir l’annotation de lien

Pour inspecter les liens interactifs existants, filtrez la collection d’annotations sur la première page et ne conservez que les éléments dont le type est LINK. L’exemple imprime ensuite le rectangle pour chaque annotation correspondante.

Chargez le PDF et collectez les annotations de lien

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

Lire les rectangles d’annotation

Parcourez les annotations filtrées et affichez les coordonnées de chaque zone de lien.

for link_annotation in link_annotations:
    print(link_annotation.rect)

Exemple complet

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)

Supprimer l’annotation de lien

Ce flux de travail supprime toutes les annotations de lien de la première page et enregistre le PDF nettoyé en tant que nouveau fichier.

Trouver les annotations de lien à supprimer

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

Supprimer chaque annotation de lien

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

Enregistrez le document mis à jour

document.save(outfile)

Exemple complet

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)

Annotation de widget

Ajouter un bouton de navigation

Les boutons de navigation sont utiles dans les PDF multi-pages lorsque vous souhaitez que les lecteurs passent d’une page à l’autre sans utiliser l’interface du visualiseur. Cet exemple ajoute Previous Page et Next Page boutons pour chaque page.

Définir les paramètres du bouton

Stockez les légendes des boutons, leurs positions et les actions prédéfinies dans une liste de configuration simple.

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

Chargez le PDF et assurez-vous que plusieurs pages existent

L’exemple ouvre le document source et ajoute une page supplémentaire afin que les actions de navigation disposent d’au moins deux pages avec lesquelles travailler.

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

Créer les boutons sur chaque page

Pour chaque page, créez un ButtonField, définissez son texte et ses couleurs, attribuez une action de navigation prédéfinie, et ajoutez‑le au formulaire.

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)

Enregistrer le résultat

document.save(outfile)

Exemple complet

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)

Ajouter le bouton d’impression

Cet exemple crée un nouveau PDF d’une page et place un bouton d’impression près du haut de la page. Cliquer sur le bouton déclenche l’action d’impression prédéfinie dans un visualiseur PDF compatible.

Créer un nouveau PDF et ajouter une page

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

Créer et configurer le bouton

Définissez le rectangle du bouton, créez le ButtonField, définissez sa légende, et attachez l’action d’impression.

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
)

Définir les styles de bordure et d’arrière-plan

L’exemple définit une bordure solide et applique des couleurs personnalisées pour rendre le bouton visible dans le document.

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()

Ajoutez le bouton et enregistrez le PDF

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

Exemple complet

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)

Sujets associés