将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 }
原文地址:https://www.cnblogs.com/fuhengheng/p/8038176.html