功能内容:抓取指定文件夹内的 pdf 文件,然后提取文件内的内容,获取指定文字,进行处理,然后将该 pdf 转换成JPG 图片
1. 主流程控制
java
private static final Pattern BARCODE_PATTERN = Pattern.compile("(条形码|条\\s*码)[::]?\\s*(\\d{10,20})");
private static final String OUTPUT_PATH = "D:\\打印\\pdf\\";
public static void main(String[] args) {
try {
//OUTPUT_PATH
List<File> pdfFiles = findPDFFiles(OUTPUT_PATH);
System.out.println("找到 " + pdfFiles.size() + " 个 PDF 文件:");
for (File pdfFile : pdfFiles) {
// 提取文本内容
String content = extractTextFromPDF(pdfFile);
if (!"".equals(content)){
// 提取条形码
String barcode = extractBarcode(content);
// PDF转高质量图像
pdfToHighQualityImage(pdfFile, barcode);
}
}
} catch (Exception e) {
// 异常处理
}
}
2. PDF文件查找与验证
采用**广度优先搜索(BFS)**算法递归查找PDF文件:
PDF有效性验证包括:
- 文件存在性检查
- 非空验证
- 加密状态检测
- 内容可读性验证
java
public static List<File> findPDFFiles(String directoryPath) {
List<File> pdfFiles = new ArrayList<>();
LinkedList<File> queue = new LinkedList<>();
queue.add(new File(directoryPath));
while (!queue.isEmpty()) {
File currentDir = queue.removeFirst();
File[] files = currentDir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
queue.add(file); // 子目录入队
} else if (file.isFile() && isPDFFile(file)) {
pdfFiles.add(file);
}
}
}
}
return pdfFiles;
}
3. 文本内容提取与条码识别
使用Apache PDFBox进行精准文本提取:
java
public static String extractTextFromPDF(File pdfFile) {
try (PDDocument document = PDDocument.load(pdfFile)) {
PDFTextStripper stripper = new PDFTextStripper() {
@Override
protected void processTextPosition(TextPosition text) {
// 直接提取Unicode字符,避免字体问题
String unicode = text.getUnicode();
if (!unicode.isEmpty() && !unicode.matches("\\s")) {
writeString(unicode);
}
}
};
stripper.setSortByPosition(true);
return cleanExtractedText(stripper.getText(document));
} catch (Exception e) {
return "";
}
}
4. PDF转高质量图像
使用Spire.PDF库实现高DPI图像转换:
java
public static void pdfToHighQualityImage(File pdfFile, String fileName) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile(pdfFile.getPath());
// 设置150 DPI分辨率
//多页pdf 转 多页jpg
// for (int i = 0; i < pdf.getPages().getCount(); i++) {
// BufferedImage image = pdf.saveAsImage(i, PdfImageType.Bitmap,500,500);
// }
BufferedImage image = pdf.saveAsImage(0, PdfImageType.Bitmap, 150, 150);
// 保存为PNG避免CMYK色域问题
ImageIO.write(image, "PNG", new File(OUTPUT_PATH + fileName + ".png"));
pdf.close();
}
-
PDF文本精确定位:
- 通过重写
processTextPosition
方法直接获取Unicode字符 - 设置
setSortByPosition(true)
保持原始布局
- 通过重写
-
图像质量保证:
- 使用PNG格式避免JPEG压缩失真
- 设置150DPI保证打印质量
- 处理CMYK色域问题
-
性能优化:
- BFS遍历提高文件搜索效率
- 流式操作(TRY-WITH-RESOURCES)自动释放资源
- 按需加载PDF页面
maven
java
// Apache PDFBox
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
// Spire.PDF
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>4.4.1</version>
</dependency>