Получить границы абзаца из презентаций в PHP
Обзор
Эта статья объясняет, как получить границы, размер и координаты абзацев в Aspose.Slides. Она показывает, как получить прямоугольник абзаца из TextFrame с помощью Paragraph::getRect, как получить координаты абзаца внутри текстового кадра ячейки таблицы и выделяет важные детали, такие как единицы измерения, влияние переноса текста на границы, преобразование в пиксели и эффективные значения форматирования абзаца.
Получить прямоугольные координаты абзаца
Используйте Paragraph::getRect для получения ограничивающего прямоугольника абзаца.
$presentation = new Presentation("Shapes.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$paragraph = $shape->getTextFrame()->getParagraphs()->get_Item(0);
$rectangle = $paragraph->getRect();
} finally {
$presentation->dispose();
}
Получить размер абзаца внутри текстового кадра ячейки таблицы
Чтобы получить размер и координаты Paragraph в текстовом кадре ячейки таблицы, используйте Paragraph::getRect. Возвращаемый прямоугольник относится к текстовому кадру ячейки таблицы, поэтому добавляйте позицию таблицы и смещение ячейки, когда нужны координаты уровня слайда.
Следующий пример получает границы абзаца внутри ячейки таблицы и рисует прямоугольники на слайде для визуализации этих границ:
$presentation = new Presentation("source.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = $slide->getShapes()->get_Item(0);
$cell = $table->getRows()->get_Item(1)->get_Item(1);
$cellX = java_values($table->getX()) + java_values($cell->getOffsetX());
$cellY = java_values($table->getY()) + java_values($cell->getOffsetY());
foreach ($cell->getTextFrame()->getParagraphs() as $paragraph) {
if ($paragraph->getText() == "") {
continue;
}
$paragraphRectangle = $paragraph->getRect();
$paragraphRectangleX = java_values($paragraphRectangle->getX()) + $cellX;
$paragraphRectangleY = java_values($paragraphRectangle->getY()) + $cellY;
$paragraphRectangleWidth = java_values($paragraphRectangle->getWidth());
$paragraphRectangleHeight = java_values($paragraphRectangle->getHeight());
$paragraphBoundsShape = $slide->getShapes()->addAutoShape(
ShapeType::Rectangle,
$paragraphRectangleX,
$paragraphRectangleY,
$paragraphRectangleWidth,
$paragraphRectangleHeight
);
$paragraphBoundsShape->getFillFormat()->setFillType(FillType::NoFill);
$paragraphBoundsShape->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->YELLOW);
$paragraphBoundsShape->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
}
$presentation->save("output.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Часто задаваемые вопросы
В каких единицах измеряются координаты абзаца?
Они измеряются в пунктах, где 1 дюйм равен 72 пунктам. Это относится ко всем координатам и размерам на слайде.
Влияет ли перенос слов на границы абзаца?
Да. Если для TextFrame включен TextFrameFormat::setWrapText, текст переносится, чтобы соответствовать ширине области, что изменяет фактические границы абзаца.
Можно ли надёжно преобразовать координаты абзаца в пиксели при экспорте изображения?
Да. Преобразуйте пункты в пиксели по формуле: пиксели = пункты × (DPI / 72). Результат зависит от выбранного DPI для рендеринга или экспорта.
Как получить «эффективные» параметры форматирования абзаца с учётом наследования стилей?
Используйте effective paragraph formatting data structure; он возвращает окончательные объединённые значения отступов, интервалов, переносов, RTL и других параметров.