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 convertPdfToImages(File pdfFile, String outputDir, String imagePrefix) { List 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 imagePaths = convertPdfToImages(pdfFile, outputDir, imagePrefix); System.out.println("转换完成,共生成 " + imagePaths.size() + " 张图片:"); for (String path : imagePaths) { System.out.println(" - " + path); } } }