Converter apresentações PowerPoint para Markdown em Java
Visão geral
Aspose.Slides for Java pode converter apresentações PPT e PPTX para Markdown para documentação, sites estáticos, migração de conteúdo e fluxos de trabalho de controle de versão. Você pode escolher um sabor de Markdown, controlar como o conteúdo dos slides é renderizado e decidir onde as imagens exportadas são armazenadas e como o Markdown gerado as referencia.
Por padrão, a exportação para Markdown usa saída somente de texto. Para exportar conteúdo visual, defina o tipo de exportação com o método MarkdownSaveOptions.setExportType para o valor Sequential ou Visual da enumeração MarkdownExportType. Sequential renderiza os itens dos slides separadamente e em ordem, enquanto Visual mantém os itens agrupados juntos para preservar sua relação visual. O valor TextOnly não gera recursos de imagem, portanto os callbacks de salvamento de imagem não são invocados nesse modo.
Converter uma apresentação para Markdown
Carregue o arquivo de origem com a classe Presentation, e então chame o método Presentation.save com o valor Md da enumeração SaveFormat.
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
Presentation presentation = new Presentation("presentation.pptx");
try {
presentation.save("presentation.md", SaveFormat.Md);
} finally {
presentation.dispose();
}
Selecionar um sabor de Markdown
O método MarkdownSaveOptions.setFlavor controla a especificação de Markdown usada para a saída. A enumeração Flavor inclui CommonMark, GitHub Flavored Markdown e outras variantes suportadas.
O exemplo a seguir exporta uma apresentação como CommonMark:
import com.aspose.slides.Flavor;
import com.aspose.slides.MarkdownSaveOptions;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
Presentation presentation = new Presentation("presentation.pptx");
try {
MarkdownSaveOptions options = new MarkdownSaveOptions();
options.setFlavor(Flavor.CommonMark);
presentation.save("presentation.md", SaveFormat.Md, options);
} finally {
presentation.dispose();
}
Exportar imagens usando o comportamento padrão de salvamento local
A classe MarkdownSaveOptions fornece dois métodos para configurar imagens salvas localmente:
- setBasePath especifica o diretório base para o documento Markdown e seus recursos.
- setImagesSaveFolderName especifica o subdiretório de imagens. Seu valor padrão é
Images.
O exemplo a seguir renderiza conteúdo visual, grava imagens em output/assets e cria referências de imagem relativas no documento Markdown:
import com.aspose.slides.MarkdownExportType;
import com.aspose.slides.MarkdownSaveOptions;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Path outputDirectory = Paths.get("output");
Files.createDirectories(outputDirectory);
Presentation presentation = new Presentation("presentation.pptx");
try {
MarkdownSaveOptions options = new MarkdownSaveOptions();
options.setExportType(MarkdownExportType.Visual);
options.setBasePath(outputDirectory.toString());
options.setImagesSaveFolderName("assets");
Path markdownPath = outputDirectory.resolve("presentation.md");
presentation.save(markdownPath.toString(), SaveFormat.Md, options);
} finally {
presentation.dispose();
}
Esse comportamento também serve como fallback quando um manipulador de salvamento de imagem personalizado retorna false.
Personalizar o salvamento de imagens e links Markdown
Use o método MarkdownSaveOptions.setImageSaving para registrar um callback para recursos bitmap e metafile não‑SVG emitidos durante a exportação para Markdown. Seu callback MarkdownImageSavingHandler recebe o objeto IImage, seu valor ImageFormat e o link Markdown gerado como um parâmetro String[] de um elemento. Salve ou faça upload da imagem com o formato fornecido e substitua link[0] pela referência que deve aparecer na saída Markdown.
Recursos emitidos em formato SVG são tratados separadamente. Registre um callback com o método MarkdownSaveOptions.setSvgImageSaving. Seu callback MarkdownSvgImageSavingHandler recebe um objeto ISvgImage e o parâmetro String[] link de um elemento. Um SVG não possui argumento ImageFormat; escreva ou faça upload de seus dados XML a partir do método ISvgImage.getSvgData em vez disso. Dependendo do modo de exportação e do agrupamento visual, um SVG na apresentação fonte pode ser rasterizado ou combinado com outro conteúdo; o recurso não‑SVG resultante é então passado ao callback de salvamento de imagem. Registre ambos os callbacks quando cada recurso visual exportado exigir processamento personalizado.
O valor de retorno do manipulador determina quem processa a imagem:
- Retorne
truedepois que o manipulador tiver salvo, feito upload, transformado ou processado a imagem de alguma forma e atribuído um valor válido alink[0]. Aspose.Slides grava esse valor no documento Markdown e não realiza a gravação local padrão. - Retorne
falsepara que Aspose.Slides salve a imagem localmente e gere seu link de acordo com os valores definidos por MarkdownSaveOptions.setBasePath e MarkdownSaveOptions.setImagesSaveFolderName.
Importante
Um manipulador que retornatrue assume a responsabilidade pela imagem. Se ele retornar true sem atribuir um link válido e não vazio, a exportação falhará com uma InvalidOperationException.
Salvar imagens em um diretório de origem CDN e usar URLs externas
O exemplo a seguir trata cdn-origin/presentations/quarterly-report como um diretório de origem CDN montado ou sincronizado. Cada manipulador extrai o nome de arquivo gerado, salva a imagem nesse diretório personalizado e substitui a referência local gerada por uma URL pública de CDN. O exemplo em si não realiza upload de rede: a URL só se torna válida após o diretório ser montado como origem CDN ou seus arquivos serem publicados no CDN. Para armazenamento de objetos, substitua a gravação no sistema de arquivos pela operação de upload do SDK de armazenamento e atribua link[0] somente após o upload ser concluído.
import com.aspose.slides.MarkdownExportType;
import com.aspose.slides.MarkdownSaveOptions;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Function;
Path outputDirectory = Paths.get("output");
String publicBaseUrl = "https://cdn.example.com/presentations/quarterly-report";
Path storageDirectory = Paths.get("cdn-origin", "presentations", "quarterly-report");
Files.createDirectories(outputDirectory);
Files.createDirectories(storageDirectory);
Function<String, String> getFileNameFromLink = generatedLink -> {
String urlCompatibleLink = generatedLink.replace('\\', '/');
return urlCompatibleLink.substring(urlCompatibleLink.lastIndexOf('/') + 1);
};
Function<String, String> buildPublicUrl = fileName -> {
try {
String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20");
return publicBaseUrl + "/" + encodedFileName;
} catch (UnsupportedEncodingException exception) {
System.err.println("Could not encode the image file name: " + exception.getMessage());
return null;
}
};
Presentation presentation = new Presentation("presentation.pptx");
try {
MarkdownSaveOptions options = new MarkdownSaveOptions();
options.setExportType(MarkdownExportType.Visual);
options.setBasePath(outputDirectory.toString());
options.setImagesSaveFolderName("fallback-images");
options.setImageSaving((image, format, link) -> {
if (image.getWidth() < 128 || image.getHeight() < 128) {
return false;
}
String fileName = getFileNameFromLink.apply(link[0]);
String publicUrl = buildPublicUrl.apply(fileName);
if (publicUrl == null) {
return false;
}
Path storagePath = storageDirectory.resolve(fileName);
image.save(storagePath.toString(), format);
link[0] = publicUrl;
return true;
});
options.setSvgImageSaving((svgImage, link) -> {
String fileName = getFileNameFromLink.apply(link[0]);
String publicUrl = buildPublicUrl.apply(fileName);
if (publicUrl == null) {
return false;
}
Path storagePath = storageDirectory.resolve(fileName);
try {
Files.write(storagePath, svgImage.getSvgData());
} catch (IOException exception) {
System.err.println("Could not save the SVG image: " + exception.getMessage());
return false;
}
link[0] = publicUrl;
return true;
});
Path markdownPath = outputDirectory.resolve("presentation.md");
presentation.save(markdownPath.toString(), SaveFormat.Md, options);
} finally {
presentation.dispose();
}
O manipulador de bitmap retorna deliberadamente false para imagens menores que 128 × 128 pixels, de modo que Aspose.Slides salva essas imagens em output/fallback-images usando o comportamento padrão. Recursos bitmap e metafile maiores, bem como recursos SVG, são tratados pelo código personalizado. Por exemplo, uma referência local gerada como fallback-images/image1.png passa a ser https://cdn.example.com/presentations/quarterly-report/image1.png. Os manipuladores usam caminhos do sistema operacional apenas ao gravar arquivos; os links gravados no Markdown utilizam barras (/) e nomes de arquivo escapados em URL. Aplique a mesma regra ao construir links relativos: use /, não o separador de diretório específico da plataforma.
FAQ
Um manipulador pode processar tanto imagens raster quanto imagens SVG?
Não. Use MarkdownSaveOptions.setImageSaving para recursos bitmap e metafile emitidos e MarkdownSaveOptions.setSvgImageSaving para recursos emitidos como SVG. O primeiro fornece um objeto IImage e um valor ImageFormat; o segundo fornece um objeto ISvgImage cujo dado SVG pode ser lido com ISvgImage.getSvgData. Um SVG fonte que é rasterizado durante a exportação é processado pelo callback de salvamento de imagem em vez disso.
O que acontece quando um manipulador de salvamento de imagem retorna false?
Aspose.Slides usa seu comportamento padrão de salvamento local. A localização da imagem e a referência gerada são controladas pelos valores definidos com MarkdownSaveOptions.setBasePath e MarkdownSaveOptions.setImagesSaveFolderName.
Um manipulador pode fornecer uma URL sem salvar a imagem localmente?
Sim. O manipulador pode fazer upload da imagem para armazenamento de objetos ou passá‑la a outro serviço, atribuir a URL resultante a link[0] e retornar true. O manipulador deve concluir o processamento por conta própria; retornar true impede o salvamento local padrão.
Por que a exportação para Markdown lança uma InvalidOperationException a partir de um manipulador?
Essa exceção ocorre quando o manipulador retorna true mas não fornece um link válido. Atribua o caminho relativo ou a URL externa que deve ser gravado no Markdown antes de retornar true.
Qual separador de caminho os links de imagem devem usar?
Use barras (/) nos links Markdown e URLs. Use Path.resolve apenas para caminhos do sistema de arquivos e, em seguida, construa ou normalize a referência Markdown separadamente.
Os hyperlinks são preservados durante a exportação para Markdown?
Os hiperlinks de texto são preservados como links Markdown padrão. As transições de slide e as animações não são convertidas.
Apresentações podem ser convertidas para Markdown em paralelo?
Você pode processar diferentes arquivos de apresentação em paralelo, mas não compartilhe a mesma instância de Presentation entre threads. Siga as diretrizes de multithreading e use uma instância separada para cada arquivo.