应用场景
合同管理:从批量合同中提取合同编号、日期等信息作为文件名
发票处理:自动从发票中提取发票号码、金额等关键信息
文档归档:根据文档内特定位置的标题或编号自动分类归档
数据录入:快速提取 PDF 中的结构化数据到系统中
工具下载
咕嗄批量PDF自定义提取多区域内容重命名导出表格系统
百度网盘:https://pan.baidu.com/s/1FjWiKqt93ECiVqNKmeOJOA?pwd=8866
腾讯网盘:https://share.weiyun.com/yw15BsM7
原文参考:https://mp.weixin.qq.com/s/sh26EujdBkKd0ZCd0co9uw
实现方案
推荐使用 iTextSharp 库(处理 PDF)和 组合实现:
提取文本区域:通过 iTextSharp 定位并提取指定区域的图像
文件重命名:根据提取PDF内容结果重命名PDF文件
详细步骤
创建新项目:在 Visual Studio 中创建一个 C# 控制台应用程序
安装 NuGet 包:
plaintext
Install-Package iTextSharp
编写核心代码:
csharp
using System;
using System.IO;
using System.Text.RegularExpressions;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using Tesseract;
namespace PdfRenameTool
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("PDF批量重命名工具启动...");
// 设置参数
string pdfFolder = @"C:\PDFs";
string outputFolder = @"C:\PDFs\Renamed";
string tessDataPath = @"C:\TesseractData";
// 创建输出文件夹
if (!Directory.Exists(outputFolder))
{
Directory.CreateDirectory(outputFolder);
}
// 处理所有PDF文件
ProcessPdfFiles(pdfFolder, outputFolder, tessDataPath);
Console.WriteLine("处理完成!按任意键退出...");
Console.ReadKey();
}
static void ProcessPdfFiles(string pdfFolder, string outputFolder, string tessDataPath)
{
// 获取所有PDF文件
string[] pdfFiles = Directory.GetFiles(pdfFolder, "*.pdf");
foreach (string pdfFile in pdfFiles)
{
try
{
Console.WriteLine($"正在处理: {Path.GetFileName(pdfFile)}");
// 提取指定区域文本
string extractedText = ExtractTextFromPdf(pdfFile, tessDataPath);
// 根据提取内容生成新文件名
string newFileName = GenerateNewFileName(extractedText);
// 重命名并移动文件
string outputPath = Path.Combine(outputFolder, newFileName + ".pdf");
File.Copy(pdfFile, outputPath);
Console.WriteLine($"已重命名为: {newFileName}.pdf");
}
catch (Exception ex)
{
Console.WriteLine($"处理文件时出错: {ex.Message}");
}
}
}
static string ExtractTextFromPdf(string pdfPath, string tessDataPath)
{
using (PdfReader reader = new PdfReader(pdfPath))
{
// 假设我们要提取第一页的特定区域
int pageNumber = 1;
if (reader.NumberOfPages < pageNumber)
{
return "页码不足";
}
// 设置要提取的区域(以点为单位,左下角为原点)
// 示例区域:从(100, 600)到(400, 700)的矩形
Rectangle rect = new Rectangle(100, 600, 400, 700);
// 创建策略并提取文本
RenderFilter filter = new RegionTextRenderFilter(rect);
ITextExtractionStrategy strategy = new FilteredTextRenderListener(
new LocationTextExtractionStrategy(), filter);
string text = PdfTextExtractor.GetTextFromPage(reader, pageNumber, strategy);
// 如果文本提取失败,尝试OCR
if (string.IsNullOrWhiteSpace(text))
{
text = PerformOcrOnPdfPage(pdfPath, pageNumber, rect, tessDataPath);
}
return text.Trim();
}
}
static string PerformOcrOnPdfPage(string pdfPath, int pageNumber, Rectangle region, string tessDataPath)
{
// 使用iTextSharp将PDF页面转换为图像
// 然后使用Tesseract对指定区域进行OCR识别
// 此处为简化示例,实际实现需要处理图像提取和OCR过程
using (var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default))
{
// 实际代码需要从PDF提取图像并裁剪到指定区域
// 这里假设我们已经有了处理好的图像
// Bitmap image = ExtractImageFromPdf(pdfPath, pageNumber, region);
// 使用OCR识别文本
// using (var page = engine.Process(image))
// {
// return page.GetText();
// }
return "OCR识别内容"; // 示例返回值
}
}
static string GenerateNewFileName(string extractedText)
{
// 根据提取的文本生成新文件名
// 这里可以使用正则表达式匹配特定模式
string pattern = @"[合同|发票]号[::]?(\w+)";
Match match = Regex.Match(extractedText, pattern);
if (match.Success)
{
return match.Groups[1].Value;
}
// 如果没有匹配到特定模式,使用时间戳
return DateTime.Now.ToString("yyyyMMddHHmmss");
}
}
}
注意事项
PDF格式差异:不同来源的PDF文件可能有不同的内部结构,需要调整提取区域坐标,复杂布局可能影响识别率
性能考虑:大量PDF处理可能需要优化
错误处理:添加适当的异常处理、记录日志以便后续检查
权限问题:确保程序有读取和写入文件的权限,避免处理正在使用的文件
测试验证:处理前最好备份原始文件,先对少量样本文件进行测试
以上方案提供了基本框架,你可以根据实际需求进行调整和优化。