【自动化办公】基于WPF和阿里云API的高效识别PDF多个区域内容并保存至JSON文件,再将JSON文件转换解析为表格输出
以下是一个基于 WPF 和阿里云 OCR API 实现高效识别 PDF 多个区域内容,保存至 JSON 文件,再将 JSON 文件转换解析为表格输出的详细解决方案。
整体思路
- 准备工作:注册阿里云账号,开通 OCR 服务并获取 AccessKey ID 和 AccessKey Secret。创建 WPF 项目,安装必要的 NuGet 包,如
Spire.PDF
用于处理 PDF,Newtonsoft.Json
用于处理 JSON 数据。 - WPF 界面设计:设计一个简单的界面,包含选择 PDF 文件、开始识别、保存 JSON 和输出表格等操作按钮。
- PDF 区域识别:读取 PDF 文件,截取指定区域的图像,调用阿里云 OCR API 进行文字识别。
- 保存至 JSON 文件:将识别结果整理成 JSON 格式并保存到本地文件。
- JSON 文件解析并输出表格:读取 JSON 文件,解析其中的数据并输出为表格。
详细步骤和代码实现
1. 准备工作
- 注册阿里云账号,开通 OCR 服务,获取 AccessKey ID 和 AccessKey Secret。
- 创建一个新的 WPF 项目。
- 在项目中安装
Spire.PDF
和Newtonsoft.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();
}
}
}
代码说明
- 选择 PDF 文件:通过
SelectPdfFile_Click
方法打开文件选择对话框,选择要处理的 PDF 文件。 - 开始识别:在
StartRecognition_Click
方法中,定义要识别的区域,读取 PDF 文件,截取指定区域的图像,调用AliyunOcr
方法进行识别,并将识别结果显示在文本框中。 - 调用阿里云 OCR API:在
AliyunOcr
方法中,将图像转换为 Base64 编码,构造请求数据并发送 POST 请求到阿里云 OCR API,解析返回的 JSON 数据,提取识别结果。 - 保存为 JSON 文件:在
SaveToJson_Click
方法中,将识别结果整理成 JSON 格式并保存到output.json
文件中。 - 输出表格:在
OutputTable_Click
方法中,读取output.json
文件,解析其中的数据并以表格形式输出到文本框中。
注意事项
- 请将
ACCESS_KEY_ID
和ACCESS_KEY_SECRET
替换为你自己的阿里云 AccessKey ID 和 AccessKey Secret。 - 代码中的阿里云 OCR API 请求头设置仅为示例,实际使用时需要根据阿里云 OCR API 文档进行完整的签名和请求头设置。
Spire.PDF
库在某些情况下可能需要付费使用,你可以根据实际情况选择其他开源的 PDF 处理库。