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