wpf 调用Spire.Pdf将PDF文件转换为其他文件模式

  1. 首先在Nuget里下载该第三方包Spire.Pdf。
  2. 然后可以编写程序
//这里我调用的是解析成流模式,这是因为我要使用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转换的程序的更多相关文章

  1. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  2. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  3. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

  5. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  6. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  7. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  8. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  9. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

随机推荐

  1. 【English】十、"谓语的地方"看到有两个动词:I go say hello.、非谓语形式

    一.I go say hello. 这是一种偏口语的说法.一个句子中不能同时有两个谓语. 标准的用法有: I go and say hello. and 连接这两个动词,表示并列等关系.go and ...

  2. Jmeter接口测试实战-数据传递

    Jmeter接口测试实战-数据传递 接口与接口之间没有关联的测试是缺乏意义和没有灵魂的,只有数据在不同接口之间传递才能勾画出业务场景重要的链路. 我们用较为通用的http/https协议,接口普遍返回 ...

  3. 创建一个Windows服务程序与实现定时器效果

    1.创建一个Windows服务程序 一.   新建Window服务项目 二.   添加安装程序 三.   配置服务属性 四.   编写定时器代码 publicpartialclassService1 ...

  4. zabbix配置邮件告警

    1.安装邮件服务 yum -y install mailx @qq.com #发邮件测试 2.添加报警媒介 输入接收告警邮件的邮箱 3.配置SMTP服务端 使用本机作为SMTP服务器 4.创建触发器 ...

  5. 小功能 HTML标签状态改变

    在编写程序得时候根据不同的业务需求会改变相应的标签的状态 今天介绍一下<a>标签状态的改变 当前业务场景为需要A标签的样式 即保留A标签的原有样式 在鼠标悬停得时候鼠标状态呈销售状 都知道 ...

  6. (转)sizeof()和_countof()区别

    先看程序: #include <iostream> using namespace std; int main(int argc, char* argv[]) { char *a = &q ...

  7. 三十七、小程序页面跳转传参参数值为url时参数丢失

    当参数的值为url的时候,在options中的值没有参数“?”之后字符串被截取.例如:let url="http://baidu.com/?a=1&b=2"wx.navig ...

  8. Robust Principal Component Analysis?(PCP)

    目录 引 一些微弱的假设: 问题的解决 理论 去随机 Dual Certificates(对偶保证?) Golfing Scheme 数值实验 代码 Candes E J, Li X, Ma Y, e ...

  9. Google Chrome即将开始警告—停止支持Flash Player

    Adobe 计划在 2020 年让 Flash Player 彻底退休,整个科技行业都在为这个关键时刻做准备,包括浏览器开发机构,Google 作为最主要的一员,试图尽可能顺利地完成 Flash Pl ...

  10. Django Models 查询操作

    1.准备数据表: from django.db import models class City(models.Model): name=models.CharField(max_length=32) ...