winform编程其实是非常好入门的,如果你还是个小白,赶紧看看吧,现在小孩子都学编程了,你还在等什么呢?在等自己一毕业就失业吗?
话不多说了,直接上代码,看看吧。源码在最下面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.IO;
namespace PDFTransformImage
{
public partial class Form1 : Form
{
//委托就是用关键字delegate 来定义的,这里定义完了,在下面使用
delegate void SetProgress(int value);
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 这个是打开要转换的PDF文件的按钮事件,我们在这个事件里写打开文件的代码
/// 这里会用到打开文件对话框控件类
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenPdf_Click(object sender, EventArgs e)
{
//第一步我们创建打开文件对话框
var form = new OpenFileDialog();
//设置限制打开的文件类型
form.Filter = "PDF File (*.pdf)|*.pdf";
//这个是让对话框打开以后,在下次打开时就直接显示你之前打开文件的位置了,
//自动记录打开位置
form.RestoreDirectory = true;
//设置对话框的标题
form.Title = "打开PDF文件";
//第二步根据你打开的对话框进行判断,你是否选择文件了,
//如果没有选择则释放掉对话框占有的资源,这里不是点了打开的话
if (form.ShowDialog(this) != DialogResult.OK)
{
Dispose(); //释放掉占用资源
return;//不再继续执行下面的程序了
}
//如果你选择了pdf文件并点了代开
//这里就把你选的文件路径显示在名称为:txtPdfPath的文本框里里
txtPdfPath.Text = form.FileName;
}
/// <summary>
/// 这个是我们要选择把pdf转换后将图片存到哪里
/// 这里我们会用到FolderBrowserDialog这个对话框(这是选择文件保存位置的)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSavePath_Click(object sender, EventArgs e)
{
//第一步我们也要先创建对话框的对象
FolderBrowserDialog folder = new FolderBrowserDialog();
//接下来还是要判断你是不是点了确定,如果你点了确定,就执行if大括号里面的代码
if (folder.ShowDialog() == DialogResult.OK)
{
//将你选择的保存位置路径显示到名为:txtSavePath的文本框中
txtSavePath.Text = folder.SelectedPath;//selected就是选择的意思
}
}
/// <summary>
/// 这个是我们的开始转换的按钮事件,当我们用鼠标单击这个按钮后就会执行这里的代码
/// 并开始转换我们想要的图片,这是整个功能实现的核心,在实现前,我们需要通过vs工具
/// 安装我们需要用到的外部功能包NuGet包。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
//第一步先把要转换的PDF文件在后台进行打开,方法如下
string strpdfpath = txtPdfPath.Text;
var pdf = PdfiumViewer.PdfDocument.Load(strpdfpath);//告诉这个方法文件存在哪里它就会自动记载
var pdfpage = pdf.PageCount;//读取pdf文件有多少页
var pagesize = pdf.PageSizes;//读取pdf中的每一页
//这个我们设置一下转换进度的提示条的最大值
progressTransform.Maximum = pdfpage * 100;
//这里我们用for循环,对每一页进行逐页读取并进行转换后存到我们选好的位置
//关于for循环的用法,大家可以看看我在《10天学会C#面向对象编程中的介绍》
for (int i = 0; i < pdfpage; i++)
{
//这里我们需要把每一页读取出来,用到一个Size的类,因为是要从pagesize中把页面对出来
//每循环一次读出来的页面都不一样,所以要把创建对象的过程写到循环里,
//这样才能获取到不同的页面信息
Size size = new Size();
size.Height =(int) pagesize[i].Height;//把页面的具体高度给读出来,这里我们需要强制转换一下类型
size.Width =(int) pagesize[i].Width;//把页面的具体宽度给读出来,这里我们需要强制转换一下类型
//读出页面的高度和宽度是为了作为图片的高度和宽度
//下一步就是把我们对出来的页面存储成我们想要的图片,这里我存储成了jpg格式
//大家也可以根据自己想要的修改成PNG等格式
//这里我们会用到文件流类(FileStream),这里using是filestream对象用完后自动释放占用的资源
using (var stream = new FileStream(txtSavePath.Text + "\\" + "pdf" + i + @".jpg",FileMode.Create))
{
//这里是保存前进行相关的设置,如:宽度和高度等
using (var image = pdf.Render(i, size.Width, size.Height, PdfiumViewer.PdfRenderFlags.Annotations))
{
image.Save(stream,ImageFormat.Jpeg);//保存我们想要的图片
//在这里设置进度条,这里我们用到了线程的概念和一个叫Thread的类
//我们还会用到委托这个知识,等会大家就会看到,怎么使用
SetTextMessage(100*(i+1));//让进度起始值从1开始,这样总进度的值就会和设置的值保持一致了。
Thread.Sleep(10);//每次存完图片以后让程序等待10毫秒,在执行。如果转的文件页数多了,这个可以给程序
//反应时间,不至于出现假死现象
}
}
}
//转换完成后,我们给用户一个提示,告诉用户转换的情况
//这里会用到一个叫MessageBox的类,这类里有一个静态方法show用来显示提示信息的
//静态方法的调用语法是:类名.方法名
MessageBox.Show("装换成功");//注意编写代码的时候必须使用英文输入模式的半角模式
}
/// <summary>
/// 我们先自定义一个方法,用来不断更新界面上的进度条的值
/// 从而可以提示转换的进度
/// </summary>
/// <param name="progressValue"></param>
private void SetTextMessage(int progressValue)
{
if (this.InvokeRequired)
{
//这里就需要用委托了,创建一个委托对象
SetProgress setpos = new SetProgress(SetTextMessage);
this.Invoke(setpos,new object[] { progressValue});//这句话就是让委托将进度值通过UI(界面)线程更新进度条
}
else
{
this.progressTransform.Value = Convert.ToInt32(progressValue);
}
}
}
}
最后我们一起看看做好的效果