//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人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦