Аннотации безопасности с использованием 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)