之前工作中,需要实现一个在线预览pdf的功能,一开始用的的 jQuery-media 插件来实现的,后来感觉有点慢,就继续寻找更好的替代品,直到遇见了 ICE pdf。。。
ICEpdf (官网:http://www.icesoft.org/java/home.jsf) 原理是基于 Java SE 中的 Swing 实现的 (谁说 Swing 没有用武之地了。。。) ,将一个 PDF 文件作为一个 Document 对象,调用封装的方法,将该文件的每一页生成一张图片!
关键代码如下:
public static void main(String[] args) { String filePath = "test.pdf"; // open the file Document document = new Document(); try { document.setFile(filePath); } catch (PDFException e) { System.out.println("parsing PDF document failure" + e); } catch (PDFSecurityException e) { System.out.println("encrytion not supported " + e); } catch (IOException e) { System.out.println("IOException " + e); } // save page captures to file float scale = 2.0f; float rotation = 360f; // Paint each pages content to an image and write the image to file System.out.println("The number of page: " + document.getNumberOfPages()); for (int i = 0; i < 5; i++) { BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_TRIMBOX, rotation, scale); try { System.out.println("capturing page: " + i); File file = new File("imageCapture_" + i + ".png"); ImageIO.write(image, "png", file); } catch (IOException e) { e.printStackTrace(); } image.flush(); } // clean up resources document.dispose(); }
我的 jar 包用的是 icepdf-core-6.0.0.jar ,
首先,声明一个 Document 对象,调用 setFile(String filePath) 方法,参数为 pdf 绝对或者相当路径;
变量 scale 代表放缩比例,默认为 1,越大生成的图片越清晰;
变量 rotation 为旋转角度,360度一个周期,可以设置任意值试试;
然后调用 getPageImage() 方法,生成图片流,然后对图片进行处理,可以输出到本地,也可以以流的形式传到页面,实现快速预览的效果。
最后,我利用这个功能,在首次预览时,生成对应页码图片到本地或者服务器,第二次预览则直接查看图片,使得用户体验更好~