项目中需要将 Office 文档上传并实现在线预览,用到了 LibreOffice/OpenOffice 将 Office 文档转换为 PDF 文档,然后再用 pdfbox 将 PDF 转为图片。
本文介绍用 pdfbox 将 PDF 转为图片。

相关文章

将 pdf 转换成图片

pom.xml 添加依赖:

1
2
3
4
5
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.18</version>
</dependency>

转换类 PdfToImage :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.example.demo;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class PdfToImage {
// 经过测试,dpi 为 96,100,105,120,150,200 中,105 显示效果较为清晰,体积稳定,dpi 越高图片体积越大,一般电脑显示分辨率为 96
public static final float DEFAULT_DPI = 105;
public static final String DEFAULT_IMAGE_FORMAT = ".png";

/**
* pdf 转图片,只生成一张图片
* @param pdfPath PDF路径
* @return pdf 页数
*/
public static int pdfToImageAllToSingleImage(String pdfPath, String imageFilePath, int pageSize) throws Exception {
BufferedImage imageResult;
PDDocument pdDocument = PDDocument.load(new File(pdfPath));
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);

int pages = pdDocument.getNumberOfPages();
int len = Math.min(pages, pageSize);
int width = 0;
int imageHeightTotal = 0;

for (int i = 0; i < len; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
imageHeightTotal += image.getHeight();

if (i == 0) {
width = image.getWidth();
}
}

imageResult = new BufferedImage(width, imageHeightTotal, BufferedImage.TYPE_INT_RGB);
int shiftHeight = 0;
int[] singleImgRGB;

for (int i = 0; i < len; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
int imageHeight = image.getHeight();

// 计算偏移高度
if (i > 0) {
shiftHeight += pdfRenderer.renderImageWithDPI(i - 1, DEFAULT_DPI, ImageType.RGB).getHeight();
}

singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
// 写入流中
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
}

// 写图片
ImageIO.write(imageResult, DEFAULT_IMAGE_FORMAT.replace(".", ""), new File(imageFilePath));
pdDocument.close();
return pages;
}

/**
* pdf 转图片,每页生成一张图片
* @param pdfPath PDF路径
* @return pdf 页数
*/
public static int pdfToImageOnePageOnImage(String pdfPath, String imageFilePath, int pageSize) throws Exception {
BufferedImage imageResult;
PDDocument pdDocument = PDDocument.load(new File(pdfPath));
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);

int pages = pdDocument.getNumberOfPages();
int len = Math.min(pages, pageSize);
int width;

int shiftHeight = 0;
int[] singleImgRGB;

for (int i = 0; i < len; i++) {
BufferedImage image = pdfRenderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
width = image.getWidth();
int imageHeight = image.getHeight();
imageResult = new BufferedImage(width, imageHeight, BufferedImage.TYPE_INT_RGB);
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
// 写入流中
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
// 写图片
ImageIO.write(imageResult, DEFAULT_IMAGE_FORMAT.replace(".", ""), new File(imageFilePath + i + DEFAULT_IMAGE_FORMAT));
}

pdDocument.close();
return pages;
}
}

在线预览

生成图片之后,在线预览就不用多说了吧~~