当前位置: 首页 > article >正文

【自动化办公】基于WPF和阿里云API的高效识别PDF多个区域内容并保存至JSON文件,再将JSON文件转换解析为表格输出

以下是一个基于 WPF 和阿里云 OCR API 实现高效识别 PDF 多个区域内容,保存至 JSON 文件,再将 JSON 文件转换解析为表格输出的详细解决方案。

整体思路

  1. 准备工作:注册阿里云账号,开通 OCR 服务并获取 AccessKey ID 和 AccessKey Secret。创建 WPF 项目,安装必要的 NuGet 包,如Spire.PDF用于处理 PDF,Newtonsoft.Json用于处理 JSON 数据。
  2. WPF 界面设计:设计一个简单的界面,包含选择 PDF 文件、开始识别、保存 JSON 和输出表格等操作按钮。
  3. PDF 区域识别:读取 PDF 文件,截取指定区域的图像,调用阿里云 OCR API 进行文字识别。
  4. 保存至 JSON 文件:将识别结果整理成 JSON 格式并保存到本地文件。
  5. JSON 文件解析并输出表格:读取 JSON 文件,解析其中的数据并输出为表格。

详细步骤和代码实现

1. 准备工作
  • 注册阿里云账号,开通 OCR 服务,获取 AccessKey ID 和 AccessKey Secret。
  • 创建一个新的 WPF 项目。
  • 在项目中安装Spire.PDFNewtonsoft.Json NuGet 包。
2. WPF 界面设计(MainWindow.xaml

xml

<Window x:Class="PdfOcrToJsonTable.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PDF OCR to JSON and Table" Height="350" Width="525">
    <Grid>
        <Button Content="选择 PDF 文件" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" Width="100" Click="SelectPdfFile_Click"/>
        <TextBox x:Name="PdfFilePathTextBox" HorizontalAlignment="Left" Height="23" Margin="130,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="350" IsReadOnly="True"/>
        <Button Content="开始识别" HorizontalAlignment="Left" Margin="20,60,0,0" VerticalAlignment="Top" Width="100" Click="StartRecognition_Click"/>
        <Button Content="保存为 JSON" HorizontalAlignment="Left" Margin="130,60,0,0" VerticalAlignment="Top" Width="100" Click="SaveToJson_Click"/>
        <Button Content="输出表格" HorizontalAlignment="Left" Margin="240,60,0,0" VerticalAlignment="Top" Width="100" Click="OutputTable_Click"/>
        <TextBox x:Name="ResultTextBox" HorizontalAlignment="Left" Height="200" Margin="20,100,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="460" IsReadOnly="True"/>
    </Grid>
</Window>
3. WPF 界面逻辑(MainWindow.xaml.cs

csharp

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using Newtonsoft.Json;
using Spire.Pdf;
using Spire.Pdf.Graphics;

namespace PdfOcrToJsonTable
{
    public partial class MainWindow : Window
    {
        private string pdfFilePath;
        private List<string> recognitionResults = new List<string>();
        private const string ACCESS_KEY_ID = "your_access_key_id";
        private const string ACCESS_KEY_SECRET = "your_access_key_secret";
        private const string OCR_URL = "https://ocr.cn-hangzhou.aliyuncs.com/";

        public MainWindow()
        {
            InitializeComponent();
        }

        private void SelectPdfFile_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "PDF 文件 (*.pdf)|*.pdf";
            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                pdfFilePath = openFileDialog.FileName;
                PdfFilePathTextBox.Text = pdfFilePath;
            }
        }

        private async void StartRecognition_Click(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(pdfFilePath))
            {
                MessageBox.Show("请选择 PDF 文件!");
                return;
            }

            try
            {
                // 定义要识别的区域(示例:多个矩形区域)
                List<PdfRectangle> regions = new List<PdfRectangle>
                {
                    new PdfRectangle(100, 100, 200, 50),
                    new PdfRectangle(300, 200, 150, 30)
                };

                // 读取 PDF 文件
                PdfDocument pdfDocument = new PdfDocument();
                pdfDocument.LoadFromFile(pdfFilePath);

                foreach (PdfRectangle region in regions)
                {
                    // 截取指定区域的图像
                    System.Drawing.Image image = pdfDocument.Pages[0].CreateImage(region);
                    MemoryStream ms = new MemoryStream();
                    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                    byte[] imageBytes = ms.ToArray();
                    string base64Image = Convert.ToBase64String(imageBytes);

                    // 调用阿里云 OCR API 进行识别
                    string result = await AliyunOcr(base64Image);
                    recognitionResults.Add(result);

                    ResultTextBox.Text += $"区域识别结果:{result}\n";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"发生错误:{ex.Message}");
            }
        }

        private async Task<string> AliyunOcr(string base64Image)
        {
            using (HttpClient client = new HttpClient())
            {
                var requestData = new
                {
                    image = base64Image
                };
                string jsonData = JsonConvert.SerializeObject(requestData);
                var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

                // 设置请求头,这里需要根据阿里云 OCR API 文档进行完整的签名和请求头设置
                client.DefaultRequestHeaders.Add("Authorization", $"acs {ACCESS_KEY_ID}:{ACCESS_KEY_SECRET}");

                HttpResponseMessage response = await client.PostAsync(OCR_URL, content);
                string responseContent = await response.Content.ReadAsStringAsync();
                var ocrResult = JsonConvert.DeserializeObject<dynamic>(responseContent);
                string text = "";
                foreach (var item in ocrResult.Data)
                {
                    text += item.Text;
                }
                return text;
            }
        }

        private void SaveToJson_Click(object sender, RoutedEventArgs e)
        {
            if (recognitionResults.Count == 0)
            {
                MessageBox.Show("请先进行识别!");
                return;
            }

            var jsonData = new
            {
                Results = recognitionResults
            };
            string jsonString = JsonConvert.SerializeObject(jsonData, Formatting.Indented);
            File.WriteAllText("output.json", jsonString);
            MessageBox.Show("已保存为 JSON 文件!");
        }

        private void OutputTable_Click(object sender, RoutedEventArgs e)
        {
            if (!File.Exists("output.json"))
            {
                MessageBox.Show("请先保存为 JSON 文件!");
                return;
            }

            string jsonContent = File.ReadAllText("output.json");
            var data = JsonConvert.DeserializeObject<dynamic>(jsonContent);

            StringBuilder table = new StringBuilder();
            table.AppendLine("| 区域编号 | 识别结果 |");
            table.AppendLine("| --- | --- |");
            for (int i = 0; i < data.Results.Count; i++)
            {
                table.AppendLine($"| {i + 1} | {data.Results[i]} |");
            }

            ResultTextBox.Text = table.ToString();
        }
    }
}

代码说明

  1. 选择 PDF 文件:通过SelectPdfFile_Click方法打开文件选择对话框,选择要处理的 PDF 文件。
  2. 开始识别:在StartRecognition_Click方法中,定义要识别的区域,读取 PDF 文件,截取指定区域的图像,调用AliyunOcr方法进行识别,并将识别结果显示在文本框中。
  3. 调用阿里云 OCR API:在AliyunOcr方法中,将图像转换为 Base64 编码,构造请求数据并发送 POST 请求到阿里云 OCR API,解析返回的 JSON 数据,提取识别结果。
  4. 保存为 JSON 文件:在SaveToJson_Click方法中,将识别结果整理成 JSON 格式并保存到output.json文件中。
  5. 输出表格:在OutputTable_Click方法中,读取output.json文件,解析其中的数据并以表格形式输出到文本框中。

注意事项

  • 请将ACCESS_KEY_IDACCESS_KEY_SECRET替换为你自己的阿里云 AccessKey ID 和 AccessKey Secret。
  • 代码中的阿里云 OCR API 请求头设置仅为示例,实际使用时需要根据阿里云 OCR API 文档进行完整的签名和请求头设置。
  • Spire.PDF库在某些情况下可能需要付费使用,你可以根据实际情况选择其他开源的 PDF 处理库。

http://www.kler.cn/a/539487.html

相关文章:

  • postgresql 游标(cursor)的使用
  • Oracle迁移到MySQL
  • 基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • 单例模式几种实现
  • win32汇编环境,结构体的使用示例一
  • Postman接口测试:postman设置接口关联,实现参数化
  • pytest生成报告no tests ran in 0.01s
  • Java WORD和PDF互相转换以及数据填充示例
  • Windows Docker笔记-Docker容器操作
  • react 17 源码调试环境搭建(超简单)
  • springboot项目的单元测试
  • vue.js v-model实现原理
  • 编译QCefView时出现的setlocal命令错误
  • 【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现
  • Linux之安装docker
  • MySQL 数据库的体系架构
  • 【虚幻引擎UE】UE4.23到UE5.5的核心功能变化
  • 【Linux基础】Linux下常用的系统命令
  • redis缓存应用
  • 苹果笔记本安装jmeter
  • React Native 列表组件:FlashList、FlatList 及更多
  • AI刷题-融合目标计算问题
  • 蓝桥杯数组分割
  • Redis持久化的两种方式:RDB和AOF
  • RNA研究的新发现,人类未来可能控制基因遗传
  • 什么是 Elasticsearch?