我希望将pptx转换为md时,将pptx的所有图片上传到远端服务器,但是我不希望图片直接落盘,因此我才用了如下的方式:
1、遍历所有的shape,找到所有的图片,下载并上传到我的服务器
2、删除图片shape,并在原位置插入图片的url(markdown格式)
但是这样转换,会导致我插入的文本被转义,导致md无法正确识别图片,有什么解决办法么?
或者有没有现场的更好的实践方案?
var pres = new Presentation(String.valueOf(Paths.get(prePath, "test_complex.pptx")));
Map<IShape, String> shapeUrlMap = new HashMap<>();
for (var slide : pres.getSlides()) {
for (var shape : slide.getShapes()) {
if (shape instanceof IPictureFrame) {
// 取图片二进制、上传到服务器
IPictureFrame picShape = (IPictureFrame) shape;
byte[] imageBytes = picShape.getPictureFormat().getPicture().getImage().getBinaryData();
// String imageUrl = uploadImageToRemote(imageBytes); // 自定义上传
String imageUrl = "1111.png";
shapeUrlMap.put(shape, imageUrl);
}
}
}
for (Map.Entry<IShape, String> entry : shapeUrlMap.entrySet()) {
IShape shape = entry.getKey();
IBaseSlide slide = shape.getSlide();
String imageUrl = entry.getValue();
// 删除原图片 shape
slide.getShapes().remove(shape);
// 插入新的 shape(文本框)——内容为 Markdown 图片语法
IAutoShape newTextShape = slide.getShapes().addAutoShape(ShapeType.Rectangle,
shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight());
newTextShape.getTextFrame().setText("");
}
<groupId>com.aspose</groupId>
<artifactId>aspose-slides</artifactId>
<version>24.8</version>
@Endergarten
在将PPTX转换为Markdown时,如果您希望上传所有图片到远端服务器并避免文本被转义,可以考虑以下方法:
-
上传图片:您已经在代码中实现了遍历所有形状并上传图片的逻辑,这是正确的做法。
-
避免文本转义:在插入Markdown格式的图片链接时,确保使用正确的Markdown语法。您可以使用newTextShape.getTextFrame().setText("");。如果文本仍然被转义,您可以在插入文本之前清理文本框的内容,确保没有多余的字符。
-
示例代码:
// 删除原图片 shape
slide.getShapes().remove(shape);
// 插入新的 shape(文本框)——内容为 Markdown 图片语法
IAutoShape newTextShape = slide.getShapes().addAutoShape(ShapeType.Rectangle,
shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight());
newTextShape.getTextFrame().setText("");
-
其他建议:如果问题依然存在,您可以考虑在转换过程中使用一个中间格式(如HTML),然后再将其转换为Markdown,这样可以更好地控制文本和图片的格式。
希望这些建议能帮助您解决问题!如果您有其他问题,请随时询问。
@Endergarten,
感谢您提交需求。很遗憾,我无法使用 Aspose.Slides 达到预期结果。
我们已在内部问题跟踪系统中创建以下新工单,并将按照 Free Support Policies 中提到的条款交付相应修复。
Issue ID(s): SLIDESJAVA-39720
如果您需要优先级支持,您可以获取 Paid Support Services,并可直接访问我们的付费支持管理团队。
The issues you found earlier (filed as SLIDESJAVA-39720) have been resolved in Aspose.Slides for Java 25.11 (Maven, JAR).
You can check all fixes on the Release Notes page.
You can also find the latest version of our library on the Product Download page.
@Endergarten,
在 Aspose.Slides for Java 25.11 中,向 MarkdownSaveOptions 类添加了两个新事件,使您可以在导出为 Markdown 时拦截图像保存操作。这些事件为图像如何保存以及在生成的 Markdown 输出中如何写入其链接提供了细粒度控制:
MarkdownSaveOptions.setImageSaving – 针对每个非 SVG 图像(位图或 EMF/WMF 等图元文件)触发。允许重写默认的保存行为,并指定自定义链接(相对路径、绝对路径或外部 URL)。
MarkdownSaveOptions.setSvgImageSaving – 针对每个 SVG 图像触发。允许手动保存 SVG 数据并定义自定义的 Markdown 链接。
如果这两个事件都未被处理,或者处理程序返回 false,则导出器会执行其默认行为:在本地保存图像并写入相对的 Markdown 链接。
MarkdownSaveOptions options = new MarkdownSaveOptions();
options.setImagesSaveFolderName("Images");
options.setExportType(MarkdownExportType.Visual);
options.setImageSaving((image, format, link) ->
{
String imagesDir = "ExportedImages/";
String fileName = "Image_" + UUID.randomUUID() +
(format == ImageFormat.Png ? ".png" : ".jpg");
link[0] = imagesDir + fileName;
image.save(link[0], format);
return true;
});
options.setSvgImageSaving((svgImage, link) ->
{
String imagesDir = "ExportedImages/";
String fileName = "Svg_" + UUID.randomUUID() + ".svg";
link[0] = imagesDir + fileName;
try {
FileOutputStream f = new FileOutputStream(link[0]);
f.write(svgImage.getSvgData());
f.close();
} catch (IOException e) {}
return true;
});
Presentation presentation = new Presentation("demo.pptx");
try {
presentation.save("output.md", SaveFormat.Md, options);
} finally {
if (presentation != null) presentation.dispose();
}
1 Like