import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;

import org.apache.commons.logging.LogFactory;
import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;

import com.rj.sql.SQLRunner;
import com.rj.sql.resulthandler.AllHandler;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.TIFFEncodeParam;

public class PdfToTif {
    public static final String FILETYPE_JPG = "jpg";

     /**
      * 
      * 将指定的pdf文件转换为指定路径的图片
      * 
      * @param filepath 原文件路径,例如d:/test/test.pdf
      * 
      * @param imagepath 图片生成路径,例如 d:/test/
      * 
      * @param zoom 缩略图显示倍数,1表示不缩放,0.3则缩小到30%
      * 
      * @param name 生成的tiff文件名称
     * @throws IOException 
     * @throws PDFSecurityException 
     * @throws PDFException 
     * @throws InterruptedException 
      * 
      */
     public static void tranfer(String filepath, String imagepath, float zoom, String name) throws PDFException, PDFSecurityException, IOException, InterruptedException{
         Document document = null;
         float rotation = 0f;
         document = new Document();
         document.setFile(filepath);
         int maxPages = document.getPageTree().getNumberOfPages();
         FileOutputStream out=null;
         ImageOutputStream outImage=null;
         List<String> bookFilePaths=new ArrayList();
         for (int i = 0; i < maxPages; i++) {
             BufferedImage img = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, zoom);
             Iterator iter = ImageIO.getImageWritersBySuffix(FILETYPE_JPG);
             ImageWriter writer = (ImageWriter) iter.next();
             File outFile = new File(imagepath + new File(filepath).getName() + "_" + new DecimalFormat("000").format(i) + "." + FILETYPE_JPG);
             bookFilePaths.add(outFile.getPath());
             out = new FileOutputStream(outFile);
             outImage = ImageIO.createImageOutputStream(out);
             writer.setOutput(outImage);
             writer.write(new IIOImage(img, null, null));
             //关闭流防止资源占用
             if(out!=null){
                 out.close();
                }
            if(outImage!=null){
                outImage.close();
            }
         }
         many2one(bookFilePaths,imagepath,name+".tiff");
    }
     
     /**
      * 多张图片转tiff
      * @param bookFilePaths 图片路径存数组 
      * 
      * @param toPath 输出文件夹路径
      * 
      * @param distFileName  生成图片名称
      */
     public static void many2one(List<String> bookFilePaths, String toPath,String distFileName) {
         if (bookFilePaths != null && bookFilePaths.size() > 0) {
             File[] files = new File[bookFilePaths.size()]; 
             for(int i = 0; i < bookFilePaths.size(); i++){
                 files[i] =  new File(bookFilePaths.get(i));
             } 
             if (files != null && files.length > 0) {
                 try {
                     ArrayList pages = new ArrayList(files.length - 1);
                     FileSeekableStream[] stream = new FileSeekableStream[files.length];
                     for (int i = 0; i < files.length; i++) {
                         stream[i] = new FileSeekableStream(files[i].getCanonicalPath());
                     }
                     ParameterBlock pb = (new ParameterBlock()); 
                     PlanarImage firstPage = JAI.create("stream", stream[0]); 
                     for (int i = 1; i < files.length; i++) {
                         PlanarImage page = JAI.create("stream", stream[i]); 
                         pages.add(page);
                     } 
                     TIFFEncodeParam param = new TIFFEncodeParam(); 
                     File f = new File(toPath); 
                     if(!f.exists()){
                         f.mkdirs();
                     } 
                     OutputStream os = new FileOutputStream(toPath + File.separator+ distFileName); 
                     ImageEncoder enc = ImageCodec.createImageEncoder("tiff",os, param); 
                     param.setExtraImages(pages.iterator()); 
                     enc.encode(firstPage); 
                     for (int i = 0; i < files.length; i++) {
                         stream[i].close(); 
                         if(files[i].isFile()&&files[i].exists()){
                             files[i].delete(); 
                         } 
                     } 
                     os.close(); 
              } catch (IOException e) {
                  e.printStackTrace();
              } 
             } 
        }
     }
     
     
     public static void main(String[] args) throws PDFException, PDFSecurityException, IOException, InterruptedException{
         tranfer("C:/ls_ftp/433150/1/2021/20210805/决赛22222.pdf", "C:/ls_ftp/433150/1/2021/20210805/", 1 , "2222");//test
     }
}