Работа с PDF-слоями с помощью Python
Слои PDF, также называемые опциональными группами содержимого (OCG), позволяют организовывать контент в отдельные визуальные группы, которые можно показывать или скрывать в совместимых PDF‑просмотрщиках. В Aspose.PDF операции с уровнями построены вокруг Layer API.
С Aspose.PDF for Python via .NET вы можете:
- Добавьте несколько слоёв на страницу.
- Блокируйте и разблокировать слои, чтобы контролировать поведение видимости.
- Извлеките слои в отдельные файлы или потоки.
- Сведите многослойное содержимое в страницу.
- Объедините несколько слоёв в один слой.
Добавить слои в PDF
Этот пример создает PDF с тремя уровнями. Он использует Document, добавляет a Page, и добавляет Layer объекты к этой странице.
- Создайте новый
Documentи добавьте aPage. - Создайте и добавьте красный слой.
- Создайте и добавьте зеленый слой.
- Создайте и добавьте синий слой.
- Сохраните PDF‑документ.
Полученный PDF будет содержать три отдельных слоя: красную линию, зеленую линию и синюю линию. Каждый из них можно включать и выключать в PDF‑просмотрщиках, поддерживающих многослойный контент.
import aspose.pdf as ap
def add_layers(outfile: str) -> None:
document = ap.Document()
page = document.pages.add()
# Red layer
layer = ap.Layer("oc1", "Red Line")
layer.contents.append(ap.operators.SetRGBColorStroke(1, 0, 0))
layer.contents.append(ap.operators.MoveTo(500, 700))
layer.contents.append(ap.operators.LineTo(400, 700))
layer.contents.append(ap.operators.Stroke())
page.layers.append(layer)
# Green layer
layer = ap.Layer("oc2", "Green Line")
layer.contents.append(ap.operators.SetRGBColorStroke(0, 1, 0))
layer.contents.append(ap.operators.MoveTo(500, 750))
layer.contents.append(ap.operators.LineTo(400, 750))
layer.contents.append(ap.operators.Stroke())
page.layers.append(layer)
# Blue layer
layer = ap.Layer("oc3", "Blue Line")
layer.contents.append(ap.operators.SetRGBColorStroke(0, 0, 1))
layer.contents.append(ap.operators.MoveTo(500, 800))
layer.contents.append(ap.operators.LineTo(400, 800))
layer.contents.append(ap.operators.Stroke())
page.layers.append(layer)
document.save(outfile)
print(f"Layers added successfully. File saved at {outfile}")
Заблокировать слой PDF
В этом примере открывается PDF, блокируется конкретный слой на первой странице и сохраняется обновлённый файл.
Блокировка слоя предотвращает изменение пользователями состояния видимости этого слоя в поддерживаемых PDF‑просмотрщиках. Слои доступны из страницы и управляются через коллекцию слоёв страницы.
Доступные методы и свойства:
Layer.lock()блокирует слой.Layer.unlock()разблокирует слой.Layer.lockedвозвращает текущее состояние блокировки.
- Откройте PDF-документ.
- Получите доступ к первой странице PDF.
- Проверьте, есть ли у страницы слои.
- Получите первый слой и заблокируйте его.
- Сохраните обновлённый PDF.
Если PDF содержит слои, первый слой будет заблокирован, обеспечивая невозможность изменения его состояния видимости пользователем. Если слои не найдены, вместо этого выводится сообщение.
import aspose.pdf as ap
def lock_layer(infile: str, outfile: str) -> None:
document = ap.Document(infile)
page = document.pages[1]
if len(page.layers) > 0:
layer = page.layers[0]
layer.lock()
document.save(outfile)
print(f"Layer locked successfully. File saved at {outfile}")
else:
print("No layers found in the document.")
Извлечь элементы слоя PDF
В этом примере используется библиотека Aspose.PDF for Python via .NET для извлечения отдельных слоёв с первой страницы PDF‑документа и сохранения каждого слоя в отдельный PDF‑файл с помощью Layer.save().
Чтобы создать новый PDF из слоя, можно использовать следующий фрагмент кода:
- Загрузите PDF
Document. - Получите доступ к слоям на странице 1 через
Page. - Проверьте, существуют ли слои.
- Переберите слои и сохраните каждый из них.
import aspose.pdf as ap
def extract_layers(infile: str, outfile: str) -> None:
document = ap.Document(infile)
layers = document.pages[1].layers
if len(layers) == 0:
print("No layers found in the document.")
return
index = 1
for layer in layers:
output_file = outfile.replace(".pdf", f"{index}.pdf")
layer.save(output_file)
print(f"Layer {index} saved to {output_file}")
index += 1
Можно извлечь элементы слоя PDF и сохранить их в новый поток файла PDF:
from io import FileIO
import aspose.pdf as ap
def extract_layers_stream(infile: str, outfile: str) -> None:
document = ap.Document(infile)
if len(document.pages[1].layers) == 0:
print("No layers found in the document.")
return
layer = document.pages[1].layers[0]
with FileIO(outfile, "wb") as output_layer:
layer.save(output_layer)
print(f"Layer extracted to stream: {outfile}")
Уплощить многослойный PDF
Этот скрипт использует Aspose.PDF for Python via .NET для уплощения всех слоёв на первой странице PDF‑документа. Уплощение объединяет визуальное содержимое каждого слоя в один единый слой, что упрощает печать, совместное использование или архивирование без потери визуального качества или данных, специфичных для слоёв. Операция выполняется с Layer.flatten().
- Загрузите PDF-документ.
- Доступ к слоям на странице 1.
- Проверьте, существуют ли слои.
- Сведите каждый слой с помощью
layer.flatten(True). - Сохраните измененный документ.
import aspose.pdf as ap
def flatten_layers(infile: str, outfile: str) -> None:
document = ap.Document(infile)
layers = document.pages[1].layers
if len(layers) == 0:
print("No layers found in the document.")
return
for layer in layers:
layer.flatten(True)
document.save(outfile)
print(f"Layers flattened successfully. File saved at {outfile}")
Объединить все слои в PDF в один
Этот фрагмент кода использует Aspose.PDF для объединения всех слоёв на первой странице PDF в один единый слой с пользовательским именем, используя Page.merge_layers().
- Загрузите PDF-документ.
- Получите доступ к странице 1 и извлеките её слои.
- Проверьте, существуют ли слои.
- Определите новое имя слоя.
- Объедините слои в один.
- Сохраните документ.
import aspose.pdf as ap
def merge_layers(infile: str, outfile: str) -> None:
document = ap.Document(infile)
page = document.pages[1]
if len(page.layers) == 0:
print("No layers found in the document.")
return
new_layer_name = "LayerNew"
page.merge_layers(new_layer_name)
document.save(outfile)
print(f"Layers merged successfully. File saved at {outfile}")