Anotações de Segurança usando Python

Este artigo mostra como usar anotações de segurança em documentos PDF com Aspose.PDF for Python via .NET.

O script de exemplo demonstra três fluxos de trabalho comuns de redação:

  • marcar fragmentos de texto com anotações de redação
  • aplicar permanentemente anotações de redação existentes
  • censurar uma área de imagem detectada em uma página

Marcar Redação de Texto

Este fluxo de trabalho procura por texto correspondente no documento e coloca anotações de redação sobre cada correspondência. Ele ainda não remove o conteúdo; apenas marca o texto para posterior redação.

Abra o PDF e procure o texto alvo

Criar um TextFragmentAbsorber para o termo de pesquisa e habilite as opções de pesquisa de texto padrão antes de analisar todas as páginas.

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)

Criar anotações de redação para cada correspondência

Para cada fragmento de texto correspondido, crie um RedactionAnnotation usando o retângulo de fragmento e configure sua aparência visual.

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)

Salvar o PDF marcado

document.save(outfile)

Exemplo completo

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)

Aplicar Redação

Depois que as anotações de redação foram adicionadas, este fluxo de trabalho as aplica permanentemente na primeira página. Uma vez aplicadas, o conteúdo original é removido da saída do documento.

Carregue o PDF e colete anotações de redação

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

Aplique cada anotação de redação

O exemplo verifica que cada anotação pode ser tratada como um RedactionAnnotation antes de chamar redact().

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

Salvar o PDF redigido

document.save(outfile)

Exemplo completo

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)

Área de Redação

Este exemplo censura uma área de imagem detectada em vez de texto. Ele varre a página em busca de posicionamentos de imagens, seleciona um retângulo de posicionamento e adiciona uma anotação de censura sobre essa área.

Abra o PDF e detecte a colocação de imagens

Usar ImagePlacementAbsorber para encontrar as posições das imagens na primeira página.

document = ap.Document(infile)

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

Criar uma anotação de redação para a área de imagem selecionada

O exemplo usa a terceira colocação de imagem detectada e aplica a mesma estilização de redação usada no exemplo de marcação de texto.

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

Adicione a anotação e salve o PDF

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

Exemplo completo

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)

Tópicos Relacionados