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 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
随机推荐
- VS OpenCV imread imwrite nameWindow等相关报错问题
排查过程 1. 项目属性C++目录中,包含库include 和 lib 目录了吗? 去自己的opencv安装目录中找到include 和 lib(一般在x64下有两个vc14/vc15, 我的是4.0 ...
- Spring WebFlux 响应式编程学习笔记(一)
各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...
- Ngnix负载均衡安装及配置
1.ngnix概念 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5 ...
- android获取string.xml的值
在android开发过程中,编写java代码中的常量过一般情况下,我们是定义在string.xml这个文件中.这样修改起来也很方便,而且做国际化也很简单. 这个string.xml的值会被R文件映射, ...
- [JSOI2008]Blue Mary的旅行
嘟嘟嘟 看\(n\)那么小,就知道是网络流.然后二分,按时间拆点. 刚开始我看成所有航班一天只能起飞一次,纠结了好一会儿.但实际上是每一个航班单独考虑,互不影响. 建图很显然,拆完点后每一个点的第\( ...
- 【css】一行或者多行文字垂直水平居中
1.方法一:使用css3弹性盒子(兼容IE10及以上浏览器,firefox,chrome,safari 5.1.7不支持) <!DOCTYPE html> <html> < ...
- 网页分享到facebook
一.在网页头部加入如下代码: <meta property="og:url" class="fb_url" content="分享url&quo ...
- React生命周期详解
React生命周期图解: 一.旧版图解: 二.新版图解: 从图中,我们可以清楚知道React的生命周期分为三个部分: 实例化.存在期和销毁时. 旧版生命周期如果要开启async rendering, ...
- 网络视频会议openmeetings Windows安装
官网 http://openmeetings.apache.org/index.html 下载文件解压运行install-service脚本之后运行red5脚本启动 官方安装文档 http://ope ...
- 启动django时报错Watching for file changes with StatReloader(使用状态加载程序监视文件更改 )
原因:可能是Django版本和Python版本或者PyMysql版本不一致 解决:升级或者降级Django版本 命令如下: pip install django==2.1.7 #django==版本号 ...