【扫描件PDF】如何批量识别扫描件PDF多个区域内容保存到Excel表格,基于WPF和腾讯OCR的详细解决方案
在很多实际业务场景中,需要对大量扫描件 PDF 中的特定区域内容进行识别并整理到 Excel 表格里,以下是一些常见的应用场景:物流运单扫描件 PDF 中包含发货人信息、收货人信息、货物信息等。批量识别这些区域内容到 Excel 表格,有助于物流企业对订单信息进行管理和跟踪。
详细代码步骤
1. 准备工作
- 创建 WPF 项目:打开 Visual Studio,创建一个新的 WPF 应用程序项目。
- 注册腾讯云账号并开通 OCR 服务:访问腾讯云官网(腾讯云 产业智变·云启未来 - 腾讯),注册账号并开通 OCR 服务,获取 API 密钥(SecretId 和 SecretKey)。
- 安装必要的 NuGet 包:在 Visual Studio 中,右键点击项目,选择 “管理 NuGet 包”,搜索并安装
Newtonsoft.Json
用于处理 JSON 数据,以及RestEase
用于进行 HTTP 请求。
2. 设计 WPF 界面
在 MainWindow.xaml
文件中设计一个简单的界面,包含选择 PDF 文件夹按钮、开始识别按钮和显示识别结果的文本框,代码如下:
xml
<Window x:Class="PdfOcrToExcel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="批量识别扫描件 PDF 内容到 Excel" Height="350" Width="525"><Grid><Button Content="选择 PDF 文件夹" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="150" Click="SelectPdfFolder_Click"/><TextBox x:Name="txtPdfFolderPath" HorizontalAlignment="Left" Height="23" Margin="170,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300" IsReadOnly="True"/><Button Content="开始识别" HorizontalAlignment="Left" Margin="10,50,0,0" VerticalAlignment="Top" Width="150" Click="StartRecognition_Click"/><TextBox x:Name="txtResult" HorizontalAlignment="Left" Height="200" Margin="10,90,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="500" IsReadOnly="True"/></Grid>
</Window>
3. 实现逻辑代码
在 MainWindow.xaml.cs
文件中实现选择文件夹、识别 PDF 区域内容并保存到 Excel 的逻辑,代码如下:
csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using Newtonsoft.Json;
using RestEase;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Xls;// 定义腾讯 OCR API 接口
[SerializationMethods(Query = QuerySerializationMethod.Serialized)]
public interface ITencentOcrApi
{[Post("https://ocr.tencentcloudapi.com/")]Task<HttpResponseMessage> DetectGeneralText([Body(BodySerializationMethod.UrlEncoded)] Dictionary<string, string> parameters);
}namespace PdfOcrToExcel
{public partial class MainWindow : Window{private string pdfFolderPath;private const string SecretId = "your_secret_id";private const string SecretKey = "your_secret_key";public MainWindow(){InitializeComponent();}private void SelectPdfFolder_Click(object sender, RoutedEventArgs e){var dialog = new System.Windows.Forms.FolderBrowserDialog();System.Windows.Forms.DialogResult result = dialog.ShowDialog();if (result == System.Windows.Forms.DialogResult.OK){pdfFolderPath = dialog.SelectedPath;txtPdfFolderPath.Text = pdfFolderPath;}}private async void StartRecognition_Click(object sender, RoutedEventArgs e){if (string.IsNullOrEmpty(pdfFolderPath)){MessageBox.Show("请先选择 PDF 文件夹!");return;}// 创建 Excel 工作簿Workbook workbook = new Workbook();Worksheet worksheet = workbook.Worksheets[0];int rowIndex = 1;// 遍历 PDF 文件夹中的所有 PDF 文件string[] pdfFiles = Directory.GetFiles(pdfFolderPath, "*.pdf");foreach (string pdfFile in pdfFiles){try{// 加载 PDF 文件PdfDocument pdf = new PdfDocument();pdf.LoadFromFile(pdfFile);// 假设需要识别的区域(这里简单示例一个区域,可根据实际情况修改)PdfRectangle rect = new PdfRectangle(100, 100, 200, 50);// 将 PDF 页面转换为图片System.Drawing.Bitmap image = pdf.Pages[0].ToImage(0, rect);byte[] imageBytes = ImageToByteArray(image);// 调用腾讯 OCR 进行识别string ocrResult = await PerformOcr(imageBytes);// 将识别结果写入 Excel 单元格worksheet.Range[rowIndex, 1].Text = Path.GetFileName(pdfFile);worksheet.Range[rowIndex, 2].Text = ocrResult;rowIndex++;pdf.Close();}catch (Exception ex){MessageBox.Show($"处理文件 {pdfFile} 时出错:{ex.Message}");}}// 保存 Excel 文件workbook.SaveToFile("ExtractedData.xlsx", ExcelVersion.Version2013);MessageBox.Show("信息提取完成,已保存为 ExtractedData.xlsx");}private byte[] ImageToByteArray(System.Drawing.Bitmap image){using (MemoryStream ms = new MemoryStream()){image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);return ms.ToArray();}}private async Task<string> PerformOcr(byte[] imageBytes){var api = RestClient.For<ITencentOcrApi>("https://ocr.tencentcloudapi.com/");// 生成签名等参数(此处简化,实际需根据腾讯云文档生成正确签名)var parameters = new Dictionary<string, string>{{ "Action", "DetectGeneralText" },{ "Version", "2018-11-19" },{ "Region", "ap-guangzhou" },{ "SecretId", SecretId },{ "Timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() },{ "Nonce", new Random().Next(100000).ToString() },{ "ImageBase64", Convert.ToBase64String(imageBytes) }};// 调用 APIvar response = await api.DetectGeneralText(parameters);string responseContent = await response.Content.ReadAsStringAsync();// 解析 JSON 结果var result = JsonConvert.DeserializeObject<dynamic>(responseContent);string text = "";if (result.Response.TextDetections != null){foreach (var detection in result.Response.TextDetections){text += detection.DetectedText;}}return text;}}
}
4. 代码解释
- 选择 PDF 文件夹:点击 “选择 PDF 文件夹” 按钮,弹出文件夹选择对话框,用户选择包含扫描件 PDF 的文件夹,选择结果会显示在文本框中。
- 开始识别:点击 “开始识别” 按钮,程序会遍历所选文件夹中的所有 PDF 文件。对于每个 PDF 文件,将指定区域转换为图片,调用腾讯 OCR API 进行文字识别,将识别结果和文件名写入 Excel 表格。最后保存 Excel 文件为
ExtractedData.xlsx
。 - 腾讯 OCR 调用:使用
RestEase
库进行 HTTP 请求,将图片转换为 Base64 编码后作为参数传递给腾讯 OCR API。解析 API 返回的 JSON 结果,提取识别出
相关文章:
【扫描件PDF】如何批量识别扫描件PDF多个区域内容保存到Excel表格,基于WPF和腾讯OCR的详细解决方案
在很多实际业务场景中,需要对大量扫描件 PDF 中的特定区域内容进行识别并整理到 Excel 表格里,以下是一些常见的应用场景:物流运单扫描件 PDF 中包含发货人信息、收货人信息、货物信息等。批量识别这些区域内容到 Excel 表格,有助…...
Django开发入门 – 3.用Django创建一个Web项目
Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境,以及创建第一个Django Web应用项目,并能够运行Django Web服务器。 创建该Django项目需…...
C# OpenCV机器视觉:OSTU算法实现背景差分的自适应分割
在一个热闹的科技公司里,阿强是一个负责图像分析的员工。他的日常工作就是从各种复杂的图像中提取出有用的信息,可这可不是一件轻松的事情哦 最近,阿强接到了一个艰巨的任务:要从一堆嘈杂的监控图像中分离出运动的物体,…...
SIPp的参数及命令示例
以下是SIPp参数的分类表格整理,方便快速查阅和使用: SIPp 参数分类表格 分类参数描述默认值示例基本参数-sc指定XML场景文件(客户端模式)无-sc uac.xml-sd指定XML场景文件(服务器端模式)无-sd uas.xml-i本…...
【Mac排错】ls: command not found 终端命令失效的解决办法
【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal,并且为她定制了不同的Profile。 这样,看起来她可以在不同季节&…...
【OneAPI】通过网页预渲染让搜索引擎收录网页
API简介 网页预渲染,适用于动态网页以及单页面的SEO,支持网页缓存。 您无须更改代码即可让搜索引擎收录您的网页。只要将需要预渲染的页面转发的本接口即可。 如果您使用Nginx作为网页服务器,推荐使用以下配置: #您的网站locat…...
51单片机(国信长天)矩阵键盘的基本操作
在CT107D单片机综合训练平台上,首先将J5处的跳帽接到1~2引脚,使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号后(不做去抖动),待按键松开后,在数码管的第一位显示相应的数字:从左至右&…...
git命令行删除远程分支、删除远程提交日志
目录 1、从本地通过命令行删除远程git分支2、删除已 commit 并 push 的记录 1、从本地通过命令行删除远程git分支 git push origin --delete feature/feature_xxx 删除远程分支 feature/feature_xxx 2、删除已 commit 并 push 的记录 git reset --hard 7b5d01xxxxxxxxxx 恢复到…...
05-多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 方法一:哈希表法 通过哈希表来记录每个元素出现的次数,…...
一个简单的Windows TCP服务器实现
初始化 WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr { 0x00 }; struct sockaddr_in clientAddr { 0x00 }; int clientAddrLen sizeof(clientAddr);if (WSAStartup(MAKEWORD(2, 2), &wsaData) ! 0) {printf("WSAStartup f…...
salesforce 中 Account 转移给新 Owner 后如何仅转移 Case,而不转移 Opportunity
在 Salesforce 中,当更改 Account Owner 时,系统默认会将所有相关的 Opportunities(商机) 和 Cases(案例) 也一并转移给新的 Account Owner。如果你希望 仅转移 Case,而不转移 Opportunities&am…...
Spring Boot 中的日志配置
文章目录 Spring Boot 中日志配置的源码分析1. Spring Boot 日志框架的选择与自动配置2. 日志自动配置与默认行为3. 日志系统的核心组件:Logger 和 LoggerFactory4. 日志配置文件的解析配置日志级别配置日志输出格式和目标 5. 日志级别的控制自定义日志级别 6. 自定…...
[前端]CRX持久化
在 Chrome 扩展开发中,持久化保存数据通常使用 Chrome 的 storage API。storage API 提供了两种存储选项:local 和 sync。使用 local 存储的数据保存在本地浏览器中,只能在同一设备上访问。使用 sync 存储的数据可以在用户登录其 Google 帐户…...
绕组电感 - Ansys Maxwell 磁通链与电流
在本博客中,我将演示如何使用 Ansys Maxwell 中磁瞬态求解器的磁通链和电流结果来计算绕组电感。Ansys Maxwell 磁瞬态求解器在场计算中考虑了涡流效应,我将展示一种使用磁通链和电流结果来计算绕组电感的简单方法。 实际上,电感是非线性的…...
ComfyUI 安装教程:macOS 和 Linux 统一步骤
本教程将详细介绍如何在 macOS 和 Linux 上安装 ComfyUI。我们将从 安装 Anaconda 开始,到安装 PyTorch 和 ComfyUI,最后提供一些常见问题的解决方法。 macOS和linux安装步骤很相似 可以按照1️⃣安装anaconda2️⃣安装python3️⃣torch4️⃣comfyui Co…...
SMTP和POP3协议
SMTP和POP3协议 SMTP(简单邮件传输协议)和POP3(邮局协议版本3)是电子邮件系统中用于发送和接收邮件的核心协议。以下是它们的详细说明: 1. SMTP(Simple Mail Transfer Protocol) SMTP和POP3分…...
【C语言】#define和typedef的区别
文章目录 1.define特点 2.typedef特点 1.define #define 是预处理器指令,用来进行宏定义。它在编译之前由预处理器处理,主要用于定义常量、简单的函数宏或者代码片段的替换。 特点 文本替换:#define 主要用于文本替换,在编译前…...
2025清华:DeepSeek从入门到精通.pdf(附下载)
本文是一份关于如何深入理解和使用DeepSeek技术的全面指南,由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队编撰。DeepSeek是一家中国科技公司,专注于通用人工智能(AGI)的研发,其开源推…...
Linux运维——用户管理
Linux用户管理 一、Linux用户管理要点二、常用命令2.1、groupadd2.2、groupdel2.3、groupmod2.4、groups2.5、useradd2.6、userdel2.7、passwd2.9、su2.10、sudo2.10.1、给普通用户授权 sudo2.10.2、 免密码授权 sudo 一、Linux用户管理要点 创建用户组 - 使用 groupadd删除用…...
Redis持久化的两种方式:RDB和AOF
redis中的数据存储在缓存中,如果没有持久化的策略,Redis一旦宕机,那么将会导致数据丢失;因此redis提供了以下两种持久化方式:RDB和AOF 一般来说,大部分公司对这两种方式都是同时开启的 一、RDB RDB策略全…...
百度高德地图坐标转换
百度地图和高德地图的侧重点不太一样。同样一个地名,在百度地图网站上搜索到的地点可能是商业网点,在高德地图网站上搜索到的地点可能是自然行政地点。 高德地图api 在高德地图中,搜索地名,如“乱石头川”,该地名会出…...
LIMO:上海交大的工作 “少即是多” LLM 推理
25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型(LLM)中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据(通常超过 100,000 个示例),但本文展…...
Windows逆向工程入门之汇编环境搭建
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…...
Git安全回退历史版本
Git安全回退历史版本 方法特点git revert保留所有中间提交历史,生成显式的反向提交,适合精确撤销特定提交。直接提交快速生成一个回退提交,无需处理多个撤销操作,适合简单回退到某个旧版本。 git revert 仅回退一个版本 git r…...
消费电子产品中的噪声对TPS54202的影响
本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…...
ASP.NET Core 外部向SignalR的Hub发消息
实现 Hub类中的方法只应该用于消息的发布,而不应该用来写业务逻辑,SignalR中客户端给服务器端传递消息的超时时间为30s,如果对Hub类中的方法的调用执行时间超过30s,程序就会报错。可以在MVC控制器、托管服务等外部向客户端推送消…...
Ubuntu 多版本 gcc 配置常用命令备忘
用的频率不高,总忘记具体参数 1,安装多版本 gcc 以 gcc-11 和12 为例: sudo apt-get install gcc-11 gcc-12 sudo apt-get install gcc-11 gcc-12 2,配置多版本 gcc gcc 与 g 一起配置进数据库中: sudo update-a…...
树形表查询方法
树形数据表在开发中会经常遇到,parentid字段为父结点ID,它是树型结构的标志字段。 查询方法: 1.自连接查询 如果树的层级固定可以使用表的自链接去查询,比如:我们只查询两级课程分类,可以用下边的SQL selectone.id …...
OpenStack-Train版-Allinone自动化部署脚本
一、环境准备 操作系统:CentOS 7 或以上版本 建议配置: CPU:8 核或以上 内存:16 GB 或以上 磁盘:500 GB 或以上 网络配置: 确保虚拟机已配置静态 IP 地址 确保虚拟机可以正常访问外部网络 二、自动…...
[笔记] 汇编杂记(持续更新)
文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…...
Hono.js入门指南_从零开始构建Web应用
1. 引言 项目背景与动机 随着现代Web开发的快速发展,构建高效、轻量且易于维护的Web应用变得越来越重要。Hono.js作为一个轻量级的Node.js框架,以其简洁的API和高效的性能吸引了众多开发者。本文将带你从零开始,逐步构建一个功能齐全的Web应用,帮助你快速上手Hono.js。 …...
后盾人JS -- 模块化开发
开发模块管理引擎 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…...
python-leetcode 23.回文链表
题目: 给定单链表的头节点head,判断该链表是否为回文链表,如果是,返回True,否则,返回False 输入:head[1,2,2,1] 输出:true 方法一:将值复制到数组中后用双指针法 有两种常用的列表实现&#…...
echarts 3d中国地图飞行线
一、3D中国地图 1. 一定要使用 echarts 5.0及以上的版本; 2. echarts 5.0没有内置中国地图了。点击下载 china.json; 3. 一共使用了四层地图。 (1)第一层是中国地图各省细边框和展示南海诸岛; (2)第二层是…...
Vivado IP之浮点数Floating-point
在Vivado的IP Catalog中搜索Floating-point即可找到该IP Operation Selection界面 1.绝对值,即result|A| 2.累加 3.两个浮点数的加法或者减法 4.两个浮点数进行比较 5.两个浮点数的除法 6.求指数,即e^A 7.定点数到浮点数的转化 8.浮点数转化为定…...
只需三步!5分钟本地部署deep seek——MAC环境
MAC本地部署deep seek 第一步:下载Ollama第二步:下载deepseek-r1模型第三步:安装谷歌浏览器插件 第一步:下载Ollama 打开此网址:https://ollama.com/,点击下载即可,如果网络比较慢可使用文末百度网盘链接 注:Ollama是…...
DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)
DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型,在架构设计、性能表现、应用场景等方面存在显著差异,以下从多个维度进行对比分析: 一、架构与训练效率 架构设计 DeepSeek:采用混合专家(MoE)框架…...
1 推荐系统概述
推荐系统概述 1 推荐系统的意义平台方信息生产者(物品)信息消费者(用户)推荐和搜索的区别 2 推荐系统架构系统架构算法架构 3 推荐系统技术栈算法画像层召回/粗排精排重排序 工程 1 推荐系统的意义 信息生产者(平台方…...
JavaEE架构
一.架构选型 1.VM架构 VM架构通常指的是虚拟机(Virtual Machine)的架构。虚拟机是一种软件实现的计算机系统,它模拟了物理计算机的功能,允许在单一物理硬件上运行多个操作系统实例。虚拟机架构主要包括以下几个关键组件ÿ…...
C++ labmbd表达式
文章目录 C++ Lambda 表达式详解1. Lambda 表达式的组成部分:2. Lambda 语法示例(1) 最简单的 Lambda(2) 带参数的 Lambda(3) 指定返回类型的 Lambda3. 捕获外部变量(1) 值捕获(复制)(2) 引用捕获(3) 捕获所有变量4. Lambda 在 STL 中的应用5. Lambda 作为 `std::function`6…...
当Axure遇见DeepSeek:设计工具的革命性进化
从传统的平面设计软件到如今的交互原型工具,设计工具经历了多次革命性的进化。然而,随着人工智能技术的不断发展,设计工具正面临又一次重大的变革。Axure,作为设计界知名的原型设计工具,以其强大的功能和灵活的操作性&…...
[LeetCode] day19 454. 四数相加 II
题目链接 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&…...
FPGA开发技能(10)热电偶测温ADS1118方案
文章目录 1.热电偶原理2.ADS1118方案2.1ADS介绍2.2原理设计2.3实物连接图2.4测温原理 3.误差校准3.1查表法3.2冷端补偿法 4.SPI操作时序5.传送门 1.热电偶原理 两个不同材料的金属线一端在同一结点连接,另一端放在被测温点,则二者会产生一定的压差&…...
CNN-day5-经典神经网络LeNets5
经典神经网络-LeNets5 1998年Yann LeCun等提出的第一个用于手写数字识别问题并产生实际商业(邮政行业)价值的卷积神经网络 参考:论文笔记:Gradient-Based Learning Applied to Document Recognition-CSDN博客 1 网络模型结构 …...
【DeepSeek学Cuda】NVidia GPU指令集架构-Load和Cache
https://zhuanlan.zhihu.com/p/692445145 当warp内的线程访问同一个constant位置时,其是确定的latency的(和访问寄存器一样) latency 什么意思 当 warp 内的线程访问同一个 constant 位置时,其是确定的 latency 的(和…...
[免费]Springboot+Vue(带推荐算法)网上购物商城系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue(带推荐算法)网上购物商城系统,分享下哈。 项目视频演示 【免费】SpringbootVue(带推荐算法)网上购物商城系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 根据需求分析文档确定的…...
车载测试工具 --- CANoe VH6501 进行Not Acknowledge (NAck) 测试
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
JVM调优参数分类
JVM调优参数分类 一、内存管理参数(堆/非堆) 1. 堆内存设置 参数格式功能说明典型场景值记忆口诀-Xms初始堆大小-Xms4gXms起始大小-Xmx最大堆大小-Xmx8gXmx最大上限-Xmn年轻代大小-Xmn2gXmn年轻代-XX:NewRatio老年代与年轻代比例-XX:NewRatio2比例老/新…...
高阶C语言|枚举与联合
💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴…...
通过魔搭社区本地下载大语言模型及API接口调用模型实现
一、背景 在之前的博文:CSDN中,我们已经详细介绍了如何安装Python环境和一些必要的库和访问Transformers库的大模型。然而,在实际操作过程中,我们发现模型的下载或者调用需要访问Hugging Face上的Transformers库,这是一个国外的网…...