前言

关于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的RendererZoom 的属性(缩放比例因子)。

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐