zoukankan      html  css  js  c++  java
  • 将pdf格式的文件转换成图片

      1 public class PdfToImage {
      2 
      3     private static String UPLOAD_DIR = "upload" + File.separator;
      4     
      5     /**
      6      * 获取上传的文件
      7      * @param uploadPath
      8      * @param file
      9      * @return
     10      */
     11     private static File getUploadCalendarFile(String uploadPath,MultipartFile file)
     12     {
     13         File path = new File(uploadPath);
     14         if(!path.exists())
     15              path.mkdirs();
     16           String fileName = file.getOriginalFilename();
     17             String ext = fileName.substring(fileName.lastIndexOf("."));
     18             String uploadfileName = UUID.randomUUID().toString();
     19             uploadfileName = uploadfileName.replace("-", "");
     20             uploadfileName = uploadfileName + ext;
     21             String pdfpath = uploadPath+uploadfileName;
     22             File convFile = new File( pdfpath);
     23             try {
     24                 file.transferTo(convFile);
     25             } catch (IllegalStateException e) {
     26                 e.printStackTrace();
     27             } catch (IOException e) {
     28                 e.printStackTrace();
     29             }
     30             return convFile;
     31     }
     32     /**
     33      * 
     34      * @param pdfPath:pdf的路径
     35      * @param filePath:存放图片的路径
     36      * @return
     37      */
     38     public static String getPdfToImagePath(HttpServletRequest request,MultipartFile mulfile) {
     39          try {
     40             ServletContext contx = request.getSession().getServletContext();
     41             String savePath = contx.getRealPath("/") + UPLOAD_DIR;
     42             File pdfPath = getUploadCalendarFile(savePath,mulfile);
     43             if(null != pdfPath && pdfPath.exists())
     44             {
     45                 String pdfUploadName =  pdfPath.getName();
     46                 pdfUploadName = pdfUploadName.substring(0,pdfUploadName.lastIndexOf("."));
     47                 //如果图片存放的路径不存在,则创建
     48                  String imgPicPaths = savePath + File.separator + pdfUploadName;
     49                  File file = new File(imgPicPaths);
     50                  if(!file.exists())
     51                      file.mkdirs();
     52                   //将pdf 转换成多张图片,图片名称按数字进行保存
     53                     int iImageCount = convertPdfToImage(pdfPath,imgPicPaths);
     54                     //如果正确读取pdf,图片的个数根据pdf的页数来判断
     55                     if(iImageCount > 0)
     56                     {
     57                         //读取filePath,图片路径下的第一张图片
     58                         String firstImg = imgPicPaths + File.separator + "1.png";
     59                         File fileFirst=new File(firstImg); 
     60                         if(fileFirst.exists())
     61                         {
     62                             String outPath = savePath + File.separator + pdfUploadName  + ".png";
     63                             //将生成的多张图片合并
     64                             File oneImgPath = mergeImage(firstImg,iImageCount,imgPicPaths,outPath);
     65                             if(null != oneImgPath && oneImgPath.exists())
     66                             {
     67                                 //将生成的图片进行大小限制:设定宽度最大为900
     68                                 ImageFixSizeUtil.compressImage(outPath, outPath, CalendarImgSizeEnum.MAXLENGTH.getiValue());
     69                                 return outPath;
     70                             }
     71                         }
     72                     }else
     73                     {
     74                         if(file.exists() && file.isDirectory())
     75                         {
     76                             //删除目录文件夹
     77                             FileUtils.deleteDirectory(file);
     78                             if(pdfPath.exists())
     79                                 pdfPath.delete();
     80                         }
     81                     }
     82             }
     83             
     84         } catch (Exception e) {
     85             e.printStackTrace();
     86         }
     87          return null;
     88     }
     89 
     90     /**
     91      * 读取pdf文件, 生成图片,然后将图片合并
     92      * 
     93      * @return
     94      */
     95     private static int convertPdfToImage(File pdfPath, String filePath) {
     96         
     97         RandomAccessFile raf;
     98         try {
     99             raf = new RandomAccessFile(pdfPath, "r");
    100             FileChannel channel = raf.getChannel();
    101             MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    102             PDFFile pdffile = new PDFFile(buf);
    103             int iImageNum = 0;
    104             for (int i = 1; i <= pdffile.getNumPages(); i++) {
    105                 PDFPage page = pdffile.getPage(i);
    106                 Rectangle rect = new Rectangle(0, 0, ((int) page.getBBox().getWidth()), ((int) page.getBBox().getHeight()));
    107                 Image img = page.getImage(rect.width, rect.height, rect, 
    108                         null, // null
    109                         true, // fill background with white
    110                         true // block until drawing is done
    111                 );
    112                 BufferedImage tag = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
    113                 tag.getGraphics().drawImage(img, 0, 0, rect.width, rect.height, null);
    114                 FileOutputStream out = new FileOutputStream(filePath + File.separator  + i + ".png"); // 输出到文件流
    115                 ImageIO.write(tag, "png", out);
    116                 tag.flush();
    117                 out.flush();
    118                 out.close();
    119                 iImageNum += 1;
    120             }
    121             channel.close();
    122             raf.close();
    123             unmap(buf);// 如果要在转图片之后删除pdf,就必须要这个关闭流和清空缓冲的方法
    124             //生成图片后,清除pdf文件
    125             if(pdfPath.exists())
    126                 pdfPath.delete();
    127             return iImageNum;
    128         } catch (FileNotFoundException e) {
    129             e.printStackTrace();
    130         } catch (IOException e) {
    131             e.printStackTrace();
    132         }finally {
    133             if(pdfPath.exists()){
    134                 pdfPath.delete();
    135             }
    136         }
    137         return 0;
    138     }
    139 
    140     /**
    141      * 将生成的图片合并成一张图片
    142      * 
    143      * @param firstImg
    144      * @param iPageSize
    145      * @param imgPath
    146      * @param outPath
    147      * @throws IOException
    148      */
    149     private static File mergeImage(String firstImg, int iPageSize, String imgPath, String outPath) throws IOException {
    150         // 读取第一张图片
    151         File fileOne = new File(firstImg);
    152         BufferedImage ImageOne = ImageIO.read(fileOne);
    153         int width = ImageOne.getWidth();// 图片宽度
    154         int height = ImageOne.getHeight();// 图片高度
    155         int iYHeight = 0;
    156         // 从图片中读取RGB
    157         int[] ImageArrayOne = new int[width * height];
    158         ImageArrayOne = ImageOne.getRGB(0, 0, width, height, ImageArrayOne, 0, width);
    159         // 生成新图片
    160         BufferedImage ImageNew = new BufferedImage(width, height * iPageSize, BufferedImage.TYPE_INT_RGB);
    161         ImageNew.setRGB(0, 0, width, height, ImageArrayOne, 0, width);// 设置左半部分的RGB
    162         ImageOne.flush();
    163         
    164         for (int i = 2; i <= iPageSize; i++) {
    165             File fileTwo = new File(imgPath + File.separator + String.valueOf(i) + ".png");
    166             BufferedImage ImageTwo = ImageIO.read(fileTwo);
    167             int[] ImageArrayTwo = new int[width * height];
    168             ImageArrayTwo = ImageTwo.getRGB(0, 0, width, height, ImageArrayTwo, 0, width);
    169             ImageTwo.flush();
    170             iYHeight = (i - 1) * height;
    171             ImageNew.setRGB(0, iYHeight, width, height, ImageArrayTwo, 0, width);// 设置右半部分的RGB
    172         }
    173         ImageNew.flush();
    174         File outFile = new File(outPath);
    175         ImageIO.write(ImageNew, "png", outFile);// 写图片
    176         //清空文件夹中内容
    177         File file = new File(imgPath);
    178         //删除目录 
    179         FileUtils.deleteDirectory(file);
    180         return outFile;
    181     }
    182 
    183 
    184     /**
    185      * 如果要在转图片之后删除pdf,就必须要这个关闭流和清空缓冲的方法
    186      * 
    187      * @param buffer
    188      */
    189     @SuppressWarnings({ "unchecked", "rawtypes" })
    190     private static void unmap(final Object buffer) {
    191         AccessController.doPrivileged(new PrivilegedAction() {
    192             public Object run() {
    193                 try {
    194                     Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
    195                     getCleanerMethod.setAccessible(true);
    196                     sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);
    197                     cleaner.clean();
    198                 } catch (Exception e) {
    199                     e.printStackTrace();
    200                 }
    201                 return null;
    202             }
    203         });
    204     }
    205 }
  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/fuhengheng/p/8038176.html
Copyright © 2011-2022 走看看