需求要求
读取pptx保存到md
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为"Poor Obfuscation Implementation"的首字母缩写,意为"可怜的模糊实现"。
环境
java8
maven
创建一个maven项目
在这里插入图片描述使用apache接口
https://search.maven.org/artifact/org.lucee/poi/4.1.0/bundle
在这里插入图片描述在pom.xml加入接口
在这里插入图片描述可以类导入apache.poi.xslf
PPTXUtils.java
下面代码有些来源官网
package com.geekbang.ppttools;
// 导入org.apache.poi接口
import com.google.common.base.Splitter;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.io.File;
import java.io.FileInputStream;
public class PPTXUtils {
public static String getToc(File file) throws Exception {
//创建一个新的空幻灯片
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));
// 拼接字符串
StringBuilder ret = new StringBuilder();
// 第一张幻灯片
XSLFSlide slide = ppt.getSlides().get(0);
int currCha = -1;
int count = 1;
String title = null;
boolean firstLine = true;
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFTextShape) {
XSLFTextShape textShape = (XSLFTextShape) shape;
String text = textShape.getText();
try {
currCha = Integer.parseInt(text);
if (currCha >= 0 && title != null) {
ret.append("# ").append(currCha).append('.').append(title).append('\n');
}
continue;
} catch (Exception ex) {
}
for (String line : Splitter.on("\n").omitEmptyStrings().trimResults().split(text)) {
if (firstLine) {
title = line;
firstLine = false;
} else {
ret.append(count).append(". ").append(line).append('\n');
count++;
}
}
}
}
return ret.toString();
}
}
TOCGen.java
// 编译class对应的target路径
package com.geekbang.ppttools;
// 导入读取文件的模块
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
// 编码
import java.nio.charset.StandardCharsets;
public class TOCGen {
public static void main(String[] args) throws Exception {
// toc 所在pptx的路径
String toc = genTocFromPPTX("D:\\学习资料\\极客时间\\java\\LetsJava\\第六章 Java 编程实战\\06. 一个从 pptx 文件中抽取文字的小工具\\code\\src\\main\\resources\\ppts");
// new输出一个toc.md 编码utf-8的PrintWriter对象pw
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("toc.md"), StandardCharsets.UTF_8));
pw.println(toc);
pw.flush();
pw.close();
System.out.println("读取完成");
}
// 定义genTocFromPPTX方法 s 参数pptx的路径
private static String genTocFromPPTX(String s) throws Exception {
File rootDir = new File(s);
// new一个StringBuilder
StringBuilder ret = new StringBuilder("# 0.自我介绍\n\n");
// 遍历路径的pptx
for (File pptx : rootDir.listFiles()) {
if (isThePPT(pptx)) {
// 调用PPTXUtils类的getToc方法
ret.append('\n').append(PPTXUtils.getToc(pptx)).append('\n');
}
}
return ret.toString();
}
// 定义isThePPT方法
private static boolean isThePPT(File pptx) {
String pptxName = pptx.getName();
if (!pptxName.endsWith("pptx")) {
return false;
}
for (char ch : pptxName.substring(0, pptxName.indexOf('.')).toCharArray()) {
if (!Character.isDigit(ch)) {
return false;
}
}
return true;
}
}
代码链接:
https://github.com/geektime-geekbang/LetsJava