PDF 转图片
package com.mashang.document;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.apache.pdfbox.io.IOUtils.toByteArray;
public class PDF {
public static void main(String[] args) {
File file = new File("文件地址");
PDFConvert(file);
}
static void PDFConvert(File src) {
try {
FileInputStream fileInputStream = new FileInputStream(src);
byte[] data = toByteArray(fileInputStream);
fileInputStream.close();
List<byte[]> images = pdfToImage(data);
int i = 1;
for (byte[] image : images) {
//将每一个byte转为图片
byte2image(image,"D:\document\image\"+i++ +".png");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void byte2image(byte[] data,String path){
if(data.length<3||path.equals("")) return;
try{
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
imageOutput.write(data, 0, data.length);
imageOutput.close();
System.out.println("Make Picture success,Please find image in " + path);
} catch(Exception ex) {
System.out.println("Exception: " + ex);
ex.printStackTrace();
}
}
/**
* dpi越大转换后越清晰,相对转换速度越慢
*/
private static final Integer DPI = 100;
/**
* 转换后的图片类型
*/
private static final String IMG_TYPE = "png";
/**
* PDF转图片
*
* @param fileContent PDF文件的二进制流
* @return 图片文件的二进制流
*/
public static List<byte[]> pdfToImage(byte[] fileContent) throws IOException {
List<byte[]> result = new ArrayList<>();
try (PDDocument document = PDDocument.load(fileContent)) {
PDFRenderer renderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); ++i) {
BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, IMG_TYPE, out);
result.add(out.toByteArray());
}
}
return result;
}
}
PPT 转图片
package com.mashang.document;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.xslf.usermodel.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class PPT {
public static void main(String[] args) throws IOException {
File file = new File("文件地址");
pptx2Png(file);
}
/**
* ppt转为图片列表
* @param pptFile 在(服务器)本地的ppt文件 比如:123.ppt
* @return 转换后的图片集合
*/
public static List<File> ppt2Png(File pptFile) {
List<File> pngFileList = new ArrayList<>();
long startTime = System.currentTimeMillis();
FileInputStream is = null;
// 将ppt文件转换成每一帧的图片
HSLFSlideShow ppt = null;
try {
ZipSecureFile.setMinInflateRatio(-1.0d);
is = new FileInputStream(pptFile);
ppt = new HSLFSlideShow(is);
int idx = 1;
Dimension pageSize = ppt.getPageSize();
double image_rate = 1.0;
int imageWidth = (int) Math.floor(image_rate * pageSize.getWidth());
int imageHeight = (int) Math.floor(image_rate * pageSize.getHeight());
for (HSLFSlide slide : ppt.getSlides()) {
BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = img.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
// clear the drawing area
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, imageWidth, imageHeight));
graphics.scale(image_rate, image_rate);
//防止中文乱码
for (HSLFShape shape : slide.getShapes()) {
if (shape instanceof HSLFTextShape) {
HSLFTextShape hslfTextShape = (HSLFTextShape) shape;
for (HSLFTextParagraph hslfTextParagraph : hslfTextShape) {
for (HSLFTextRun hslfTextRun : hslfTextParagraph) {
hslfTextRun.setFontFamily("宋体");
}
}
}
}
FileOutputStream out = null;
try {
slide.draw(graphics);
File pngFile = new File(pptFile.getPath().replace(".ppt", String.format("-%04d.png", idx++)));
out = new FileOutputStream(pngFile);
ImageIO.write(img, "png", out);
pngFileList.add(pngFile);
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
} finally {
try {
if (out != null) {
out.flush();
out.close();
}
if (graphics != null) {
graphics.dispose();
}
if (img != null) {
img.flush();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("操作失败");
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
} finally {
try {
if (is != null) {
is.close();
}
if (ppt != null) {
ppt.close();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
}
}
long endTime = System.currentTimeMillis();
System.out.println("ppt2Png的时间:{}" + (endTime - startTime));
return pngFileList;
}
public static List<File> pptx2Png(File pptxFile) {
List<File> pngFileList = new ArrayList<>();
long startTime = System.currentTimeMillis();
FileInputStream is = null;
// 将ppt文件转换成每一帧的图片
XMLSlideShow pptx = null;
try {
ZipSecureFile.setMinInflateRatio(-1.0d);
is = new FileInputStream(pptxFile);
pptx = new XMLSlideShow(is);
int idx = 1;
Dimension pageSize = pptx.getPageSize();
double image_rate = 2.0; //控制清晰程序
int imageWidth = (int) Math.floor(image_rate * pageSize.getWidth());
int imageHeight = (int) Math.floor(image_rate * pageSize.getHeight());
for (XSLFSlide xslfSlide : pptx.getSlides()) {
BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_BGR);
Graphics2D graphics = img.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
// clear the drawing area
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, imageWidth, imageHeight));
graphics.scale(image_rate, image_rate);
//防止中文乱码
for (XSLFShape shape : xslfSlide.getShapes()) {
if (shape instanceof XSLFTextShape) {
XSLFTextShape xslfTextShape = (XSLFTextShape) shape;
for (XSLFTextParagraph xslfTextParagraph : xslfTextShape) {
for (XSLFTextRun xslfTextRun : xslfTextParagraph) {
xslfTextRun.setFontFamily("宋体");
}
}
}
}
FileOutputStream out = null;
try {
xslfSlide.draw(graphics);
File pngFile = new File(pptxFile.getPath().replace(".pptx", String.format("-%04d.png", idx++)));
out = new FileOutputStream(pngFile);
ImageIO.write(img, "png", out);
pngFileList.add(pngFile);
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
} finally {
try {
if (out != null) {
out.flush();
out.close();
}
if (graphics != null) {
graphics.dispose();
}
if (img != null) {
img.flush();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("操作失败");
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
} finally {
try {
if (is != null) {
is.close();
}
if (pptx != null) {
pptx.close();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败");
}
}
long endTime = System.currentTimeMillis();
System.out.println("pptx2Png耗时:{}"+(endTime - startTime) );
return pngFileList;
}
}
pom文件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.20</version>
</dependency>
<!--poi依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.18</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.12</version>
</dependency>
存在问题
PDF- 转换没有问题 PPT- 转换存在特效丢失问题