文章目录
- 前言
 - 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一起配合使用,放在软件同一目录下。


















