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 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
随机推荐
- 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署
通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...
- Linux下LANMP集成环境中编译增加pdo_odbc模块
linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要 ...
- Java学习资源整理(超级全面)
这里整理一些自己平常搜集的比较好的关于Java的学习资源,主要包括博客站点.书籍.课程等. 了解Java最新资讯 这部分主要是了解与Java相关的动态以及信息,能够拓展我们的视野以及寻找一些好的ide ...
- 快速排序实现及其pivot的选取
coursera上斯坦福的算法专项在讲到快速排序时,称其为最优雅的算法之一.快速排序确实是一种比较有效的排序算法,很多类库中也都采用了这种排序算法,其最坏时间复杂度为$O(n^2)$,平均时间复杂度为 ...
- java8新特性-默认方法
作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...
- WebApi接收post方式传入的json数据
[RoutePrefix("Api")] public class UploadController:BaseApiController { [HttpPost] [Route(& ...
- [已解决]ValueError: row index was 65536, not allowed by .xls format
报错: ValueError: row index was 65536, not allowed by .xls format 解决方案: xlrd和xlwt处理的是xls文件,单个sheet最大行数 ...
- idea 右键无java class选项
项目中新建module之后,要在该目录下新增java Class文件,右键——>New发现无Java Class选项. File –Project Structure或者ctrl+alt+shi ...
- 分享收集的WebGL 3D学习资源
大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...
- Ceva定理的四种证明方法
${\color{Teal} {Ceva定理}}$设$D.E.F$依次为三角形ABC的边$AB.BC.CA$的内点,记 $λ$=(A,B,D),$μ$=(B,C,E),$v$=(C,A,F) 求证:三 ...