wpf编写一个简单的PDF转换的程序
wpf 调用Spire.Pdf将PDF文件转换为其他文件模式
- 首先在Nuget里下载该第三方包Spire.Pdf。
- 然后可以编写程序
//这里我调用的是解析成流模式,这是因为我要使用ProgressBar
public void PdfTrasformOther(string fileName, string storeFileName, FileFormat fileFormat, MainWindow mainWindow)
{
this.mainWindow = mainWindow;
PdfDocument document = new PdfDocument();
document.LoadFromFile(fileName);
using (MemoryStream stream = new MemoryStream())
{
document.SaveToStream(stream, fileFormat);
document.Close();
byte[] data = stream.ToArray();
long len = stream.Length;
saveFile(storeFileName, mainWindow, data, len);
}
}
//这里我使用了线程池来调用界面控件,因此得使用Dispatcher方法来避免线程问题。
private static void saveFile(string storeFileName, MainWindow mainWindow, byte[] data, long len)
{
using (FileStream file = File.Create(storeFileName))
{
ParmData pdata = new ParmData();
long everylen = 0;
if (len % 100 == 0)
{
everylen = len / 100;
}
else
{
everylen = (len / 100) + 1;
}
mainWindow.progressSpeed.Myprogress.Dispatcher.Invoke(() =>
{
mainWindow.progressSpeed.dataText.DataContext = pdata;
mainWindow.progressSpeed.percent.Text = "%";
});
int sendlen = 0;
for (long i = 0; i <= 100; i++)
{
if (data.Length - everylen >= 0)
{
sendlen = (int)everylen;
}
else
{
sendlen = data.Length;
}
file.Write(data, 0, (int)sendlen);
byte[] copyData = new byte[data.Length - sendlen];
Array.Copy(data, sendlen, copyData, 0, copyData.Length);
data = copyData;
mainWindow.progressSpeed.Myprogress.Dispatcher.Invoke(() =>
{
mainWindow.progressSpeed.Myprogress.Value = i;
pdata.ValueText = (int)i;
});
if (i == 100)
{
mainWindow.progressSpeed.Myprogress.Dispatcher.Invoke(() =>
{
mainWindow.progressSpeed.trasformText.Text = "";
});
SharParm.flage = false;
}
}
}
}
3.在主线程处,使用一个线程池来避免主线程在进度条刷新的时候不能操作其他控件
private void Btn_tarsform_Click(object sender, RoutedEventArgs e)
{
if (txb_FileName.Text == "")
{
MessageBox.Show("请先导入PDF文件");
return;
}
if (SharParm.flage)
{
MessageBox.Show("正在转换文件,请转换完毕再执行下一个文件转换!");
return;
}
this.progressSpeed.Myprogress.Value = 0;
progressSpeed.bindtxt.Text = "0";
progressSpeed.percent.Text = "%";
FileFormat fileFormat = (FileFormat)cob_Format.SelectedIndex;
if (!SharParm.IsSave)
{
MessageBox.Show("暂时不能提供!");
SharParm.flage = false;
return;
//SharParm.flage = true;
//string fileName = txb_FileName.Text;
//string saveFileName = "";
//ThreadPool.QueueUserWorkItem((o) =>
//{
// this.progressSpeed.trasformText.Dispatcher.Invoke(() =>
// {
// this.progressSpeed.trasformText.Text = "正在转换中";
// });
// TrasformFile trasform = new TrasformFile();
// trasform.PdfTrasformOther(fileName, saveFileName, fileFormat, this);
//});
}
else
{
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.FileName = name + "." + cob_Format.SelectedValue;
if ((bool)saveFile.ShowDialog())
{
SharParm.flage = true;
string fileName = txb_FileName.Text;
string saveFileName = saveFile.FileName;
ThreadPool.QueueUserWorkItem((o) =>
{
this.progressSpeed.trasformText.Dispatcher.Invoke(() =>
{
this.progressSpeed.trasformText.Text = "正在转换中";
});
TrasformFile trasform = new TrasformFile();
trasform.PdfTrasformOther(fileName, saveFileName, fileFormat, this);
});
}
}
}
4.结果显示



5.结果很简单,模式也很多,可以解析成不同的模式并保存到本地文址,对于简单使用已经很方便了。
wpf编写一个简单的PDF转换的程序的更多相关文章
- 使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token
原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf? 因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...
- Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块
原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- Java入门篇(一)——如何编写一个简单的Java程序
最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...
- 用 Go 编写一个简单的 WebSocket 推送服务
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
随机推荐
- Github入门详情教程
前言 之前我写了一篇文章<一篇文章了解Github和Git教程>还延伸了几篇阅读,对大部分小白很有用,那么我继续普及下Github页面及其概念. 定义 GitHub 是一个网站,一个面向开 ...
- SQL ----post漏洞测试注入
使用工具sqlmap 输入账号密码进行bp截断,获取文本保存在sqlmap下面2.txt 爆数据库 爆表爆表 爆数据 最后把数据密码md5解析
- Win7系统下,docker构建nginx+php7环境实践
前面两章介绍的是Windows系统下如何安装和配置docker,主要原因在于,公司大多人数用的是Windows环境,想通过在Windows环境上,通过docker,构建一个公用的配置. 首先要说明的是 ...
- 卸载或安装Git出现Invalid drive错误的解决方案【简记】
前言:工作中由于公司的电脑(SSD+HDD)硬盘(HDD)突然坏了,只剩下一个系统盘(SSD).然后就是有个比较紧急的需求正在做,申请换的新硬盘不能立刻换上,因为工作的机器不在公司,操作远程机器工作, ...
- c++11の泛型算法
一.泛型算法泛型算法这个概念是针对容器操作的,我们知道,c++11的顺序容器有vector,list,deque等,对于这些容器,c++11并没给出相应的增删改查方法,而是定义了一组泛型算法 一般的泛 ...
- python从开始到放弃想标题的day12
上次有说道函数的返回值,但是不是所有的数据类型都有返回值,一些常用的比如str基本都有返回值,list基本都没有返回值,dict基本都有返回值,还有就是函数和函数之间的数据是互不影响的,哪怕是一个函数 ...
- Synchronized的基本知识、实现原理以及其与ReentrantLock的区别
一.synchronized知识 在谈论synchronized之前,我们需要了解线程安全问题的主要诱因.线程安全问题的主要诱因如下: 存在共享数据(也称为临界资源) 存在多条线程共同操作这些共享数据 ...
- time-时间模块
# time模块import time# 时间戳res = time.time() # ***print(res, type(res)) # time.sleep(1) # ***# print(12 ...
- P1177 【模板】快速排序 题解
本质为sort,这里我们用优先队列(堆)解决. 什么是堆? 堆 堆是一个完全二叉树,而且是每层都有规律的二叉树 规律大概是: 小根堆:最上层数的大小最小,往下每层结点都比父亲结点大,比两个儿子结点小 ...
- C语言报错:error: expected ‘while’ at end of input } ^
在建线程池过程当中遇见上图所示错误: 解决方法: Linux中定义: SYNOPSIS #include <pthread.h> void pthread_cleanup_push(voi ...