需求
需要将pdf转图片,用作预览,图片需要与pdf页的长宽大小保持一致。
依赖
org.apache.pdfbox:pdfbox:2.0.26
分析过程
pdfbox源码中,设置图片长宽大小的方法如下:
public BufferedImage PDFRenderer.renderImage(int pageIndex, float scale);
我们要分析的是scale
参数设置为多少才能保证图片的长宽大小与pdf一致。
分析源码可以看到,pdf的长宽单位是pt, 图片的长宽单位是px,如下图:
因为pt与px的关系是 pt = px * 0.75
,所以scale = pt / 0.75
,也就是 scale = pt * 1.333333...
示例代码
public static List<File> pdfToImagePath(String filePath, String fileName) {
List<File> previewFileList = new ArrayList<>();
try {
PDDocument doc = PDDocument.load(new File(filePath, fileName));
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
// 1.3333f保持pdf页的长和宽
BufferedImage image = renderer.renderImage(i, 1.3333f);
File imgFile =
new File(
filePath + "/" + fileName.substring(0, fileName.indexOf(".")) + "_" + i + ".jpg");
ImageIO.write(image, "PNG", imgFile);
previewFileList.add(imgFile);
}
} catch (IOException e) {
log.warn("pdf 转图片失败", e);
}
return previewFileList;
}