为了账号安全,请及时绑定邮箱和手机立即绑定

java后端将文档转为图片,图片最大65560px

标签:
Java
//pdf转成图片	
public void pdftoIamge(String pdfFile, String outpath) throws Exception {
    InputStream is = new FileInputStream(pdfFile);
    List<BufferedImage> piclist = new ArrayList<BufferedImage>();
    Document document = new Document();	
    document.setFile(pdfFile);
    float scale = 2.5f; // 缩放比例
    float rotation = 0f; // 旋转角度
    for (int i = 0; i < document.getNumberOfPages(); i++) {	
      BufferedImage image=(BufferedImage) document.getPageImage(i,GraphicsRenderingHints.SCREEN,
        			Page.BOUNDARY_CROPBOX, rotation, scale);
      piclist.add(image);	
    }
    document.dispose();
    yPic(piclist, outpath);
    is.close();	
}  
/** 
  * 将宽度相同的图片,竖向追加在一起,经过修改,没有了相同宽度这一限制
  * @param piclist 文件流数组     
  * @param outPath 输出路径  
  */ 
public void yPic(List<BufferedImage> piclist, String outPath) throws Exception{
    // 纵向处理图片		
    if (piclist == null || piclist.size() <= 0) {
    	//Trace.logInfo(Trace.MODULE_ACTION, "图片数组为空!");	
    }		
    int height = 0, // 总高度		
    _width = 0, // 临时宽度		
    maxWidth = 0, // 最大宽度		
    _height = 0, // 临时的高度 , 或保存偏移高度		
    __height = 0, // 临时的高度,主要保存每个高度		
    picNum = piclist.size();// 图片的数量		
    int[] heightArray = new int[picNum]; // 保存每个文件的高度		
    int[] widthArray = new int[picNum]; // 保存每个文件的宽度		
    BufferedImage buffer = null; // 保存图片流		
    List<int[]> imgRGB = new ArrayList<int[]>(); // 保存所有的图片的RGB		
    int[] _imgRGB; // 保存一张图片中的RGB数据		
    for (int i = 0; i < picNum; i++) {		
    	buffer = piclist.get(i);		
    	if (buffer.getWidth() > maxWidth) {
            // 获取最大宽度				
            maxWidth = buffer.getWidth();			
        }		
    }		
    for (int i = 0; i < picNum; i++) {
        buffer = piclist.get(i);			
        heightArray[i] = _height = buffer.getHeight();// 图片高度	
        widthArray[i] = _width = buffer.getWidth();// 图片宽度	
        height += _height; // 获取总高度		
        _imgRGB = new int[_width * _height];// 从图片中读取RGB
        _imgRGB = buffer.getRGB(0, 0, _width, _height, _imgRGB, 0, _width);	
        imgRGB.add(_imgRGB);		
    }		
    _height = 0; // 设置偏移高度为0		
    // 生成新图片		
    BufferedImage imageResult = new BufferedImage(maxWidth, height, BufferedImage.TYPE_INT_RGB);		
    for (int i = 0; i < picNum; i++) {			
        __height = heightArray[i];			
        _width = widthArray[i];			
        //if (i != 0) 
        _height += heightArray[i-1];// 计算偏移高度 ,若高度一致,则把此行打开			
        if (i != 0)			
        _height += heightArray[i - 1]; // 计算偏移高度 ,因高度不一致,所以i-1			
        //imageResult.setRGB(0,_height,widthArray[i],__height,imgRGB.get(i),0,widthArray[i]);//写入流中			
        // 居中,前两个参数为起始的宽度、高度			
        imageResult.setRGB((maxWidth-_width)/2,_height,_width,__height,imgRGB.get(i),0,_width);//写入流中
    }		
    File outFile = new File(outPath);		
    try {		
        ImageIO.write(imageResult, "jpg", outFile);// 写图片		
    } catch (Exception e) {			
        // TODO: handle exception			
        throw new MyException(-20,"文件过大,不能通过审批直接查看");		
    }    
}    
/***     
* 判断文件类型    
* @param fileName     
* @return     
*/    
public String getFileSufix(String fileName) throws Exception{      
  int splitIndex = fileName.lastIndexOf(".");       
  return fileName.substring(splitIndex + 1);   
}     
/***     
*      
* Word转PDF     
*      
* @param inputFile     
* @param pdfFile     
* @return     
*/     
public int word2PDF(String inputFile, String pdfFile) throws Exception{  
    // TODO Auto-generated method stub        
    try {        	 
        ComThread.InitSTA();            
        // 打开Word应用程序            
        ActiveXComponent app = new ActiveXComponent("Word.Application"); 
        System.out.println("开始转化Word为PDF...");            
        long date = new Date().getTime();            
        // 设置Word不可见            
        app.setProperty("Visible", new Variant(false));// 禁用宏  
        app.setProperty("AutomationSecurity", new Variant(3));// 获得Word中所有打开的文档,返回documents对象 
        Dispatch docs = app.getProperty("Documents").toDispatch();         
        // 调用Documents对象中Open方法打开文档,并返回打开的文档对象Document   
        Dispatch doc = Dispatch.call(docs, "Open", inputFile, false, true).toDispatch();	        
        File tofile = new File(pdfFile);  	        
        if (tofile.exists()) {  	              
            tofile.delete();  	        
        }              
        /***             
        *              
        * 调用Document对象的SaveAs方法,将文档保存为pdf格式             
        *              
        * Dispatch.call(doc, "SaveAs", pdfFile, wdFormatPDF             
        * word保存为pdf格式宏,值为17 )             
        *              
        */	        
        Dispatch.call(doc, "ExportAsFixedFormat", pdfFile, wdFormatPDF);// word保存为pdf格式宏,值为17            
        System.out.println(doc);            // 关闭文档            
        long date2 = new Date().getTime();            
        int time = (int) ((date2 - date) / 1000);             
        Dispatch.call(doc, "Close", false);// 关闭Word应用程序            
        app.invoke("Quit", 0);            
        return time;        
        } catch (Exception e) {            
            // TODO: handle exception        	
            e.printStackTrace();            
            return -1;       
        }finally{           
         ComThread.Release();        
        }    
}     
/***     
*      
* Excel转化成PDF     
*      
* @param inputFile     
* @param pdfFile     
* @return     
*/    
public int Ex2PDF(String inputFile, String pdfFile)throws Exception {    
  try {        	 
      ComThread.InitSTA();            
      ActiveXComponent ax = new ActiveXComponent("Excel.Application"); 
      System.out.println("开始转化Excel为PDF...");            
      long date = new Date().getTime();            
      ax.setProperty("Visible", false);            
      ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏   
      Dispatch excels = ax.getProperty("Workbooks").toDispatch();            
      System.out.println(inputFile);            
      Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] 
          { 
              inputFile, new Variant(false),new Variant(false)
           },new int[9]).toDispatch();            
      File tofile = new File(pdfFile);  	        
      if (tofile.exists()) {  	              
          tofile.delete();  	        
      }              
  // 转换格式	        
  Dispatch.invoke(excel,"ExportAsFixedFormat",Dispatch.Method,new Object[]{new Variant(0),//PDF格式=0                    
      pdfFile, new Variant(xlTypePDF) //0=标准(生成的PDF图片不会变模糊)1=最小文件},new int[1]);  
  // 这里放弃使用SaveAs            
  /*             
  * Dispatch.invoke(excel,"SaveAs",Dispatch.Method,new Object[]{   
  * pdfFile, new Variant(57), new Variant(false), new Variant(57),             
  * new Variant(57), new Variant(false), new Variant(true), new             
  * Variant(57), new Variant(true), new Variant(true), new             
  * Variant(true) },new int[1]);             
  */            
  long date2 = new Date().getTime();            
  int time = (int) ((date2 - date) / 1000);            
  Dispatch.call(excel, "Close", new Variant(false));             
  if (ax != null) {                
      ax.invoke("Quit", new Variant[] {});                
      ax = null;            
  }            
  return time;        
    } catch (Exception e) {          
      // TODO: handle exception        	
      e.printStackTrace();            
      return -1;        
    }finally{          
      ComThread.Release();        
    }   
    
此为service层处理代码,可以在controller层进行文件的判断,我自己根据自身业务需要,
还是在service层进行的处理

public String fileToImg(String infile) throws Exception {		
    URL url = getClass().getProtectionDomain().getCodeSource().getLocation();		
    String path1 = url.toString();		
    int index = path1.indexOf("WebRoot");		
    if(index == -1){			
        index = path1.indexOf("classes");		
    }		
    if(index == -1){			
        index = path1.indexOf("bin");		
    }		
    path1 = path1.substring(0, index);				
    if(path1.startsWith("zip")){			
        //当class文件在war中时,此时返回zip:D:/...这样的路径			
        path1 = path1.substring(4);		
    }else if(path1.startsWith("file")){			
        //当class文件在class文件中时,此时返回file:/D:/...这样的路径			
        path1 = path1.substring(6);		
    }else if(path1.startsWith("jar")){			
        //当class文件在jar文件里面时,此时返回jar:file:/D:/...这样的路径			
        path1 = path1.substring(10); 		
    }		
    path1 =  URLDecoder.decode(path1, "UTF-8");		
    path1 = path1.substring(0, path1.indexOf("PM Platform"));		
    String str1 = infile.replaceAll("\\\\", "/").replaceAll("//", "/");		
    String inputFile = str1.replaceAll( "///", "/").replaceAll("//", "/");		
    String kind = getFileSufix(inputFile);       
    File file = new File(inputFile);        
    String str = String.valueOf(new Date().getTime());        
    String pdfFile = path1+"image/"+str+".pdf";       
    String imgfile = path1+"image/"+str+".jpg";        
    //判断需要转化文件的类型(Excel、Word)        
    if (!file.exists()) {            
      return "0";//文件不存在        
    }        
    if (kind.equals("pdf")) {        	
        try {        		
            pdftoIamge(inputFile, imgfile);        		
            return inputFile.substring(inputFile.lastIndexOf("/"), inputFile.length())+".jpg";//原文件就是PDF文件			
        } catch (Exception e) {				
            // TODO: handle exception				
            e.printStackTrace();				
            return "-20";			
        }        
    }       
    if (kind.equals("jpg")||kind.equals("png")) {           
        return infile;//原文件就是图片        
    }        
    if (kind.equals("doc")||kind.equals("docx")||kind.equals("txt")) {            
        word2PDF(inputFile, pdfFile);            
        try {            	
            pdftoIamge(pdfFile, imgfile);            	
            return str+".jpg";			
            } catch (Exception e) {				
            // TODO: handle exception				
            e.printStackTrace();				
            return "-20";			
        }        
    }else if(kind.equals("xls")||kind.equals("xlsx")){             
        Ex2PDF(inputFile, pdfFile);             
        try {            	
            pdftoIamge(pdfFile, imgfile);            	 
            return str+".jpg";			
        } catch (Exception e) {				
            // TODO: handle exception				
            e.printStackTrace();				
            return "-20";			
        }        
    }else {            
        return "0";        
    }	
}	

因为自身业务,对于路径进行了处理,当pdf转化异常,进行了异常的处理。不需要可以根据需要更改
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消