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 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
随机推荐
- MFC俄罗斯方块
经典俄罗斯方块游戏 源码百度云链接 链接:https://pan.baidu.com/s/14frk2EuFoiRCzudol2Xgvg提取码:syzk GitHub https://github.c ...
- maven pom 属性介绍
maven pom属性 内置属性(预定义,可直接使用) ${basedir} 表示项目根目录,即包含pom.xml文件的目录; ${version} 表示项目版本; ${project.basedir ...
- C# ComboBox绑定值问题
使用这种方式始终绑定值有问题: cbxSchool.DataSource = schoolList; cbxSchool.DisplayMember = "school_name" ...
- Centos7 安装mysql-8.0.13(rpm)
yum or rpm? yum安装方式很方便,但是下载mysql的时候从官网下载,速度较慢. rpm安装方式可以从国内镜像下载mysql的rpm包,比较快.rpm也适合离线安装. 环境说明 操作系统: ...
- Scrapy框架-Spider和CrawlSpider的区别
目录 1.目标 2.方法1:通过Spider爬取 3. 通过CrawlSpider爬取 1.目标 http://wz.sun0769.com/index.php/question/questionTy ...
- java多线程编程之连续打印abc的几种解法
一道编程题如下: 实例化三个线程,一个线程打印a,一个线程打印b,一个线程打印c,三个线程同时执行,要求打印出10个连着的abc. 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程 ...
- 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
最近开始尝试用go写点东西,正好在看LLVM的资料,就写了点相关的内容 - 前端解析器+中间代码生成(本地代码的汇编.执行则靠LLVM工具链完成) https://github.com/daibinh ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing(dp)
题目链接: http://codeforces.com/gym/102056/problem/I 题意: 人物有l两个属性分别是$A,D$ 每个回合人物$A\pm D$ 每个回合有三个选择分别是: 1 ...
- 偶发异常BUG,如何高效精准分析排查定位?
偶发异常BUG,如何高效精准分析排查定位? 作为测试,经常会收到领导.同事.用户反馈过来各种各样BUG,令人措手不及 首选需要判断确认是不是BUG,不要急于给予回复,需有充分的条件给予说明回复 很多测 ...
- 利用eval函数实现简单的计算器
""" description : use python eval() function implement a simple calculator functions ...