Экспорт математических уравнений из презентаций в PHP
Введение
Aspose.Slides for PHP via Java позволяет экспортировать математические уравнения из презентаций. Например, вам может потребоваться извлечь математические уравнения со слайдов (из конкретной презентации) и использовать их в другой программе или платформе.
Экспорт математических уравнений в LaTeX
Aspose.Slides может преобразовать математическое уравнение PowerPoint напрямую в LaTeX; промежуточный файл MathML и внешний конвертер не требуются. Уравнение хранится в текстовом кадре как MathPortion. Используйте MathPortion::getMathParagraph, чтобы получить MathParagraph, а затем вызовите MathParagraph::toLatex. Метод возвращает строку, которую можно сохранить, отобразить, отправить в другое приложение или далее обработать.
Следующий пример просматривает каждый текстовый кадр на каждом слайде, находит все математические части и записывает каждое уравнение в отдельный файл .tex:
$presentation = new Presentation("equations.pptx");
$arrayClass = new JavaClass("java.lang.reflect.Array");
$mathPortionClass = new JavaClass("com.aspose.slides.MathPortion");
try {
$slideCount = java_values($presentation->getSlides()->size());
for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
$slide = $presentation->getSlides()->get_Item($slideIndex);
$slideNumber = $slideIndex + 1;
$equationNumber = 1;
$textFrames = SlideUtil::getAllTextBoxes($slide);
$textFrameCount = java_values($arrayClass->getLength($textFrames));
for ($textFrameIndex = 0; $textFrameIndex < $textFrameCount; $textFrameIndex++) {
$textFrame = $textFrames[$textFrameIndex];
$paragraphCount = java_values($textFrame->getParagraphs()->getCount());
for ($paragraphIndex = 0; $paragraphIndex < $paragraphCount; $paragraphIndex++) {
$paragraph = $textFrame->getParagraphs()->get_Item($paragraphIndex);
$portionCount = java_values($paragraph->getPortions()->getCount());
for ($portionIndex = 0; $portionIndex < $portionCount; $portionIndex++) {
$portion = $paragraph->getPortions()->get_Item($portionIndex);
if (!java_instanceof($portion, $mathPortionClass)) {
continue;
}
$mathParagraph = $portion->getMathParagraph();
$latexFileName = "slide_" . $slideNumber . "_equation_" . $equationNumber . ".tex";
$latexText = java_values($mathParagraph->toLatex());
file_put_contents($latexFileName, $latexText);
$equationNumber++;
}
}
}
}
} finally {
$presentation->dispose();
}
SlideUtil::getAllTextBoxes возвращает все текстовые кадры, найденные на слайде. Проверка типа MathPortion отделяет настоящие редактируемые уравнения от обычного текста и изображений.
Движки LaTeX и шаблоны документов не всегда поддерживают одинаковые команды, пакеты или символы Unicode. Проверьте полученную строку с помощью LaTeX‑движка, используемого в вашем приложении. Если символ или элемент Office Math не имеет подходящего представления в этой среде, замените его в возвращённой строке на команду, специфичную для проекта, или пропустите уравнение и зафиксируйте проблему для дальнейшего рассмотрения.
Сохранение математических уравнений в формате MathML
Хотя люди легко пишут код для таких форматов уравнений, как LaTeX, им трудно писать код для MathML, поскольку последний предполагает автоматическое генерирование приложениями. Программы легко читают и разбирают MathML, потому что его код находится в XML, поэтому MathML часто используется как формат вывода и печати во многих областях.
Этот пример кода показывает, как экспортировать математическое уравнение из презентации в MathML:
$pres = new Presentation();
try {
$autoShape = $pres->getSlides()->get_Item(0)->getShapes()->addMathShape(0, 0, 500, 50);
$mathParagraph = $autoShape->getTextFrame()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0)->getMathParagraph();
$mathParagraph->add(new MathematicalText("a")->setSuperscript("2")->join("+")->join(new MathematicalText("b")->setSuperscript("2"))->join("=")->join(new MathematicalText("c")->setSuperscript("2")));
$stream = new Java("java.io.FileOutputStream", "mathml.xml");
$mathParagraph->writeAsMathMl($stream);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
Что именно экспортируется в MathML — абзац или отдельный блок формулы?
Вы можете экспортировать как весь математический абзац (MathParagraph), так и отдельный блок MathBlock в MathML. Оба типа предоставляют метод записи в MathML.
Как определить, что объект на слайде является математической формулой, а не обычным текстом или изображением?
Формула находится в MathPortion и имеет MathParagraph. Изображения и обычные текстовые части без MathParagraph не являются экспортируемыми формулами.
Откуда берётся MathML в презентации — это специфично для PowerPoint или стандарт?
Экспорт ориентирован на стандартный MathML (XML). Aspose использует Presentation MathML — подмножество стандарта, широко применяемое в различных приложениях и в вебе.
Поддерживается ли экспорт формул, находящихся в таблицах, SmartArt, группах и т.д.?
Да, если эти объекты содержат текстовые части с MathParagraph (то есть настоящие формулы PowerPoint), они экспортируются. Если формула внедрена как изображение, она не будет экспортирована.
Изменяется ли оригинальная презентация при экспорте в MathML?
Нет. Запись MathML представляет собой сериализацию содержимого формулы; оригинальный файл презентации не изменяется.