package jp.crwdev.app.container.pdf; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import jp.crwdev.app.BufferedImageIO; import jp.crwdev.app.gui.DebugWindow; import jp.crwdev.app.util.DPIRenderListener; import jp.crwdev.app.util.DPIRenderListener.DPI; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfReaderContentParser; public class GhostscriptUtil { private static GhostscriptUtil mInstance; private static String mGSC = "C:\\Program Files\\gs\\gs9.10\\bin\\gswin32c.exe"; private static String mTmpImageHead = ""; private static String mTmpImageName = "_%05d.jpg"; private static String mTmpFolder = "tmp\\"; private static PdfReader mPdfReader; private static PdfReaderContentParser mParser; private static String mPdfFilePath; private static int mPageCount = 0; public interface GhostscriptUtilEventListener { void onComplete(int page, BufferedImage image); } static public GhostscriptUtil getInstance(){ if(mInstance == null){ mInstance = new GhostscriptUtil(); // mInstance.setGSC(InifileProperty.getInstance().getGhostScriptPath()); } return mInstance; } protected GhostscriptUtil(){ } public void setGSC(String gsc){ mGSC = gsc; } public boolean isEnable(){ File file = new File(mGSC); return file.exists(); } public int getNumOfPages(){ return mPageCount; } public boolean open(String path){ mPdfFilePath = path; try { if(mPdfReader != null){ mPdfReader.close(); } mPdfReader = new PdfReader(path); mParser = new PdfReaderContentParser(mPdfReader); File file = new File(path); String name = file.getName(); mTmpImageHead = name.substring(0, name.length() - 4); File dir = new File(mTmpFolder); if(!dir.exists()){ dir.mkdirs(); } mPageCount = mPdfReader.getNumberOfPages(); return true; } catch (IOException e) { e.printStackTrace(); } return false; } private DPI getDPI(int page){ DPIRenderListener listener = new DPIRenderListener(); try { mParser.processContent(page, listener); return listener.getDPI(); } catch (IOException e) { e.printStackTrace(); } return null; } public void close(){ if(mPdfReader != null){ mPdfReader.close(); mPdfReader = null; } if(mPdfFilePath != null){ mPdfFilePath = null; File dir = new File(mTmpFolder); if(dir.exists()){ if(!dir.delete()){ dir.deleteOnExit(); } } } } public void getPageAsImage(int page, GhostscriptUtilEventListener event){ final int fPage = page; final GhostscriptUtilEventListener fEvent = event; new Thread(){ public void run(){ BufferedImage image = getPageAsImage(fPage); if(fEvent != null){ fEvent.onComplete(fPage, image); } } }.start(); } public BufferedImage getPageAsImage(int page){ File file = getPageAsFile(page); if(file != null){ FileInputStream in = null; try { in = new FileInputStream(file); return BufferedImageIO.read(in, true); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } return null; } public File getPageAsFile(int page){ if(page < 1 || mPageCount < page){ return null; } String imageName = String.format(mTmpImageHead + mTmpImageName, page); File file = new File(mTmpFolder + imageName); if(file.exists()){ DebugWindow.log("getPageAsFile", "find tmpfile."); return file; } else{ DebugWindow.log("getPageAsFile", "begin create tmpfile."); Runtime r = Runtime.getRuntime(); DPI dpi = getDPI(page); String dpiStr = "72"; if(dpi != null){ dpiStr = dpi.getString(); } String command = mGSC + " -dSAFER -dBATCH -dFirstPage=" + page + " -dLastPage=" + page + " -dNOPAUSE -sDEVICE=jpeg -dDisplayFormat=16#30804 -dJPEGQ=100 -dQFactor=1.0 -r" + dpiStr; command += " -sOutputFile=\"" + mTmpFolder + imageName + "\" "; command += "\"" + mPdfFilePath + "\""; DebugWindow.log("getPageAsFile", "gs command=" + command); int result = 0; try { Process p = r.exec(command); result = p.waitFor(); } catch (InterruptedException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DebugWindow.log("getPageAsFile", "end create tmpfile. result=" + result); if(result == 0){ if(file.exists()){ return file; } } return null; } } }