zoukankan      html  css  js  c++  java
  • java 上传文件-生成文件首页缩略图 生成pdf 抓取图片

    方法:1、文件转换成pdf(采用openoffice或者jacob)

         2、抓取pdf首页图

    第一步:采用jacob:

            a、下载jacob  注意区分32位,64位,否则不能用
        将dll文件放在java bin目录下即可
        jar包引入项目

            b、转换pdf

    package cn.bnsr.edu_yun.util;
    
    import java.io.File;  
      
    import java.io.IOException;
    
    import com.jacob.activeX.ActiveXComponent;  
    import com.jacob.com.ComThread;  
    import com.jacob.com.Dispatch;  
    import com.jacob.com.Variant;  
    	  
    public class TestUtil {
    	    static final int wdFormatPDF = 17;// PDF 格式    
    	    public void wordToPDF(String sfileName,String toFileName){    
    	            
    	        System.out.println("启动Word...");      
    	        long start = System.currentTimeMillis();      
    	        ActiveXComponent app = null;  
    	        Dispatch doc = null;  
    	        try {      
    	            app = new ActiveXComponent("Word.Application");      
    	            app.setProperty("Visible", new Variant(false));  
    	            Dispatch docs = app.getProperty("Documents").toDispatch();   
    //	          doc = Dispatch.call(docs,  "Open" , sourceFile).toDispatch();   
    	            doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] {                    
    	               sfileName, new Variant(false),new Variant(true) }, new int[1]).toDispatch();               
    	            System.out.println("打开文档..." + sfileName);  
    	            System.out.println("转换文档到PDF..." + toFileName);      
    	            File tofile = new File(toFileName);      
    	            if (tofile.exists()) {      
    	                tofile.delete();      
    	            }        
    //	          Dispatch.call(doc, "SaveAs",  destFile,  17);                    
    	            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {                
    	                toFileName, new Variant(17) }, new int[1]);    
    	            long end = System.currentTimeMillis();      
    	            System.out.println("转换完成..用时:" + (end - start) + "ms.");                
    	        } catch (Exception e) {  
    	            e.printStackTrace();  
    	            System.out.println("========Error:文档转换失败:" + e.getMessage());      
    	        } finally {  
    	            Dispatch.call(doc,"Close",false);  
    	            System.out.println("关闭文档");  
    	            if (app != null)      
    	                app.invoke("Quit", new Variant[] {});      
    	            }  
    	          //如果没有这句话,winword.exe进程将不会关闭  
    	           ComThread.Release();     
    	    }  
    	    public static void main(String[] args) {  
    	    	TestUtil d = new TestUtil();  
    	        d.wordToPDF("D:\work\1111.docx", "d:\work\1111.pdf");  
    	    }  
    	  
    }
    

    第二步:抓取首页图:

      

    package cn.bnsr.edu_yun.util;
    
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.lang.reflect.Method;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.security.AccessController;
    import java.security.PrivilegedAction;
    
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import com.sun.pdfview.PDFFile;
    import com.sun.pdfview.PDFPage;
    
    public class PdfImageUtil {
    		// 将PDF格式的文件转换为JPG格式的文件
    	public static void pdfToJPG(String inputFile)throws IOException {
    		// load a pdf from a byte buffer
    		File file = new File(inputFile);
    		RandomAccessFile raf = new RandomAccessFile(file, "r");
    		FileChannel channel = raf.getChannel();
    		//这句代码通道建立了map映射,如果要删除file那么得接触映射
    		ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,
    		channel.size());
    		PDFFile pdffile = new PDFFile(buf);
    		int totalpage =pdffile.getNumPages();
    		for (int i = 1; i <= totalpage; i++) {
    			if (i == 1) {
    				// draw the first page to an image
    				// 以图片的形式来描绘首页
    				PDFPage page = pdffile.getPage(i);
    				Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
    				// generate the image
    				// 生成图片
    				Image img = page.getImage(rect.width, rect.height, // width &
    					// height
    					rect, // clip rect
    					null, // null for the ImageObserver
    					true, // fill background with white
    					true // block until drawing is done
    					);
    				BufferedImage tag = new BufferedImage(rect.width, rect.height,
    				BufferedImage.TYPE_INT_RGB);
    				tag.getGraphics().drawImage(img.getScaledInstance(rect.width, rect.height, Image.SCALE_SMOOTH), 0, 0, rect.width, rect.height,null);
    		
    				FileOutputStream out = new FileOutputStream( "D:\work\s111"+ ".jpg"); // 输出到文件流
    				JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    				encoder.encode(tag); // JPEG编码
    				// 关闭输出流
    				out.close();
    				break;
    			}
    		}
    		buf.clear();
    		channel.close();
    		raf.close();
    		unmap(buf);
    		file.delete();
    
    	}
    		//解除map映射
    	public static <T> void unmap(final Object buffer) {
    		AccessController.doPrivileged(new PrivilegedAction<T>(){
    			@Override
    			public T run() { 
    				try {
    					Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
    					getCleanerMethod.setAccessible(true);
    					sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);
    					cleaner.clean();
    				} catch(Exception e) {
    					e.printStackTrace();
    				} 
    				return null;
    			} 
    		});
    	}
    		
    }
    

      

    第三步、搞定,加入自己的业务逻辑,有问题欢迎提问。

      

  • 相关阅读:
    js网页滚动条滚动事件实例分析
    一个简单的登陆注册的页面
    几个例子弄懂JS 的setInterval的运行方式
    IIS线程池与ASP.NET线程池
    [翻译]了解ASP.NET底层架构(八)
    IIS提示Server Application Unavailable
    C/C++, Java和C#的编译过程解析
    C#学习系列-.NET体系结构
    C#技术漫谈之垃圾回收机制(GC)
    ASP.NET应用程序与页面生命周期
  • 原文地址:https://www.cnblogs.com/start-fxw/p/5853671.html
Copyright © 2011-2022 走看看