import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class ImageUtils {
public static final String FORMAT_NAME = "png";
public static final String PNG_SUFFIX = ".png";
public static final String ZIP_SUFFIX = ".zip";
public static List<String> pdfToImages(MultipartFile file) throws Exception {
String fileName = file.getOriginalFilename();
Document document = new Document();
document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);
List<String> fileList = new ArrayList<>();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
Page.BOUNDARY_CROPBOX, 0F, 2.5F);
image.flush();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(image, "png", stream);
byte[] bytes = stream.toByteArray();
Encoder encoder = Base64.getEncoder();
String base64 = encoder.encodeToString(bytes).trim();
base64 = base64.replaceAll("\n", "").replaceAll("\r", "");
StringBuffer img = new StringBuffer("data:image/png;base64,");
img.append(base64);
stream.flush();
stream.close();
fileList.add(img.toString());
}
document.dispose();
return fileList;
}
public static void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception {
File zipFile = generateImageFile(file);
downloadZipFile(zipFile, response);
}
private static File generateImageFile(MultipartFile file) throws Exception {
String fileName = file.getOriginalFilename();
Document document = new Document();
document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);
List<File> fileList = new ArrayList<>();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
Page.BOUNDARY_CROPBOX, 0F, 2.5F);
File imageFile = new File((i + 1) + PNG_SUFFIX);
ImageIO.write(image, FORMAT_NAME, imageFile);
image.flush();
fileList.add(imageFile);
}
document.dispose();
String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
File zipFile = new File(directoryName + ZIP_SUFFIX);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
zipFile(fileList, zos);
zos.close();
return zipFile;
}
private static void downloadZipFile(File zipFile, HttpServletResponse response) throws IOException {
FileInputStream fis = new FileInputStream(zipFile);
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
fis.close();
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/x-msdownload");
response.setHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));
OutputStream out = response.getOutputStream();
out.write(bytes);
out.flush();
out.close();
zipFile.delete();
}
private static void zipFile(List<File> inputFiles, ZipOutputStream zos) throws IOException {
byte[] buffer = new byte[1024];
for (File file : inputFiles) {
if (file.exists()) {
if (file.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
zos.putNextEntry(new ZipEntry(file.getName()));
int size = 0;
while ((size = bis.read(buffer)) > 0) {
zos.write(buffer, 0, size);
}
zos.closeEntry();
bis.close();
file.delete();
} else {
File[] files = file.listFiles();
List<File> childrenFileList = Arrays.asList(files);
zipFile(childrenFileList, zos);
}
}
}
}
}