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(); } } }