PDF 提取
使用Apache 的pdfbox组件对PDF文件解析读取和转图片。
Maven 依赖
导入下面的maven依赖:
xml
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.30</version>
</dependency>
读取总页数 和 转图片
dpi越大转换后越清晰,相对转换速度越慢,建议取值500-800。
图片类型可以选择jpg或者png:
- jpg图片大小比png要小很多
- jpg图片转换速度比png快
- 相同dpi jpg和png清晰度差别不大
java
package tech.pplus.common.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.web.util.UriComponentsBuilder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
/**
* @author zl
* @date 2024-01-24
*/
@Slf4j
public class PDFUtil {
/**
* dpi越大转换后越清晰,相对转换速度越慢
*/
private static final Integer DPI = 500;
private static final String IMG_SUFFIX = "jpg";
/**
* pdf 一页切分 一张图片
*
* @param url pdf文件url
* @param dstDir 图片输出目录
* @return
*/
public static List<File> splitPage(String url, String dstDir) {
dstDir = dstDir.endsWith(File.separator) ? dstDir : dstDir + File.separator;
List<File> files = new LinkedList<>();
try (InputStream is = new URL(url).openConnection().getInputStream();
PDDocument document = PDDocument.load(is)) {
//获取总页数
int numberOfPages = document.getNumberOfPages();
PDFRenderer renderer = new PDFRenderer(document);
//提取url文件名称
String path = UriComponentsBuilder.fromHttpUrl(url).build().getPath();
String fileName = path.substring(path.lastIndexOf("/") + 1);
for (int i = 0; i < numberOfPages; i++) {
File dstFile = new File(dstDir + fileName + String.format(".page%d.%d.%s", i + 1, DPI, IMG_SUFFIX));
//把页面转图片
BufferedImage image = renderer.renderImageWithDPI(i, DPI);
ImageIO.write(image, IMG_SUFFIX, dstFile);
files.add(dstFile);
}
} catch (IOException e) {
log.error("PDF分割异常,url={},destDir={},error={}", url, dstDir,e.getMessage(), e);
}
return files;
}
}
测试参数:
- pdfUrl:https://s3.us-west-1.amazonaws.com/tax.withtutti.com/test/upload/202401/83610d194d2d48498afa9451e39b198d.pdf
- dstDir: /tmp
输出结果: