三种pdf转图片java代码

2/22/2017来源:ASP.NET技巧人气:4371

第一种方法:java开源库 ice ,依赖icepdf-core.jar和icepdf-viewer.jar(版本4.3.3),文章结尾有jar包下载链接,废话不多说,看下面代码

package com.test; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.icepdf.core.pobjects.Document; import org.icepdf.core.pobjects.Page; import org.icepdf.core.util.GraphicsRenderingHints; public class ICEPdf { public static void main(String[] args) { try { pdfToImage("D:\\5057.pdf", "D:\\5057.jpg",1.3f); System.out.PRintln("success"); } catch (Exception e) { e.printStackTrace(); } } /** * 将指定pdf文件的首页转换为指定路径的缩略图 *@param filepath 原文件路径, *@param imagepath 图片生成路径, *@param zoom 缩略图显示倍数,1表示不缩放,0.3则缩小到30% 2 表示放大两倍 */ public static void pdfToImage(String filepath, String imagepath, float zoom) throws Exception { Document document = null; List<BufferedImage> imageList = new ArrayList<BufferedImage>(); float rotation = 0f; //float scale = 2.0f; document = new Document(); document.setFile(filepath); // maxPages = document.getPageTree().getNumberOfPages(); for (int i = 0; i < document.getNumberOfPages(); i++) { BufferedImage img = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, zoom); imageList.add(img); } yPic(imageList, imagepath); } /** * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同 * @param piclist 文件流数组 * @param outPath 输出路径 */ public static void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片 if (piclist == null || piclist.size() <= 0) { System.out.println("图片数组为空!"); return; } try { int height = 0, // 总高度 width = 0, // 总宽度 _height = 0, // 临时的高度 , 或保存偏移高度 __height = 0, // 临时的高度,主要保存每个高度 picNum = piclist.size();// 图片的数量 File fileImg = null; // 保存读取出的图片 int[] heightArray = 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); heightArray[i] = _height = buffer.getHeight();// 图片高度 if (i == 0) { 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(width, height, BufferedImage.TYPE_INT_BGR); for (int i = 0; i < picNum; i++) { __height = heightArray[i]; if (i != 0) _height += __height; // 计算偏移高度 imageResult.setRGB(0, _height, width, __height, imgRGB.get(i), 0, width); // 写入流中 } File outFile = new File(outPath); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imageResult, "jpg", out);// 写图片 byte[] b = out.toByteArray(); FileOutputStream output = new FileOutputStream(outFile); output.write(b); out.close(); output.close(); } catch (Exception e) { e.printStackTrace(); } } }

第二种方法:java开源库 jpedal ,依赖jpedal_lgpl.jar,文章结尾有jar包下载链接,废话不多说,看下面代码

package com.test; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.jpedal.PdfDecoder; import org.jpedal.exception.PdfException; import org.jpedal.fonts.FontMappings; public class Jpedal { public static void main(String[] args) { pdfToImage("C:\\Users\\xc.yanww\\Desktop\\5057.pdf", "C:\\Users\\xc.yanww\\Desktop\\5057.jpg"); System.out.println("success"); } /** * 将指定pdf文件的首页转换为指定路径的缩略图 *@param filepath 原文件路径, *@param imagepath 图片生成路径, *@param zoom 缩略图显示倍数,1表示不缩放,0.3则缩小到30% 2 表示放大两倍 */ public static void pdfToImage(String pdfFile,String imageFile) { PdfDecoder decoder = null; List<BufferedImage> imageList = null; try { decoder = new PdfDecoder(true); imageList = new ArrayList<BufferedImage>(); FontMappings.setFontReplacements(); decoder.setExtractionMode(0, 2.0f); decoder.openPdfFile(pdfFile); int start = 1, end = decoder.getPageCount(); for (int i = start; i < end + 1; i++) { BufferedImage image = decoder.getPageAsImage(i); imageList.add(image); } yPic(imageList,imageFile); } catch (PdfException e) { e.printStackTrace(); } finally { decoder.closePdfFile(); } } /** * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同 * @param piclist 文件流数组 * @param outPath 输出路径 */ public static void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片 if (piclist == null || piclist.size() <= 0) { System.out.println("图片数组为空!"); return; } try { int height = 0, // 总高度 width = 0, // 总宽度 _height = 0, // 临时的高度 , 或保存偏移高度 __height = 0, // 临时的高度,主要保存每个高度 picNum = piclist.size();// 图片的数量 File fileImg = null; // 保存读取出的图片 int[] heightArray = 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); heightArray[i] = _height = buffer.getHeight();// 图片高度 if (i == 0) { 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(width, height, BufferedImage.TYPE_INT_BGR); for (int i = 0; i < picNum; i++) { __height = heightArray[i]; if (i != 0) _height += __height; // 计算偏移高度 imageResult.setRGB(0, _height, width, __height, imgRGB.get(i), 0, width); // 写入流中 } File outFile = new File(outPath); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imageResult, "jpg", out);// 写图片 byte[] b = out.toByteArray(); FileOutputStream output = new FileOutputStream(outFile); output.write(b); out.close(); output.close(); } catch (Exception e) { e.printStackTrace(); } } }

第三种方法:java开源库 pdfbox ,依赖pdfbox.jar.jar和fontbox.jar(版本2.0.2),文章结尾有jar包下载链接,废话不多说,看下面代码

package com.test; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; public class PDFBOXCreate { public static void main(String[] args)throws Exception { PDDocument document = null; List<BufferedImage> piclist = new ArrayList<BufferedImage>(); long start = System.currentTimeMillis(); try { String filepath = "C:\\Users\\Administrator\\Desktop\\5057.pdf"; document = new PDDocument(); File pdfFile = new File(filepath); document = PDDocument.load(pdfFile,(String)null); int size = document.getNumberOfPages(); for(int i=0 ; i < size; i++){ BufferedImage image = new PDFRenderer(document).renderImageWithDPI(i,80,ImageType.RGB); piclist.add(image); } } catch (Exception e) { e.printStackTrace(); }finally{ if (document!=null) { document.close(); } } yPic(piclist,"C:\\Users\\Administrator\\Desktop\\5057.jpg"); long end = System.currentTimeMillis(); System.out.println(end-start); } /** * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同 * @param piclist 文件流数组 * @param outPath 输出路径 */ public static void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片 if (piclist == null || piclist.size() <= 0) { System.out.println("图片数组为空!"); return; } try { int height = 0, // 总高度 width = 0, // 总宽度 _height = 0, // 临时的高度 , 或保存偏移高度 __height = 0, // 临时的高度,主要保存每个高度 picNum = piclist.size();// 图片的数量 File fileImg = null; // 保存读取出的图片 int[] heightArray = 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); heightArray[i] = _height = buffer.getHeight();// 图片高度 if (i == 0) { 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(width, height, BufferedImage.TYPE_INT_BGR); for (int i = 0; i < picNum; i++) { __height = heightArray[i]; if (i != 0) _height += __height; // 计算偏移高度 imageResult.setRGB(0, _height, width, __height, imgRGB.get(i), 0, width); // 写入流中 } File outFile = new File(outPath); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imageResult, "jpg", out);// 写图片 byte[] b = out.toByteArray(); FileOutputStream output = new FileOutputStream(outFile); output.write(b); out.close(); output.close(); } catch (Exception e) { e.printStackTrace(); } } }

上面三种开源库各有优缺点,ice和jpedal生成图片时间相对来说还算可以,也挺快的,就是有一缺点是比较占用内存,内存不够用的时候直接报错,当然这些是开源免费的,可以理解,能用就行。不过ice和jpedal也有专门收费的库,网上说生成图片的效率比较高,不会存在内存泄漏或占用内存比较多的情况,土豪可以买来用用,呵呵,我本人还算喜欢开源,浪费点内存也无所谓,也不经常用。pdfbox是最坑的,生成图片的时候内存蹭蹭的往上涨,结果可想而知,内存直接爆掉了,嗷嗷嗷,建议使用上面那两种方式生成图片,支持开源。

jar包下载地址 提取码:x9cp 百度云盘 下载