Аннотации безопасности с использованием Python

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

Пример скрипта демонстрирует три распространённых рабочего процесса редактирования:

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

Пометить редактирование текста

Этот рабочий процесс ищет совпадающий текст в документе и размещает аннотации редактирования над каждым совпадением. Он пока не удаляет содержимое; он только помечает текст для последующего редактирования.

Открытие PDF и выполнить поиск целевого текста

Создать TextFragmentAbsorber для поискового термина и включите обычные параметры текстового поиска перед сканированием всех страниц.

document = ap.Document(infile)
text_fragment_absorber = ap.text.TextFragmentAbsorber(search_term)

text_search_options = ap.text.TextSearchOptions(True)
text_fragment_absorber.text_search_options = text_search_options
document.pages.accept(text_fragment_absorber)

Создание аннотации редактирования для каждого совпадения

Для каждого найденного фрагмента текста создать RedactionAnnotation используя прямоугольник фрагмента и настраивая его визуальный вид.

for text_fragment in text_fragment_absorber.text_fragments:
    page = text_fragment.page
    annotation_rectangle = text_fragment.rectangle
    redaction_annotation = ap.annotations.RedactionAnnotation(
        page, annotation_rectangle
    )
    redaction_annotation.fill_color = ap.Color.gray
    redaction_annotation.border_color = ap.Color.red
    redaction_annotation.color = ap.Color.white
    redaction_annotation.overlay_text = "REDACTED"
    redaction_annotation.text_alignment = ap.HorizontalAlignment.CENTER
    redaction_annotation.repeat = True
    page.annotations.add(redaction_annotation, True)

Сохранение помеченного PDF

document.save(outfile)

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

def mark_text_redaction(infile, outfile, search_term):
    document = ap.Document(infile)
    text_fragment_absorber = ap.text.TextFragmentAbsorber(search_term)

    text_search_options = ap.text.TextSearchOptions(True)
    text_fragment_absorber.text_search_options = text_search_options
    document.pages.accept(text_fragment_absorber)

    for text_fragment in text_fragment_absorber.text_fragments:
        page = text_fragment.page
        annotation_rectangle = text_fragment.rectangle
        redaction_annotation = ap.annotations.RedactionAnnotation(
            page, annotation_rectangle
        )
        redaction_annotation.fill_color = ap.Color.gray
        redaction_annotation.border_color = ap.Color.red
        redaction_annotation.color = ap.Color.white
        redaction_annotation.overlay_text = "REDACTED"
        redaction_annotation.text_alignment = ap.HorizontalAlignment.CENTER
        redaction_annotation.repeat = True
        page.annotations.add(redaction_annotation, True)

    document.save(outfile)

Применить вырезку

После того как аннотации редактирования были добавлены, этот рабочий процесс навсегда применяет их к первой странице. После применения оригинальное содержимое удаляется из вывода документа.

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

document = ap.Document(infile)
redaction_annotations = [
    annotation
    for annotation in document.pages[1].annotations
    if annotation.annotation_type == ap.annotations.AnnotationType.REDACTION
]

Применить каждую аннотацию редактирования

Пример проверяет, что каждую аннотацию можно рассматривать как RedactionAnnotation перед вызовом redact().

for redaction_annotation in redaction_annotations:
    if is_assignable(redaction_annotation, ap.annotations.RedactionAnnotation):
        cast(ap.annotations.RedactionAnnotation, redaction_annotation).redact()

Сохранение отредактированного PDF

document.save(outfile)

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

def apply_redaction(infile, outfile):
    document = ap.Document(infile)
    redaction_annotations = [
        annotation
        for annotation in document.pages[1].annotations
        if annotation.annotation_type == ap.annotations.AnnotationType.REDACTION
    ]

    for redaction_annotation in redaction_annotations:
        if is_assignable(redaction_annotation, ap.annotations.RedactionAnnotation):
            cast(ap.annotations.RedactionAnnotation, redaction_annotation).redact()

    document.save(outfile)

Область редактирования

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

Открытие PDF и определить расположение изображений

Использовать ImagePlacementAbsorber найти позиции изображений на первой странице.

document = ap.Document(infile)

image_placement_absorber = ap.ImagePlacementAbsorber()
page = document.pages[1]
page.accept(image_placement_absorber)

Создание аннотацию редактирования для выбранной области изображения

В образце используется третье обнаруженное размещение изображения и применяется тот же стиль редактирования, используемый в примере маркировки текста.

target_rect = image_placement_absorber.image_placements[2].rectangle
redaction_annotation = ap.annotations.RedactionAnnotation(page, target_rect)
redaction_annotation.fill_color = ap.Color.gray
redaction_annotation.border_color = ap.Color.red
redaction_annotation.color = ap.Color.white
redaction_annotation.overlay_text = "REDACTED"
redaction_annotation.text_alignment = ap.HorizontalAlignment.CENTER
redaction_annotation.repeat = True

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

page.annotations.add(redaction_annotation, True)
document.save(outfile)

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

def redact_area(infile, outfile):
    document = ap.Document(infile)

    image_placement_absorber = ap.ImagePlacementAbsorber()
    page = document.pages[1]
    page.accept(image_placement_absorber)

    target_rect = image_placement_absorber.image_placements[2].rectangle
    redaction_annotation = ap.annotations.RedactionAnnotation(page, target_rect)
    redaction_annotation.fill_color = ap.Color.gray
    redaction_annotation.border_color = ap.Color.red
    redaction_annotation.color = ap.Color.white
    redaction_annotation.overlay_text = "REDACTED"
    redaction_annotation.text_alignment = ap.HorizontalAlignment.CENTER
    redaction_annotation.repeat = True

    page.annotations.add(redaction_annotation, True)
    document.save(outfile)

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