WPF PDF发票信息取得
时间:2019-02-19
本文章向大家介绍WPF PDF发票信息取得,主要包括WPF PDF发票信息取得使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
利用Spire获取PDF版发票信息
xaml(基础UI)
<Window x:Class="storage.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:storage"
mc:Ignorable="d" ResizeMode="CanMinimize"
Title="MainWindow" Height="200" Width="435">
<Grid>
<TextBlock x:Name="Display" Width="200" Height="25" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="15" Margin="0,20,0,0" TextAlignment="Center">TextBlock</TextBlock>
<Button x:Name="Open" Width="70" Height="25" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="40,60,0,0">Open</Button>
<Button x:Name="Check" Width="70" Height="25" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,60,40,0">Check</Button>
<ProgressBar x:Name="processBar" Width="350" Height="30" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20"></ProgressBar>
</Grid>
</Window>
C#(后台)
using Microsoft.Win32;
using Spire.Pdf;
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows;
namespace storage
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private string[] pdfFileName;
public MainWindow()
{
InitializeComponent();
Open.Click += Open_Click;
Check.Click += Check_Click;
Display.Text = string.Empty;
}
private void Open_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择文件";
openFileDialog.Filter = "pdf File|*.pdf";
openFileDialog.FileName = "选择文件夹.";
openFileDialog.Multiselect = true; //允许同时选择多个文件
bool? result = openFileDialog.ShowDialog();
if (result == true)
{
pdfFileName = openFileDialog.FileNames;
Display.Text = $"Total:{pdfFileName.Length} files";
}
}
private void Check_Click(object sender, RoutedEventArgs e)
{
processBar.Value = 0;
Thread tr = new Thread(ReadSource);
tr.Start();
Open.IsEnabled = false;
Check.IsEnabled = false;
}
private void ReadSource()
{
try
{
string pdfText = string.Empty;
double total = 0.0;
PdfDocument document = new PdfDocument();
for (int i = 0; i < pdfFileName.Length; i++)
{
document.LoadFromFile(pdfFileName[i]);
StringBuilder content = new StringBuilder();
content.Append(document.Pages[0].ExtractText());
string fileName = pdfFileName[i].Replace(".pdf", ".txt");
File.WriteAllText(fileName, content.ToString());
string pdfSource = File.ReadAllText(fileName);
int textStart = pdfSource.IndexOf("(小写)");
pdfSource = pdfSource.Substring(textStart);
int textEnd = pdfSource.IndexOf(" ");
pdfSource = pdfSource.Substring(5, textEnd - 7);
string storageNumber = pdfFileName[i].Substring(pdfFileName[i].Length - 12, 8);
pdfText += "税号: " + storageNumber + " 价格: " + pdfSource + "\r\n";
total += double.Parse(pdfSource);
Dispatcher.Invoke(() => { processBar.Value += 100 / (double)pdfFileName.Length; });
}
Dispatcher.Invoke(() => { Display.Text = "completed"; });
pdfText += "总价格: " + total.ToString();
File.WriteAllText("Pdf.txt", pdfText);
System.Diagnostics.Process.Start("Pdf.txt");
}
catch (Exception ex)
{
Dispatcher.Invoke(() => { Display.Text = ex.Message; });
return;
}
finally
{
Dispatcher.Invoke(() =>
{
Open.IsEnabled = true;
Check.IsEnabled = true;
});
}
}
}
}
- 【干货】深入理解自编码器(附代码实现)
- SlopOne推荐算法(附Python源码)
- 后缀数组(一堆干货)
- POJ 1741 Tree(树的点分治,入门题)
- hihoCoder 1039:字符消除(字符串处理)
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
- hihoCoder 1051 补提交卡(贪心,枚举)
- LCA 最近公共祖先
- RMQ问题(线段树算法,ST算法优化)
- 统计0到n之间1的个数[数学,动态规划dp](经典,详解)
- Selenium2+python自动化40-cookie相关操作
- 【干货】PyTorch实例:用ResNet进行交通标志分类
- 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
- Selenium2+python自动化41-绕过验证码(add_cookie)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用SAP C4C自定义BO实现自定义的Number Range
- 限流算法简介及Guava RateLimiter令牌桶限流介绍
- K8S的名称空间创建&&版本的升级、回滚操作
- SAP Cloud for Customer CLR(Code List Restriction)的一种高级用法
- SAP WebClient UI One Hit Navigation的实现方法
- 【打包构建】Mac下使用expect实现执行sudo命令时自动输入密码
- ASP.NET Core 奇淫技巧之SPA部署
- SAP Cloud for Customer Rule Editor的使用方法和底层工作原理
- (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS
- 72-STM32+ESP8266+AIR202基本控制篇-移植使用-移植Android的MQTT包到自己的工程项目
- 用上Latex实现编辑伪代码
- TensorFlow交叉熵函数(cross_entropy)·理解
- 第05期:Prometheus 数据查询(一)
- 技术分享 | MySQL 复制那点事 - Seconds_behind_Master 参数调查笔记
- 线程有多少种状态?Runnable 一定在执行任务吗?