package com.nq.utils;
|
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.rendering.PDFRenderer;
|
import org.apache.pdfbox.rendering.ImageType;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import javax.imageio.ImageIO;
|
import java.awt.Graphics2D;
|
import java.awt.RenderingHints;
|
import java.awt.image.BufferedImage;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* PDF转图片工具类
|
*/
|
public class PdfToImageUtil {
|
private static final Logger log = LoggerFactory.getLogger(PdfToImageUtil.class);
|
|
/**
|
* 将PDF文件转换为图片
|
* @param pdfFile PDF文件
|
* @param outputDir 输出目录
|
* @param imagePrefix 图片文件名前缀
|
* @return 图片文件路径列表
|
*/
|
public static List<String> convertPdfToImages(File pdfFile, String outputDir, String imagePrefix) {
|
List<String> imagePaths = new ArrayList<>();
|
PDDocument document = null;
|
|
try {
|
if (!pdfFile.exists()) {
|
log.error("PDF文件不存在: {}", pdfFile.getAbsolutePath());
|
return imagePaths;
|
}
|
|
// 确保输出目录存在
|
File outputDirectory = new File(outputDir);
|
if (!outputDirectory.exists()) {
|
outputDirectory.mkdirs();
|
}
|
|
// 加载PDF文档
|
document = PDDocument.load(new FileInputStream(pdfFile));
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
|
int pageCount = document.getNumberOfPages();
|
log.info("PDF总页数: {}", pageCount);
|
|
long timestamp = System.currentTimeMillis();
|
|
// 遍历每一页
|
for (int page = 0; page < pageCount; page++) {
|
// 使用RGB模式渲染,DPI设置为300确保文字清晰
|
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
|
|
// 优化图片
|
BufferedImage optimizedImage = optimizeImage(image);
|
|
// 生成图片文件名
|
String imageFileName;
|
if (page == 0) {
|
imageFileName = imagePrefix + "_" + timestamp + ".png";
|
} else {
|
imageFileName = imagePrefix + "_" + timestamp + "_" + (page + 1) + ".png";
|
}
|
|
File imageFile = new File(outputDirectory, imageFileName);
|
|
// 保存图片
|
ImageIO.write(optimizedImage, "png", imageFile);
|
|
imagePaths.add(imageFile.getAbsolutePath());
|
log.info("PDF第{}页已转换为图片: {}", page + 1, imageFile.getAbsolutePath());
|
}
|
|
} catch (Exception e) {
|
log.error("PDF转图片失败: {}", pdfFile.getAbsolutePath(), e);
|
} finally {
|
if (document != null) {
|
try {
|
document.close();
|
} catch (Exception e) {
|
log.error("关闭PDF文档失败", e);
|
}
|
}
|
}
|
|
return imagePaths;
|
}
|
|
/**
|
* 优化图片,确保文字清晰
|
*/
|
private static BufferedImage optimizeImage(BufferedImage originalImage) {
|
int width = originalImage.getWidth();
|
int height = originalImage.getHeight();
|
|
BufferedImage optimizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
Graphics2D g2d = optimizedImage.createGraphics();
|
|
// 设置高质量渲染
|
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
|
|
g2d.drawImage(originalImage, 0, 0, null);
|
g2d.dispose();
|
|
return optimizedImage;
|
}
|
|
/**
|
* 测试方法:将指定PDF转换为图片
|
*/
|
public static void main(String[] args) {
|
// 示例:转换agreement_19998.pdf
|
String pdfPath = "D:/work/A-stock/agreement_pdf/agreement_19998.pdf";
|
String outputDir = "D:/work/A-stock/agreement_pdf/";
|
String imagePrefix = "agreement_19998";
|
|
File pdfFile = new File(pdfPath);
|
List<String> imagePaths = convertPdfToImages(pdfFile, outputDir, imagePrefix);
|
|
System.out.println("转换完成,共生成 " + imagePaths.size() + " 张图片:");
|
for (String path : imagePaths) {
|
System.out.println(" - " + path);
|
}
|
}
|
}
|