Интерактивные аннотации с использованием Python

Contents
[ ]

В этой статье показано, как работать с интерактивными аннотациями в PDF‑документах с использованием Aspose.PDF for Python via .NET.

Пример скрипта демонстрирует несколько общих рабочих процессов:

  • добавить аннотацию ссылки к существующему тексту
  • получить прямоугольники ссылочных аннотаций со страницы
  • удалить аннотации ссылок
  • создать кнопки навигации
  • создать кнопку печати

Аннотация ссылки

Добавление аннотацию ссылки

Этот пример ищет фрагмент текста на первой странице "file" и размещает кликабельную аннотацию ссылки над соответствующей областью текста. Когда пользователь нажимает на аннотацию, PDF открывает указанный веб‑адрес.

Загрузить документ и найти целевой текст

Создать Document объект и использовать TextFragmentAbsorber для поиска текста, который станет интерактивным.

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]

Создание аннотацию ссылки

Создать LinkAnnotation используя прямоугольник найденного фрагмента текста и назначая для него действие URI.

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

Добавление аннотацию и сохранить PDF

Добавьте аннотацию на страницу и сохраните обновлённый файл.

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

Полный пример

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)

Получение аннотацию ссылки

Чтобы просмотреть существующие интерактивные ссылки, отфильтруйте коллекцию аннотаций на первой странице и оставьте только элементы, тип которых LINK. Затем пример выводит прямоугольник для каждой соответствующей аннотации.

Загрузить PDF и собрать аннотации ссылок

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)

Полный пример

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)

Удаление аннотацию ссылки

Этот рабочий процесс удаляет все аннотации ссылок с первой страницы и сохраняет очищенный PDF в новый файл.

Найти аннотации ссылок для удаления

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)

Полный пример

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)

Виджет-аннотация

Добавление кнопку навигации

Кнопки навигации полезны в многостраничных PDF, когда вы хотите, чтобы читатели перемещались между страницами без использования интерфейса просмотрщика. Этот пример добавляет Previous Page и Next Page кнопки к каждой странице.

Определить настройки кнопки

Сохраните подписи кнопок, их позиции и предопределённые действия в простой список конфигурации.

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

Загрузить PDF и убедиться, что существует несколько страниц

Пример открывает исходный документ и добавляет ещё одну страницу, чтобы навигационные действия имели как минимум две страницы для работы.

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

Создание кнопки на каждой странице

Для каждой страницы создайте ButtonField, установить его текст и цвета, назначить предопределённое действие навигации и добавить его в форму.

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)

Полный пример

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)

Добавление кнопку печати

Этот пример создает новый одностраничный PDF и размещает кнопку печати возле верхней части страницы. Нажатие кнопки вызывает предопределённое действие печати в совместимом просмотрщике PDF.

Создание нового PDF и добавление страницы

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

Создание и настроить кнопку

Определите прямоугольник кнопки, создайте ButtonField, установите его подпись и прикрепите действие печати.

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

Добавление кнопку и сохранить PDF

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

Полный пример

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)

Связанные темы