您现在的位置是:首页 >学无止境 >C# 对PdfiumViewer工具栏进行自定义,实现放大缩小,首页, 尾页,上一页等功能。网站首页学无止境

C# 对PdfiumViewer工具栏进行自定义,实现放大缩小,首页, 尾页,上一页等功能。

唠嗑一夏 2024-06-14 17:17:53
简介C# 对PdfiumViewer工具栏进行自定义,实现放大缩小,首页, 尾页,上一页等功能。

前言

关于PdfiumViewer的介绍 C# 使用PdfiumViewer实现对PDF文档打印预览(二),可以查看上一篇的文章。因为PdfiumViewer控件在工具栏展现的功能只有 保存、打印、放大、缩小这四个,现在想加上首页、尾页、上一页(下一页)的功能,以及显示当前页码,扩展一下功能。
在这里插入图片描述
改造成下面这个样子。
在这里插入图片描述

PdfiumViewer工具栏扩展

1 创建winform工程,UI界面

创建一个winform工程,在窗体上先放一个ToolStrip,再放置一个PdfiumViewer命名为pdfViewer1,将Dock属性设置为Full。
ToolStrip中从左到右控件的名称和对应的功能如下表:

控件类型控件名称描述
ToolStripButtonbtnPrint打印预览
ToolStripButtonbtnZomIn放大
ToolStripComboBoxcbZoomRate缩放比例
ToolStripButtonbtnZomOut缩小
ToolStripButtonbtnFullScreen全屏
ToolStripButtonbtnFirstPage首页
ToolStripButtonbtnPreviePage上一页
ToolStripTextBoxtbSetPage页码输入框
ToolStripLabellbTotalPage显示页码
ToolStripButtonbtnNextPage下一页
ToolStripButtonbtnLastPage尾页
ToolStripButtonbtnClose关闭

在这里插入图片描述
一些全局变量

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。