package de.ralfebert.imageassert.pageimage;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import de.ralfebert.imageassert.compare.Page;
import de.ralfebert.imageassert.utils.TemporaryFolder;
import de.ralfebert.imageassert.utils.UnixLauncher;
/**
* This converter uses pdftoppm to convert PDF to PPM and uses ImageMagick to
* convert PPM to PNG. Written because ImageMagick uses ghostscript to convert
* PDF to image and ghostscript had a bug:
* http://bugs.ghostscript.com/show_bug.cgi?id=691253
*
* @author Ralf Ebert
*/
public class XpdfSplitter implements IPdfImageSplitter {
private TemporaryFolder temporaryFolder;
private final UnixLauncher launcher = new UnixLauncher();
public void setTemporaryFolder(TemporaryFolder temporaryFolder) {
this.temporaryFolder = temporaryFolder;
}
public Page[] convert(File pdf) {
String src = pdf.getAbsolutePath();
String dest = src.replaceAll(".pdf$", "");
ProcessBuilder convertProcess = new ProcessBuilder("pdftoppm", src, dest);
launcher.launch(convertProcess);
String wildcard = FilenameUtils.getBaseName(pdf.getAbsolutePath()) + "*.ppm";
File[] images = temporaryFolder.getFolder().listFiles(
(FilenameFilter) new WildcardFileFilter(wildcard));
for (int i = 0; i < images.length; i++) {
String ppmPath = images[i].getAbsolutePath();
String pngPath = ppmPath.replaceAll(".ppm", ".png");
convertProcess = new ProcessBuilder("convert", ppmPath, "-resize", "700x", pngPath);
launcher.launch(convertProcess);
images[i] = new File(pngPath);
}
Arrays.sort(images);
Page[] pages = new Page[images.length];
for (int i = 0; i < pages.length; i++) {
pages[i] = new Page(images[i], pdf);
}
return pages;
}
}