有这样一个业务场景:需要在 WEB 页面中浏览 PDF 文件,PDF 文件存储在 FTP 服务器上,即 PDF 文件对外提供的访问地址的协议是 ftp 的。有如下几个硬条件、软需求的要求:

  • WEB 页面本身的可视区域不是很大;
  • 不想弹出对话框展示 PDF 文件;
  • 谷歌浏览器不支持在 http 协议的页面里内嵌 ftp 协议的路径;
  • 在 WEB 页面中使用系统默认的 PDF 阅读器的体验不是很好,滚动条啦,边框啦。

总之,很复杂吧。

最后考虑到 WEB 页面展示图片比较方便,就想到了“将 PDF 文件转换成 PNG 图片”这种方案。

下面是将 PDF 文件转换成 PNG 图片的示例代码。

  1. Maven 依赖

org.apache.pdfbox pdfbox 2.0.24

  1. Demo 示例

// 加载PDF文件 File file = new File("D:/deploy.pdf"); PDDocument document = PDDocument.load(file); // Instantiating the PDFRenderer class PDFRenderer renderer = new PDFRenderer(document); int number = document.getNumberOfPages(); List images = Lists.newArrayList(); // PDF文件总高度 int sumHeight = 0; int width = 0; for (int i = 0; i < number; i++) { // 渲染图片 BufferedImage image = renderer.renderImageWithDPI(i, 300, ImageType.RGB); sumHeight += image.getHeight(); int imageWidth = image.getWidth(); if (imageWidth > width) { width = imageWidth; } images.add(image); } // 需要生成的图片 BufferedImage newImage = new BufferedImage(width, sumHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = newImage.createGraphics(); g2.setBackground(Color.WHITE); g2.setColor(Color.BLACK); g2.fillRect(0, 0, width, sumHeight); int y = 0; for (int i = 0; i < images.size(); i++) { g2.drawImage(images.get(i), null, 0, y); y += images.get(i).getHeight(); } g2.dispose(); // 将图片保存到文件 ImageIO.write(newImage, "PNG", new File("D:/deploy-multiple.jpg")); // 关闭文档 document.close();

转换的图片: