【工具教程】批量提取PDF电子票据内容给PDF重命名或将区域内容导出表格,超简单
项目背景
在企业和财务部门中,处理大量的电子票据(如发票、收据等)是一项繁琐且耗时的任务。为了提高效率,自动化处理这些票据变得尤为重要。本项目旨在开发一个基于C#的应用程序,能够批量提取PDF电子票据中的关键信息(如发票编号、日期、金额等),并根据这些信息对PDF文件进行重命名,或将提取的区域内容导出为结构化的表格(如Excel文件)。这将大大减少人工操作,提高数据处理的准确性和效率。
技术选型
- 编程语言: WPF
- PDF处理库: iTextSharp 或 PdfPig
- 表格导出: EPPlus(用于生成Excel文件)
- 用户界面: Windows Forms 或 WPF(根据需求选择)
项目详细步骤
1. 环境准备
- 安装最新版本的 Visual Studio。
- 创建一个新的C# Windows Forms应用程序项目。
- 通过NuGet包管理器安装所需的库:
iTextSharp
或PdfPig
EPPlus
2. 设计用户界面
使用Windows Forms Designer设计一个简单的用户界面,包含以下控件:
Button
:用于选择PDF文件夹Button
:用于开始处理ProgressBar
:显示处理进度TextBox
:显示日志信息CheckBox
:选择是重命名PDF还是导出表格
3. 实现PDF文件选择功能
代码语言:javascript代码运行次数:0运行复制csharp复制private void btnSelectFolder_Click(object sender, EventArgs e)
{
using (var dialog = new FolderBrowserDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
txtFolderPath.Text = dialog.SelectedPath;
}
}
}
4. 实现PDF内容提取功能
使用iTextSharp
或PdfPig
库来提取PDF中的文本内容。以下以iTextSharp
为例:
csharp复制using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
private string ExtractTextFromPdf(string filePath)
{
using (PdfReader reader = new PdfReader(filePath))
{
string text = "";
for (int i = 1; i <= reader.NumberOfPages; i++)
{
text += PdfTextExtractor.GetTextFromPage(reader, i);
}
return text;
}
}
5. 实现内容解析与重命名功能
假设我们要从票据中提取发票编号,并将其作为PDF文件的新名称:
代码语言:javascript代码运行次数:0运行复制csharp复制private string ExtractInvoiceNumber(string pdfText)
{
// 假设发票编号在文本中以"Invoice Number:"开头
int startIndex = pdfText.IndexOf("Invoice Number:") + "Invoice Number:".Length;
int endIndex = pdfText.IndexOf("\n", startIndex);
return pdfText.Substring(startIndex, endIndex - startIndex).Trim();
}
private void RenamePdfFiles(string folderPath, List<string> pdfFiles)
{
foreach (var pdfFile in pdfFiles)
{
string fullPath = Path.Combine(folderPath, pdfFile);
string pdfText = ExtractTextFromPdf(fullPath);
string invoiceNumber = ExtractInvoiceNumber(pdfText);
if (!string.IsNullOrEmpty(invoiceNumber))
{
string newFileName = $"{invoiceNumber}.pdf";
string newFullPath = Path.Combine(folderPath, newFileName);
File.Move(fullPath, newFullPath);
}
}
}
6. 实现表格导出功能
使用EPPlus
库将提取的数据导出为Excel文件:
csharp复制using OfficeOpenXml;
private void ExportToExcel(List<string> invoiceNumbers, List<string> dates, List<decimal> amounts, string filePath)
{
using (ExcelPackage excelPackage = new ExcelPackage())
{
ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("Invoices");
// 添加表头
worksheet.Cells[1, 1].Value = "Invoice Number";
worksheet.Cells[1, 2].Value = "Date";
worksheet.Cells[1, 3].Value = "Amount";
// 添加数据
for (int i = 0; i < invoiceNumbers.Count; i++)
{
worksheet.Cells[i + 2, 1].Value = invoiceNumbers[i];
worksheet.Cells[i + 2, 2].Value = dates[i];
worksheet.Cells[i + 2, 3].Value = amounts[i];
}
// 保存文件
FileInfo excelFile = new FileInfo(filePath);
excelPackage.SaveAs(excelFile);
}
}
7. 整合功能与进度显示
在btnProcess_Click
事件中整合所有功能,并更新进度条和日志信息:
csharp复制private async void btnProcess_Click(object sender, EventArgs e)
{
string folderPath = txtFolderPath.Text;
if (string.IsNullOrEmpty(folderPath))
{
MessageBox.Show("请选择文件夹路径!");
return;
}
List<string> pdfFiles = Directory.GetFiles(folderPath, "*.pdf").ToList();
int totalFiles = pdfFiles.Count;
int processedFiles = 0;
foreach (var pdfFile in pdfFiles)
{
string fullPath = Path.Combine(folderPath, pdfFile);
string pdfText = ExtractTextFromPdf(fullPath);
string invoiceNumber = ExtractInvoiceNumber(pdfText);
if (!string.IsNullOrEmpty(invoiceNumber))
{
// 重命名PDF
string newFileName = $"{invoiceNumber}.pdf";
string newFullPath = Path.Combine(folderPath, newFileName);
File.Move(fullPath, newFullPath);
// 记录数据用于导出Excel
// 假设从pdfText中提取了日期和金额
string date = ExtractDate(pdfText);
decimal amount = ExtractAmount(pdfText);
// 添加到列表中
invoiceNumbers.Add(invoiceNumber);
dates.Add(date);
amounts.Add(amount);
}
processedFiles++;
progressBar.Value = (processedFiles * 100) / totalFiles;
txtLog.AppendText($"Processed: {pdfFile}\n");
}
// 导出Excel
if (chkExportExcel.Checked)
{
string excelFilePath = Path.Combine(folderPath, "Invoices.xlsx");
ExportToExcel(invoiceNumbers, dates, amounts, excelFilePath);
txtLog.AppendText($"Excel file exported to: {excelFilePath}\n");
}
MessageBox.Show("处理完成!");
}
8. 错误处理与优化
- 添加异常处理机制,确保程序在遇到错误时不会崩溃。
- 优化PDF文本提取逻辑,确保能够准确提取所需信息。
- 考虑多线程处理以提高性能,特别是在处理大量PDF文件时。
总结
通过上述步骤,您可以开发一个基于C#的桌面应用程序,批量提取PDF电子票据中的关键信息,并根据这些信息对PDF文件进行重命名或导出为表格。该项目不仅提高了工作效率,还减少了人工操作的错误率。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1747888336a4700561.html
评论列表(0条)