文章目录
- 前言
- PdfiumViewer工具栏扩展
- 1 创建winform工程,UI界面
- 2 打印预览
- 3 放大功能
- 4 缩小功能
- 5 按比例缩放
- 6 全屏
- 7 首页和尾页
- 8 上一页和下一页
- 9 页码输入框
- 10 显示当前预览的页码
- 小结
前言
关于PdfiumViewer的介绍 C# 使用PdfiumViewer实现对PDF文档打印预览(二),可以查看上一篇的文章。因为PdfiumViewer
控件在工具栏展现的功能只有 保存、打印、放大、缩小这四个,现在想加上首页、尾页、上一页(下一页)的功能,以及显示当前页码,扩展一下功能。
改造成下面这个样子。
PdfiumViewer工具栏扩展
在
1 创建winform工程,UI界面
创建一个winform工程,在窗体上先放一个ToolStrip,再放置一个PdfiumViewer命名为pdfViewer1
,将Dock属性设置为Full。
ToolStrip中从左到右控件的名称和对应的功能如下表:
控件类型 | 控件名称 | 描述 |
ToolStripButton | btnPrint | 打印预览 |
ToolStripButton | btnZomIn | 放大 |
ToolStripComboBox | cbZoomRate | 缩放比例 |
ToolStripButton | btnZomOut | 缩小 |
ToolStripButton | btnFullScreen | 全屏 |
ToolStripButton | btnFirstPage | 首页 |
ToolStripButton | btnPreviePage | 上一页 |
ToolStripTextBox | tbSetPage | 页码输入框 |
ToolStripLabel | lbTotalPage | 显示页码 |
ToolStripButton | btnNextPage | 下一页 |
ToolStripButton | btnLastPage | 尾页 |
ToolStripButton | btnClose | 关闭 |
一些全局变量
//打开的PDF文档
PdfDocument document;
//当前页码
int curPageNum = 1;
//是否全屏
bool IsFull = false;
//默认打印机
string DefaultPrinter = null;
2 打印预览
使用C#自带的接口PrintDialog
来实现打印,将PdfiumViewer中的PDF转换成系统的Document
并传递给PrintDialog
即可,还可以设置PrintDialog
的一些属性,比如开始打印页,总的页数等。
/// <summary>
/// 打印预览
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnPrint_Click(object sender, EventArgs e)
{
//实例化一个打印预览窗口对象
using (var form = new PrintDialog())
using (var doc = document.CreatePrintDocument(PdfPrintMode.CutMargin))
{//将PdfViwer的PDF的文档 转换为System的document
form.AllowSomePages = true; //启用"页"
form.Document = doc; //设置要显示打印的文档
form.UseEXDialog = true;
form.Document.PrinterSettings.FromPage = 1; //设置起始打印的页码
form.Document.PrinterSettings.ToPage = document.PageCount; //总的页码
if (DefaultPrinter != null)
form.Document.PrinterSettings.PrinterName = DefaultPrinter;
if (form.ShowDialog(FindForm()) == DialogResult.OK)
{//弹出打印预览的窗口
try
{
if (form.Document.PrinterSettings.FromPage <= document.PageCount)
form.Document.Print();
}
catch
{
// Ignore exceptions; the printer dialog should take care of this.
}
}
}
}
3 放大功能
使用PdfiumViewer的Renderer
进行渲染放大页面。
/// <summary>
/// 放大
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnZomIn_Click(object sender, EventArgs e)
{
pdfViewer1.Renderer.ZoomIn();
}
4 缩小功能
使用PdfiumViewer的Renderer
进行渲染缩小页面。
/// <summary>
/// 缩小
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnZomOut_Click(object sender, EventArgs e)
{
pdfViewer1.Renderer.ZoomOut();
}
5 按比例缩放
设置PdfiumViewer的Renderer
中Zoom
的属性(缩放比例因子)。
/// <summary>
/// 比例缩放
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CbZoomRate_SelectedIndexChanged(object sender, EventArgs e)
{// 0:25% 1:50% 2:75% 3:100% 4:150% 5:200% 6:Page Width 7:Whole page
if(cbZoomRate.SelectedIndex ==0 )
{
pdfViewer1.Renderer.Zoom = 0.25;
}
else if (cbZoomRate.SelectedIndex == 1)
{
pdfViewer1.Renderer.Zoom = 0.50;
}
else if (cbZoomRate.SelectedIndex == 2)
{
pdfViewer1.Renderer.Zoom = 0.75;
}
else if (cbZoomRate.SelectedIndex == 3)
{
pdfViewer1.Renderer.Zoom = 1.00;
}
else if (cbZoomRate.SelectedIndex == 4)
{
pdfViewer1.Renderer.Zoom = 1.50;
}
else if (cbZoomRate.SelectedIndex == 5)
{
pdfViewer1.Renderer.Zoom = 2.00;
}
else if(cbZoomRate.SelectedIndex == 6)
{//page width
int page = pdfViewer1.Renderer.Page;
pdfViewer1.ZoomMode = PdfViewerZoomMode.FitWidth;
pdfViewer1.Renderer.Zoom = 1;
pdfViewer1.Renderer.Page = page;
}
else if (cbZoomRate.SelectedIndex == 7)
{//Whole page
int page = pdfViewer1.Renderer.Page;
pdfViewer1.ZoomMode = PdfViewerZoomMode.FitHeight;
pdfViewer1.Renderer.Zoom = 1;
pdfViewer1.Renderer.Page = page;
}
}
订阅了缩放更改事件 pdfViewer1.Renderer.ZoomChanged += Renderer_ZoomChanged;
当使用放大或缩小功能时,更新缩放比例的文本显示。
/// <summary>
/// 缩放改变时,显示此时的缩放比例
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Renderer_ZoomChanged(object sender, EventArgs e)
{
cbZoomRate.Text = (pdfViewer1.Renderer.Zoom * 100).ToString("f0") + "%";
}
6 全屏
工具栏有全屏按钮,顺便可以加个鼠标右键菜单可以退出全屏的功能。
/// <summary>
/// 窗体最大化显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnFullScreen_Click(object sender, EventArgs e)
{
IsFull = !IsFull;
if(IsFull)
{//全屏
//隐藏工具栏和状态栏
this.toolStrip1.Visible = false;
this.statusStrip1.Visible = false;
//最大化窗体
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
else
{
this.toolStrip1.Visible = true;
this.statusStrip1.Visible = true;
this.WindowState = FormWindowState.Normal;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
}
}
7 首页和尾页
更改Renderer
渲染Page
的索引为0,即是首页了。
首页
/// <summary>
/// 首页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnFirstPage_Click(object sender, EventArgs e)
{
//设置当前页码为1
curPageNum = 1;
//渲染页是0 下标从0开始
pdfViewer1.Renderer.Page = curPageNum - 1;
}
尾页
/// <summary>
/// 尾页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnLastPage_Click(object sender, EventArgs e)
{
curPageNum = document.PageCount;
pdfViewer1.Renderer.Page = curPageNum - 1;
}
8 上一页和下一页
更改Renderer
渲染Page
的索引
上一页
/// <summary>
/// 上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnPreviePage_Click(object sender, EventArgs e)
{
//curPageNum 是从1开始计数的,因为工具栏还有一个Label显示当前页的页码
// 获取当前页页码
curPageNum = pdfViewer1.Renderer.Page + 1;
if (curPageNum -1 < 0 )
{//已经是首页(第1页)了,则返回
return;
}
//当前页减1
curPageNum--;
//渲染上一页
pdfViewer1.Renderer.Page = curPageNum - 1;
}
下一页
/// <summary>
/// 下一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnNextPage_Click(object sender, EventArgs e)
{
//计算当前页
curPageNum = pdfViewer1.Renderer.Page + 1;
if (curPageNum > document.PageCount)
{//当前页已经是最后一页,则返回
return;
}
//当前页+1,就是下一页
curPageNum++;
//因为curPageNum是从1开始计数,而Page下标是从0开始,所以还要减1
pdfViewer1.Renderer.Page = curPageNum - 1;
}
9 页码输入框
根据输入的页码,跳转显示PDF文档的页。
/// <summary>
/// 设置页码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TbSetPage_KeyPress(object sender, KeyPressEventArgs e)
{
string text = tbSetPage.Text.Trim();
int page = -1;
//将文本强转为数值
int.TryParse(text, out page);
if(page < 0 || page > document.PageCount)
{//数值超限
return;
}
curPageNum = page;
//设定跳转的页
pdfViewer1.Renderer.Page = curPageNum - 1;
}
10 显示当前预览的页码
订阅 pdfViewer1.Renderer.DisplayRectangleChanged += Renderer_DisplayRectangleChanged;
当显示预览的矩形框变化时,那么预览的页码也可能随之更改。上下翻页,还有设定页,也会触发该事件。
/// <summary>
/// 翻页矩形框变化时,更新当前页码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Renderer_DisplayRectangleChanged(object sender, EventArgs e)
{
tbSetPage.Text = (pdfViewer1.Renderer.Page + 1).ToString();
lbCurrentPage.Text = (pdfViewer1.Renderer.Page + 1).ToString();
}
小结
1 打印功能:使用自带的PrintDialog 对象(dlg),并将PdfiumViewer中的PdfDocument文档赋值给dlg就可以了。
2 缩放功能:主要是对PdfiumViewer中的组成之一的Renderer的Zoom属性进行设置。
3 换页功能:主要是对PdfiumViewer中的组成之一的Renderer的Page属性进行设置。
4 注意:开源的PdfiumViewer需要与pdfium.dll一起配合使用,放在软件同一目录下。