使用poi处理ppt 转为图片乱码问题解决


public int test(String source) {
FileInputStream is;
try {
is = new FileInputStream(source);
SlideShow ppt = new SlideShow(is);
is.close();
Slide[] slides = ppt.getSlides();
for (int i = 0; i < slides.length; i++) {
TextRun[] truns = slides[i].getTextRuns();
for ( int k=0;k<truns.length;k++){
RichTextRun[] rtruns = truns[k].getRichTextRuns();
for(int l=0;l<rtruns.length;l++){
int index = rtruns[l].getFontIndex();
String name = rtruns[l].getFontName();
rtruns[l].setFontIndex(1);
rtruns[l].setFontName("宋体");
}
}
Dimension pgsize = ppt.getPageSize();
BufferedImage img = new BufferedImage(pgsize.width,
pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
// clear the drawing area
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,
pgsize.height));

// render
slides[i].draw(graphics);

// save the output
FileOutputStream out = new FileOutputStream(
"e:\\pic\\test\\slide-" + (i + 1) + ".png");
javax.imageio.ImageIO.write(img, "png", out);
out.close();
}

} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

其实就是字符问题,中文字符和西洋字符不能混用。这里把文本都改成了中文字符。
您可以使用Apache POI来替换PPT中的图片。以下是基本的步骤: 1. 使用`XMLSlideShow`类加载PPT文件。 2. 获取`XSLFSlide`对象,该对象代表PPT中的幻灯片。 3. 获取`XSLFPictureShape`对象,该对象代表PPT中的图片。 4. 使用`PictureData`类加载新的图片文件。 5. 调用`XSLFPictureShape`对象的`resize()`方法,将图片的大小调整为原始图片的大小。 6. 调用`XSLFPictureShape`对象的`setPictureData()`方法,将新图片数据设置为该对象的图片数据。 7. 保存PPT文件。 以下是示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.sl.usermodel.PictureData; import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFPictureShape; import org.apache.poi.xslf.usermodel.XSLFSlide; public class ReplacePPTImage { public static void main(String[] args) throws IOException { // 加载PPT文件 XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("example.pptx")); // 获取第一个幻灯片 XSLFSlide slide = ppt.getSlides().get(0); // 获取第一个图片 XSLFPictureShape picture = (XSLFPictureShape) slide.getShapes().get(0); // 加载新图片文件 File newImageFile = new File("newimage.jpg"); FileInputStream fis = new FileInputStream(newImageFile); byte[] newData = new byte[(int) newImageFile.length()]; fis.read(newData); fis.close(); // 调整图片大小 PictureData oldData = picture.getPictureData(); picture.resize(); picture.setPictureData(newData); // 保存PPT文件 FileOutputStream out = new FileOutputStream("example_new.pptx"); ppt.write(out); out.close(); } } ``` 请注意,上面的代码仅替换了第一张幻灯片上的第一张图片。如果您需要替换多个幻灯片上的多个图片,请使用循环来遍历所有幻灯片和所有图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值