【工具教程】批量提取PDF电子票据内容给PDF重命名或将区域内容导出表格,超简单

项目背景在企业和财务部门中,处理大量的电子票据(如发票、收据等)是一项繁琐且耗时的任务。为了提高效率,自动化处理这些票据变得尤为重要。本项目旨在开发一个基于C#的应用程序,能够批量提取PDF电子票据中的关键信息(如发票编号、日期、金额等),

【工具教程】批量提取PDF电子票据内容给PDF重命名或将区域内容导出表格,超简单

项目背景

在企业和财务部门中,处理大量的电子票据(如发票、收据等)是一项繁琐且耗时的任务。为了提高效率,自动化处理这些票据变得尤为重要。本项目旨在开发一个基于C#的应用程序,能够批量提取PDF电子票据中的关键信息(如发票编号、日期、金额等),并根据这些信息对PDF文件进行重命名,或将提取的区域内容导出为结构化的表格(如Excel文件)。这将大大减少人工操作,提高数据处理的准确性和效率。

技术选型

  • ​编程语言​​: WPF
  • ​PDF处理库​​: iTextSharp 或 PdfPig
  • ​表格导出​​: EPPlus(用于生成Excel文件)
  • ​用户界面​​: Windows Forms 或 WPF(根据需求选择)

项目详细步骤

1. 环境准备
  • 安装最新版本的 Visual Studio。
  • 创建一个新的C# Windows Forms应用程序项目。
  • 通过NuGet包管理器安装所需的库:
    • iTextSharpPdfPig
    • 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内容提取功能

使用iTextSharpPdfPig库来提取PDF中的文本内容。以下以iTextSharp为例:

代码语言:javascript代码运行次数:0运行复制
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文件:

代码语言:javascript代码运行次数:0运行复制
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事件中整合所有功能,并更新进度条和日志信息:

代码语言:javascript代码运行次数:0运行复制
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

相关推荐

  • 【工具教程】批量提取PDF电子票据内容给PDF重命名或将区域内容导出表格,超简单

    项目背景在企业和财务部门中,处理大量的电子票据(如发票、收据等)是一项繁琐且耗时的任务。为了提高效率,自动化处理这些票据变得尤为重要。本项目旨在开发一个基于C#的应用程序,能够批量提取PDF电子票据中的关键信息(如发票编号、日期、金额等),

    11小时前
    50

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信