将一个多页PDF文件转换成一个PNG图片文件
有这样一个业务场景:需要在 WEB 页面中浏览 PDF 文件,PDF 文件存储在 FTP 服务器上,即 PDF 文件对外提供的访问地址的协议是 ftp 的。有如下几个硬条件、软需求的要求:
- WEB 页面本身的可视区域不是很大;
- 不想弹出对话框展示 PDF 文件;
- 谷歌浏览器不支持在 http 协议的页面里内嵌 ftp 协议的路径;
- 在 WEB 页面中使用系统默认的 PDF 阅读器的体验不是很好,滚动条啦,边框啦。
总之,很复杂吧。
最后考虑到 WEB 页面展示图片比较方便,就想到了将 PDF 文件转换成 PNG 图片展示这种方案。
下面是将 PDF 文件转换成 PNG 图片的示例代码。
- Maven 依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
- 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<BufferedImage> 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();