Экспортировать слайды презентаций в виде SVG‑изображений на Android
Обзор
SVG — масштабируемый формат изображений на основе XML, который хорошо подходит для веб‑публикаций, просмотрщиков слайдов, сценариев доступности и автоматической пост‑обработки. Aspose.Slides for Android через Java экспортирует каждый слайд в отдельный файл SVG и позволяет контролировать, как записываются текст, шрифты, изображения и элементы SVG.
Используйте SVGOptions когда экспортированный SVG должен быть компактным, предсказуемым в разных браузерах или готовым к интерактивному использованию.
Экспортировать слайд как SVG
Создайте Presentation, выберите слайд и запишите его в поток с помощью ISlide.writeAsSvg. Ниже приведён пример, который экспортирует каждый слайд презентации в отдельный файл SVG.
Presentation presentation = new Presentation("presentation.pptx");
try {
for (ISlide slide : presentation.getSlides()) {
String outputFileName = String.format("slide-%d.svg", slide.getSlideNumber());
try (FileOutputStream svgStream = new FileOutputStream(outputFileName)) {
slide.writeAsSvg(svgStream);
}
}
} finally {
presentation.dispose();
}
Имя файла использует ISlide.getSlideNumber вместо индекса цикла. Вы также можете экспортировать отдельную форму с помощью IShape.writeAsSvg, когда просмотрщику слайдов или веб‑странице требуется только эта форма.
Настроить вывод SVG
SVGOptions управляет рендерингом SVG. Для текстовых рамок SVGOptions.setUseFrameSize включает текстовую рамку в область рендеринга, а SVGOptions.setUseFrameRotation определяет, применяется ли поворот рамки. Установите SVGOptions.setDisableFontLigatures в true, когда текст необходимо отрисовывать без лигатур.
Presentation presentation = new Presentation("presentation.pptx");
try {
SVGOptions svgOptions = new SVGOptions();
svgOptions.setDisableFontLigatures(true);
svgOptions.setUseFrameSize(true);
svgOptions.setUseFrameRotation(false);
ISlide slide = presentation.getSlides().get_Item(0);
try (FileOutputStream svgStream = new FileOutputStream("slide-with-custom-options.svg")) {
slide.writeAsSvg(svgStream, svgOptions);
}
} finally {
presentation.dispose();
}
Управление текстом и шрифтами
Векторизовать весь текст
Установите SVGOptions.setVectorizeText в true, чтобы записать весь текст слайда в виде векторной графики. Это устраняет зависимости от шрифтов и делает визуальный результат более согласованным в разных браузерах, но текст уже нельзя будет выделять или искать как SVG‑текст.
Presentation presentation = new Presentation("presentation.pptx");
try {
SVGOptions svgOptions = new SVGOptions();
svgOptions.setVectorizeText(true);
ISlide slide = presentation.getSlides().get_Item(0);
try (FileOutputStream svgStream = new FileOutputStream("slide-with-vectorized-text.svg")) {
slide.writeAsSvg(svgStream, svgOptions);
}
} finally {
presentation.dispose();
}
Выбор способа обработки внешних шрифтов
SVGOptions.setExternalFontsHandling использует значение SvgExternalFontsHandling для шрифтов, загружаемых извне. Выберите SvgExternalFontsHandling.AddLinksToFontFiles, чтобы ссылаться на отдельные файлы шрифтов, SvgExternalFontsHandling.Embed, чтобы включить данные шрифта в SVG, или SvgExternalFontsHandling.Vectorize, чтобы отрисовывать только текст, использующий внешние шрифты, как графику. Проверьте лицензионные ограничения шрифтов перед их встраиванием.
Presentation presentation = new Presentation("presentation.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
SVGOptions linkedFontsOptions = new SVGOptions();
linkedFontsOptions.setExternalFontsHandling(SvgExternalFontsHandling.AddLinksToFontFiles);
try (FileOutputStream linkedFontsStream = new FileOutputStream("slide-with-font-links.svg")) {
slide.writeAsSvg(linkedFontsStream, linkedFontsOptions);
}
SVGOptions embeddedFontsOptions = new SVGOptions();
embeddedFontsOptions.setExternalFontsHandling(SvgExternalFontsHandling.Embed);
try (FileOutputStream embeddedFontsStream = new FileOutputStream("slide-with-embedded-fonts.svg")) {
slide.writeAsSvg(embeddedFontsStream, embeddedFontsOptions);
}
SVGOptions vectorizedExternalFontsOptions = new SVGOptions();
vectorizedExternalFontsOptions.setExternalFontsHandling(SvgExternalFontsHandling.Vectorize);
try (FileOutputStream vectorizedExternalFontsStream = new FileOutputStream("slide-with-vectorized-external-fonts.svg")) {
slide.writeAsSvg(vectorizedExternalFontsStream, vectorizedExternalFontsOptions);
}
} finally {
presentation.dispose();
}
Уменьшить размер встроенных изображений
Используйте SVGOptions.setPicturesCompression , чтобы уменьшить разрешение встроенных изображений, SVGOptions.setDeletePicturesCroppedAreas , чтобы исключить обрезанные области источника, и SVGOptions.setJpegQuality , чтобы контролировать качество JPEG‑кодирования. Эти параметры уменьшают размер файла за счёт качества изображения или количества сохраняемых данных.
Presentation presentation = new Presentation("presentation.pptx");
try {
SVGOptions svgOptions = new SVGOptions();
svgOptions.setPicturesCompression(PicturesCompression.Dpi150);
svgOptions.setDeletePicturesCroppedAreas(true);
svgOptions.setJpegQuality(80);
ISlide slide = presentation.getSlides().get_Item(0);
try (FileOutputStream svgStream = new FileOutputStream("compressed-slide.svg")) {
slide.writeAsSvg(svgStream, svgOptions);
}
} finally {
presentation.dispose();
}
Назначить стабильные идентификаторы формам и тексту
Используйте ISvgShapeFormattingController, чтобы установить ISvgShape.setId для каждой формы SVG. Чтобы также задать значения ISvgTSpan.setId у элементов текста tspan, реализуйте ISvgShapeAndTextFormattingController. Примените любой из контроллеров с помощью SVGOptions.setShapeFormattingController.
Следующий контроллер использует IShape.getOfficeInteropShapeId, который остаётся стабильным в течение жизни формы, и повторяемый счётчик для её текстовых спанов. Это делает сгенерированные идентификаторы пригодными для пост‑обработки неизменённой презентации.
class StableSvgIdController implements ISvgShapeAndTextFormattingController {
private String currentShapeId = "";
private int textSpanIndex;
public void formatShape(ISvgShape svgShape, IShape shape) {
currentShapeId = String.format("shape-%d", shape.getOfficeInteropShapeId());
textSpanIndex = 0;
svgShape.setId(currentShapeId);
}
public void formatText(ISvgTSpan svgTSpan, IPortion portion, ITextFrame textFrame) {
svgTSpan.setId(String.format("%s-text-%d", currentShapeId, textSpanIndex++));
}
}
Presentation presentation = new Presentation("presentation.pptx");
try {
SVGOptions svgOptions = new SVGOptions();
svgOptions.setShapeFormattingController(new StableSvgIdController());
ISlide slide = presentation.getSlides().get_Item(0);
try (FileOutputStream svgStream = new FileOutputStream("slide-with-stable-ids.svg")) {
slide.writeAsSvg(svgStream, svgOptions);
}
} finally {
presentation.dispose();
}
Добавить обработчики событий SVG
В ISvgShapeFormattingController вызовите ISvgShape.setEventHandler с параметром SvgEvent, чтобы добавить JavaScript‑обработчик события к экспортированной форме. Примените контроллер с помощью SVGOptions.setShapeFormattingController и определите JavaScript‑функцию на странице или в документе SVG, который содержит результат.
class SvgEventController implements ISvgShapeFormattingController {
public void formatShape(ISvgShape svgShape, IShape shape) {
if ("ActionButton".equals(shape.getName())) {
svgShape.setId("action-button");
svgShape.setEventHandler(SvgEvent.OnClick, "handleShapeClick(event)");
}
}
}
Presentation presentation = new Presentation("presentation.pptx");
try {
SVGOptions svgOptions = new SVGOptions();
svgOptions.setShapeFormattingController(new SvgEventController());
ISlide slide = presentation.getSlides().get_Item(0);
try (FileOutputStream svgStream = new FileOutputStream("interactive-slide.svg")) {
slide.writeAsSvg(svgStream, svgOptions);
}
} finally {
presentation.dispose();
}
Хост‑страница может определить JavaScript‑функцию, на которую ссылается обработчик. Назначение идентификаторов и обработчиков событий позволяет использовать просмотрщики слайдов, улучшать доступность и реализовывать другие интерактивные сценарии SVG.
FAQ
Когда следует использовать SVGOptions.setVectorizeText вместо SvgExternalFontsHandling.Vectorize?
Используйте SVGOptions.setVectorizeText, когда весь текст должен быть независим от шрифтов. Используйте SvgExternalFontsHandling.Vectorize, когда только текст, использующий внешние шрифты, должен быть преобразован в графику.
Какой лучший способ уменьшить размер SVG?
Начните с сжатия встроенных изображений, удаления обрезанных областей изображений и выбора ссылок на файлы шрифтов, если целевая среда может их обслуживать. Проверьте результат, поскольку уменьшение разрешения изображений, снижение качества JPEG и векторизация текста имеют разные компромиссы между качеством и размером.
Могу ли я изменять экспортированные элементы SVG после экспорта?
Да. Назначьте идентификаторы через контроллер форматирования, а затем выберите соответствующие элементы SVG в вашем инструменте пост‑обработки или скрипте браузера.