杜洪波
昨天 3dd3bc576dada8216099348ad8fd93fc070622b6
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package com.product.file.util;
 
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
 
import javax.imageio.ImageIO;
 
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.text.PDFTextStripper;
 
public class PDFOperateUtil {
 
    /**
     * 根据文本文件创建 PDF(使用 PDFBox)
     * 
     * @param textFilePath 输入文本文件路径
     * @param pdfFilePath  输出 PDF 文件路径
     * @throws IOException
     */
    public static void createPdfFromTextFile(String textFilePath, String pdfFilePath) throws IOException {
        String content = readTextFile(textFilePath);
         
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage(PDRectangle.A4);
            document.addPage(page);
            
            // 获取字体文件(仅支持 Windows/Linux)
            File fontFile = getSystemFontFile();
            if (!fontFile.exists()) {
                throw new IOException("未找到支持的中文字体文件(Windows/Linux)");
            }
 
            // 加载字体
            PDType0Font font;
            try (FileInputStream fontStream = new FileInputStream(fontFile)) {
                font = PDType0Font.load(document, fontStream);
            }
 
            // 写入 PDF 内容
            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                contentStream.beginText();
                contentStream.setFont(font, 12);
                contentStream.newLineAtOffset(50, 700);
 
                String[] lines = content.split("\n");
                for (String line : lines) {
                    contentStream.showText(line);
                    contentStream.newLineAtOffset(0, -15);
                }
                contentStream.endText();
            }
 
            document.save(pdfFilePath);
        }
    }
 
    /**
     * 读取 PDF 内容(使用 PDFBox)
     * 
     * @param pdfFilePath PDF 文件路径
     * @return 提取的文本内容
     * @throws IOException
     */
    public static String readPdfContent(String pdfFilePath) throws IOException {
        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(document);
        }
    }
 
    /**
     * 将 PDF 转换为图片(使用 PDFBox)
     * 
     * @param pdfFilePath    PDF 文件路径
     * @param outputFolder    输出图片文件夹
     * @param imageName        输出图片文件名
     * @param imageFormat    图片格式(如 "png", "jpg")
     * @throws IOException
     */
    public static void convertPdfToImages(String pdfFilePath, String outputFolder, String imageName, String imageFormat) throws IOException {
        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            PDFRenderer renderer = new PDFRenderer(document);
 
            // 确保输出文件夹存在
            new File(outputFolder).mkdirs();
 
            // 逐页渲染为图片(300 DPI)
            for (int page = 0; page < document.getNumberOfPages(); page++) {
                BufferedImage image = renderer.renderImageWithDPI(page, 300);
                String outputFileName = String.format("%s/%s%d.%s", outputFolder, imageName, page + 1, imageFormat);
                ImageIO.write(image, imageFormat, new File(outputFileName));
            }
        }
    }
 
    /**
     * 辅助方法:读取文本文件内容
     * 
     * @param filePath 文本文件路径
     * @return 文件内容
     * @throws IOException
     */
    private static String readTextFile(String filePath) throws IOException {
        StringBuilder content = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        }
        return content.toString();
    }
    
    /**
     * 获取系统字体文件(仅 Windows/Linux)
     */
    private static File getSystemFontFile() {
        String os = System.getProperty("os.name").toLowerCase();
        String[] possiblePaths;
 
        if (os.contains("win")) {
            // Windows 字体目录(优先检查常见中文字体)
            possiblePaths = new String[]{
                System.getenv("WINDIR") + "\\Fonts\\simhei.ttf",  // 黑体
                System.getenv("WINDIR") + "\\Fonts\\msyh.ttc",   // 微软雅黑
                System.getenv("WINDIR") + "\\Fonts\\mingliu.ttc"  // 明体(备用)
            };
        } else {
            // Linux 字体目录(优先检查开源中文字体)
            possiblePaths = new String[]{
                "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",  // 文泉驿微米黑
                "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",  // 思源黑体
                "/usr/share/fonts/truetype/arphic/ukai.ttc"       // 文鼎字体(备用)
            };
        }
 
        // 检查所有可能的路径
        for (String path : possiblePaths) {
            File fontFile = new File(path);
            if (fontFile.exists()) {
                return fontFile;
            }
        }
 
        // 如果系统字体未找到,尝试从项目资源目录加载(需手动放入字体文件)
        File embeddedFont = new File("fonts/simhei.ttf"); // 假设字体文件放在项目根目录的 fonts/ 文件夹下
        return embeddedFont.exists() ? embeddedFont : null;
    }
 
    // 示例用法
    public static void main(String[] args) {
        try {
            // 1. 从文本文件创建 PDF
            createPdfFromTextFile("E://新建1.txt", "E://新建1.pdf");
 
            // 2. 读取 PDF 内容
            String content = readPdfContent("E://新建1.pdf");
            System.out.println("PDF 内容:\n" + content);
 
            // 3. 将 PDF 转换为图片
            convertPdfToImages("E://新建1.pdf", "E://", "新建1", "png");
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}