peter
2026-01-11 5f20fc02cb6873ceabde9f34cf62967bbd92d82f
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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);
        }
    }
}