Работа с векторной графикой в Python
Aspose.PDF for Python via .NET предоставляет класс GraphicsAbsorber для доступа к векторной графике, уже присутствующей на странице PDF, и управления ею. Вызовите его метод visit для любой страницы, чтобы извлечь контуры, фигуры и другие графические операторы, а затем при необходимости переместить, удалить или скопировать эти элементы.
Используйте эту страницу, когда нужно проверить или изменить векторные элементы рисования, встроенные в существующий PDF, а не рисовать новые фигуры с нуля.
Извлечение графики
Извлечение является начальной точкой для всех задач с векторной графикой. GraphicsAbsorber считывает поток содержимого страницы и предоставляет каждый графический элемент вместе со ссылкой на страницу, позицией и исходными операторами.
- Откройте PDF-документ.
- Создайте экземпляр GraphicsAbsorber.
- Вызовите
visitдля целевой страницы, чтобы заполнитьelements. - Переберите
elements, чтобы проверить позицию и количество операторов.
import aspose.pdf as ap
import sys
from os import path
def using_graphics_absorber(infile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page = document.pages[1]
graphics_absorber.visit(page)
for element in graphics_absorber.elements:
print(f"Page Number: {element.source_page.number}")
print(f"Position: ({element.position.x}, {element.position.y})")
print(f"Number of Operators: {element.operators.length}")
GraphicsAbsorber является частью пространства имен aspose.pdf.vector и специально предназначен для взаимодействия с векторной графикой в потоках содержимого PDF.
Перемещение графики
После извлечения задайте новое значение position для каждого элемента, чтобы переместить его на той же странице. Оберните обновления в вызовы suppress_update / resume_update, чтобы объединить запись в поток содержимого в одну операцию и избежать лишней перерисовки.
- Откройте PDF-документ.
- Создайте
GraphicsAbsorberи вызовитеvisitдля целевой страницы. - Вызовите
suppress_update, чтобы приостановить запись в поток содержимого. - Обновите
positionкаждого элемента. - Вызовите
resume_update, чтобы применить все изменения сразу. - Сохраните измененный документ.
import aspose.pdf as ap
import sys
from os import path
def move_graphics(infile: str, outfile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page = document.pages[1]
graphics_absorber.visit(page)
graphics_absorber.suppress_update()
for element in graphics_absorber.elements:
position = element.position
element.position = ap.Point(position.x + 150, position.y - 10)
graphics_absorber.resume_update()
document.save(outfile)
Удаление графики
Чтобы удалить определенные векторные элементы со страницы, отфильтруйте их по позиции или ограничивающему прямоугольнику, а затем удалите. Aspose.PDF for Python предоставляет два подхода в зависимости от того, нужно ли удалять элементы прямо в цикле или сначала собрать их.
Метод 1: Удаление в цикле с помощью границы прямоугольника
Этот подход проверяет позицию каждого элемента относительно прямоугольника и вызывает element.remove() непосредственно внутри цикла. Используйте его, когда нужен краткий код и не требуется дополнительно проверять набор удаленных элементов.
- Откройте PDF-документ.
- Создайте
GraphicsAbsorberи вызовитеvisitдля целевой страницы. - Задайте целевой Rectangle.
- Вызовите
suppress_update, чтобы приостановить запись в поток содержимого. - Переберите
elements, вызываяremove()для каждого элемента, позиция которого находится внутри прямоугольника. - Вызовите
resume_update, чтобы применить удаления. - Сохраните измененный документ.
import aspose.pdf as ap
import sys
from os import path
def remove_graphics_method_1(infile: str, outfile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page = document.pages[1]
graphics_absorber.visit(page)
rectangle = ap.Rectangle(70, 248, 170, 252, True)
graphics_absorber.suppress_update()
for element in graphics_absorber.elements:
if rectangle.contains(element.position, False):
element.remove()
graphics_absorber.resume_update()
document.save(outfile)
Метод 2: Сбор элементов перед удалением
Этот подход собирает подходящие элементы в GraphicElementCollection и передает коллекцию в page.delete_graphics. Используйте его, когда нужно просмотреть или записать в журнал элементы, которые будут удалены, перед применением удаления.
- Откройте PDF-документ.
- Создайте
GraphicsAbsorberи вызовитеvisitдля целевой страницы. - Задайте целевой прямоугольник.
- Переберите
elementsи добавьте подходящие элементы вGraphicElementCollection. - Вызовите
page.contents.suppress_update, чтобы приостановить запись в поток содержимого. - Вызовите
page.delete_graphicsс коллекцией. - Вызовите
page.contents.resume_update, чтобы применить удаления. - Сохраните измененный документ.
import aspose.pdf as ap
import sys
from os import path
def remove_graphics_method_2(infile: str, outfile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page = document.pages[1]
rectangle = ap.Rectangle(70, 248, 170, 252, True)
graphics_absorber.visit(page)
removed_elements_collection = ap.vector.GraphicElementCollection()
for element in graphics_absorber.elements:
if rectangle.contains(element.position, False):
removed_elements_collection.add(element)
page.contents.suppress_update()
page.delete_graphics(removed_elements_collection)
page.contents.resume_update()
document.save(outfile)
Добавление графики на другую страницу
Векторные элементы, извлеченные с одной страницы, можно разместить на любой другой странице того же документа. Доступны два метода: добавление элементов по одному или передача всей коллекции одним вызовом.
Метод 1: Добавление элементов по отдельности
Используйте этот метод, когда нужен контроль над каждым элементом, например фильтрация или преобразование отдельных элементов перед размещением на целевой странице.
- Откройте PDF-документ.
- Создайте
GraphicsAbsorberи вызовитеvisitдля исходной страницы. - Добавьте новую целевую страницу в документ.
- Вызовите
page_2.contents.suppress_update, чтобы приостановить запись в поток содержимого. - Вызовите
element.add_on_page(page_2)для каждого элемента. - Вызовите
page_2.contents.resume_update, чтобы применить все добавления. - Сохраните измененный документ.
import aspose.pdf as ap
import sys
from os import path
def add_to_another_page_method_1(infile: str, outfile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page_1 = document.pages[1]
page_2 = document.pages.add()
graphics_absorber.visit(page_1)
page_2.contents.suppress_update()
for element in graphics_absorber.elements:
element.add_on_page(page_2)
page_2.contents.resume_update()
document.save(outfile)
Метод 2: Добавление всей коллекции сразу
Используйте этот метод, когда нужно скопировать все извлеченные элементы на страницу одной операцией без ручного перебора.
- Откройте PDF-документ.
- Создайте
GraphicsAbsorberи вызовитеvisitдля исходной страницы. - Добавьте новую целевую страницу в документ.
- Вызовите
page_2.contents.suppress_update, чтобы приостановить запись в поток содержимого. - Вызовите
page_2.add_graphicsсо всей коллекциейelements. - Вызовите
page_2.contents.resume_update, чтобы применить все добавления. - Сохраните измененный документ.
import aspose.pdf as ap
import sys
from os import path
def add_to_another_page_method_2(infile: str, outfile: str):
with ap.Document(infile) as document:
with ap.vector.GraphicsAbsorber() as graphics_absorber:
page_1 = document.pages[1]
page_2 = document.pages.add()
graphics_absorber.visit(page_1)
page_2.contents.suppress_update()
page_2.add_graphics(graphics_absorber.elements, None)
page_2.contents.resume_update()
document.save(outfile)