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

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

2025-03-15 13:03:39 前端知识 前端哥 963 70 我要收藏

以下是一个基于 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 处理库。
转载请注明出处或者链接地址:https://www.qianduange.cn//article/23746.html
标签
阿里云wpf
评论
会员中心 联系我 留言建议 回顶部
复制成功!