C# 使用PdfiumViewer实现对PDF文档打印预览(二)

news2025/2/24 8:38:32

文章目录

      • 前言
      • 关于PdfiumViewer
      • 配置PdfiumViewer环境
      • PdfiumViewer 打开并预览本地的PDF文档
      • PdfiumViewer 预览PDF文件流
      • 小节
      • 附录

前言

想要对PDF文档进行预览和打印,实际上这个文档可以是存在的,也可以是一个PDF文件流(本地并没有PDF文件),找了一段时间发现有个特牛逼的开源组件PdfiumViewer,满足我这一切的需求,还可以自定义缩放,翻页的按钮。
但是这个组件需要和pdfium.dll配合使用,放在同一个路径下,运行在X86平台下。

关于PdfiumViewer

GitHub链接:https://github.com/pvginkel/PdfiumViewer

PdfiumViewer 是一个基于PDFium项目的PDF查看器,它提供了许多用于处理PDF文件的组件。承载了一个PdfRenderer控件,并添加一个工具栏老保存或打印PDF文件。
PdfDocument 用于呈现PDF文档的基类
PdfRenderer 是一个winform控件,可以渲染PdfDocument

PdfiumViewer需要PDFium库的支持,在Nuget包中是没有包含这个PDFium库的, 需要自己下载。界面大致是长这个样子,有保存、打印、放大、缩小菜单。
在这里插入图片描述

配置PdfiumViewer环境

使用VS自带的Nuget包管理器下载安装,这里我选择的是第一个。
在这里插入图片描述
然后再下载PDFium.dll,使用Nuget包管理器搜索并下载安装,这里x86_V64.v8-xfa的安装包。
在这里插入图片描述
在工程的 packages\PdfiumViewer.Native.x86.v8-xfa.2018.4.8.256\Build\x86路径下可以看到pdfium.dll, 就把pdfium.dllPdfiumViewer放在同一个路径下就可以使用了。
在这里插入图片描述

PdfiumViewer 打开并预览本地的PDF文档

创建一个winform工程,直接在.cs文件中添加PdfiumViewer即可。也可以直接把PdfiumViewer控件拖拽到工具栏,从工具栏添加这个组件,再编程。
方式1:直接打开已经存在本地的PDF文件。PdfDocument.Load的函数有四个重载,这是其中一个。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using PdfiumViewer;

namespace PdfiumViewerDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 加载PDF文档
            LoadPdfByDocument();
        }


       /// <summary>
       /// 加载本地PDF文档
       /// </summary>
        private void LoadPdfByDocument()
        {

            //创建一个PDFView控件
            PdfViewer pdfViewer1 = new PdfViewer();
            //设置位置和大小
            pdfViewer1.Location = new Point(5, 5);
            pdfViewer1.Size = new Size(200, 300);
            pdfViewer1.Dock = DockStyle.Fill;

            //将控件添加到界面上
            this.Controls.Add(pdfViewer1);

            //加载PDF文档
            pdfViewer1.Document = PdfDocument.Load(@"D:Demo.pdf");
        }
    }
}

运行代码的时候如果出现找不到“pdfium.dll”的异常,那么就是pdfium.dll没有和PdfViewer.dll放在同一目录下。
在这里插入图片描述
如果出现System.BadImageFormatException
HResult=0x8007000B
Message=试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
Source=PdfiumViewer的异常,
在这里插入图片描述
那么很可能就是运行环境不对,应该更改为X86的运行环境。
在这里插入图片描述

运行效果:
在这里插入图片描述

PdfiumViewer 预览PDF文件流

PdfSharpHelper类具体代码如下,更多详细的介绍请移步c# 数据保存为PDF(三) (PdfSharp篇)
https://blog.csdn.net/weixin_40314351/article/details/127343819?spm=1001.2014.3001.5501


using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;

using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;


namespace PdfiumViewerDemo
{
        public class PdfSharpHelper
        {
            // const string facename = "Times New Roman";
            static string fontName = "华文宋体"; //华文宋体 Arial

            //左右边距
            const int padding_leftRight = 30;

            //上下边距
            const int padding_topBottom = 30;


            /// <summary>
            /// 保存为文件流
            /// </summary>
            /// <param name="binary"></param>
            /// <returns></returns>
            public static MemoryStream SaveToStream()
            {
                PdfDocument doc = new PdfDocument();
                CreatePdfSharpPDF( doc);

                MemoryStream stream = new MemoryStream();
                doc.Save(stream);
                return stream;
            }


            /// <summary>
            /// 绘制功能码表头
            /// </summary>
            /// <param name="document"></param>
            /// <param name="page"></param>
            /// <param name="startY"></param>
            /// <returns></returns>
            private static float DrawPDFCodeTitle(PdfPage page, XGraphics gfx, float startY)
            {
                float x = padding_leftRight;
                float y = startY;

                XFont Titlefont = new XFont(fontName, 9, XFontStyle.Bold);

                XSize size = gfx.MeasureString("Param", Titlefont);

                float endY = (float)size.Height * 2 + 5;
                //绘制标题
                gfx.DrawRectangle(XBrushes.LightCyan, new XRect(padding_leftRight, y,
                    page.Width - 2 * padding_leftRight, endY));

                y += (float)size.Height * 2 + 1;
                gfx.DrawString(" Parameter", Titlefont, XBrushes.Black, x, y);

                x += (float)(page.Width * 0.32);
                gfx.DrawString("Value", Titlefont, XBrushes.Black, x, y);

                // x += (float)(page.Width * 0.098);
                // gfx.DrawString("Infomation", Titlefont, XBrushes.Black, x, y);

                x += (float)(page.Width * 0.31);
                gfx.DrawString("Setting", Titlefont, XBrushes.Black, x, y);
                gfx.DrawString("Default", Titlefont, XBrushes.Black, x, y - size.Height - 1);


                return (endY + startY);
            }

            /// <summary>
            /// 绘制页脚
            /// </summary>
            /// <param name="page">页面</param>
            /// <param name="gfx">画布</param>
            /// <param name="cur">当前页序号</param>
            /// <param name="total">总的页码数</param>
            private static void DrawPDFFooter(PdfPage page, XGraphics gfx, int cur, int total)
            {
                //计算高度
                float endY = (float)page.Height - padding_topBottom;

                XFont Timefont = new XFont(fontName, 10, XFontStyle.Bold);

                //测量字符串大小
                XSize size = gfx.MeasureString("Drive Type/", Timefont);


                //绘制页脚
                gfx.DrawLine(new XPen(XColors.Black, 0.2f),
                    padding_leftRight,
                    endY,
                   page.Width - padding_leftRight,
                   endY);

                endY += 2 + (float)size.Height;

                //绘制信息
                String footerText = "Test for Windows(C) by 唠嗑一夏 Electric Corporation";
                gfx.DrawString(footerText, Timefont, XBrushes.Black, padding_leftRight,
                    endY);

                Timefont = new XFont(fontName, 10, XFontStyle.Regular);

                //绘制页码数
                footerText = cur.ToString() + "/" + total.ToString();
                gfx.DrawString(footerText, Timefont, XBrushes.Black,
                    (page.Width * 0.9), endY);
            }



            /// <summary>
            /// 数据表格
            /// </summary>
            /// <returns></returns>
            private static DataTable CreateData()
            {
                DataTable dt = new DataTable();
                DataColumn col1 = new DataColumn("Num", typeof(string));
                DataColumn col2 = new DataColumn("Name", typeof(string));
                DataColumn col3 = new DataColumn("Val", typeof(string));
                DataColumn col4 = new DataColumn("Des", typeof(string));
                DataColumn col5 = new DataColumn("Set", typeof(string));

                dt.Columns.Add(col1);
                dt.Columns.Add(col2);
                dt.Columns.Add(col3);
                dt.Columns.Add(col4);
                dt.Columns.Add(col5);

                Random random = new Random();
                List<string> nameList = new List<string>
            {
                "A", "BB", "CCC", "D",
                "E", "F", "G","H","II",
                "JJ", "LL", "M"
            };

                List<string> tempList = new List<string>
            {
                "dsd", "sdfdgvre", "Hello", "Gilrs",
                "Today", "YYYY", "dfgre","GSD","fdgfer",
                "Wesd", "DLG", "fsdahfi;o"
            };

                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        DataRow dr = dt.NewRow();
                        dr[0] = "KK" + i.ToString("d2") + "." + j.ToString("d2");
                        dr[1] = nameList[j];
                        if (j % 3 == 0)
                        {
                            dr[2] = random.NextDouble().ToString("f3");
                        }
                        else
                        {
                            dr[2] = i * j - random.Next(0, 30);
                        }
                        dr[3] = tempList[j];

                        dr[4] = random.NextDouble().ToString("f2");

                        //添加新行
                        dt.Rows.Add(dr);
                    }
                }

                return dt;
            }


            /// <summary>
            /// 创建PDF
            /// </summary>
            public static void  CreatePdfSharpPDF(PdfDocument doc)
        {
                try
                {
                    //获取测试数据
                    DataTable dataTable = CreateData();

                    //创建文档对象
                  //  PdfDocument doc = new PdfDocument();
                    //创建空页
                    PdfPage page = doc.AddPage();
                    //设置纸张大小
                    page.Size = PageSize.A4;

                    List<XGraphics> gfxList = new List<XGraphics>();

                    //设置一个画布
                    XGraphics gfx = XGraphics.FromPdfPage(page);
                    gfxList.Add(gfx);

                    const string fontName = "华文宋体";
                    //设置字体
                    XFont Titlefont = new XFont(fontName, 14, XFontStyle.Bold);
                    XFont Timefont = new XFont(fontName, 12, XFontStyle.Regular);


                    //绘制标题
                    gfx.DrawString(" Parameter Settings Report(Program)", Titlefont, XBrushes.Black,
                        new XRect(padding_leftRight, 30, page.Width - padding_leftRight, 30),
                        XStringFormats.CenterLeft);

                    //日期
                    gfx.DrawString(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), Timefont, XBrushes.Black,
                      new XRect(page.Width * 0.7, 30, page.Width * 0.3 - padding_leftRight, 30),
                      XStringFormats.BottomRight);

                    XPen linePen = new XPen(XColor.FromKnownColor(XKnownColor.Black), 0.1);
                    //绘制线
                    gfx.DrawLine(linePen,
                        new XPoint(padding_leftRight, 60), new XPoint(page.Width - padding_leftRight, 60));

                    //设置字体
                    Titlefont = new XFont(fontName, 12, XFontStyle.Bold);
                    Timefont = new XFont(fontName, 10, XFontStyle.Regular);

                    //测量字体的大小
                    XSize size = gfx.MeasureString("Program", Titlefont);
                    XSize size2 = gfx.MeasureString("Drive Type/", Timefont);


                    float y = 62;
                    float endY = (float)size.Height + 4 + (float)size2.Height;
                    //绘制矩形框和字符串
                    gfx.DrawRectangle(XBrushes.LightCyan, new XRect(padding_leftRight, y, page.Width - 2 * padding_leftRight, endY));
                    gfx.DrawString(" Program(Drive Selected / Connected)", Titlefont,
                        XBrushes.Black, padding_leftRight, y, XStringFormat.TopLeft);

                    y += 4 + (float)size.Height;
                    gfx.DrawString(" Drive Type/Model: ", Timefont,
                        XBrushes.Black, padding_leftRight, y, XStringFormat.TopLeft);


                    y += 4 + (float)size2.Height;
                    gfx.DrawLine(linePen,
                       new XPoint(padding_leftRight, y), new XPoint(page.Width - padding_leftRight, y));

                    y += 4;
                    gfx.DrawString(" Project: ", Titlefont,
                        XBrushes.Black, padding_leftRight, y, XStringFormat.TopLeft);

                    y += 4 + (float)size.Height;
                    gfx.DrawLine(linePen,
                      new XPoint(padding_leftRight, y), new XPoint(page.Width - padding_leftRight, y));

                    y += 4;
                    Titlefont = new XFont(fontName, 11, XFontStyle.Bold);
                    gfx.DrawString(" Information ", Titlefont,
                        XBrushes.Black, padding_leftRight, y, XStringFormat.TopLeft);

                    y += 100;

                    //项目的标题
                    y = DrawPDFCodeTitle(page, gfx, y) + 10;

                    //绘制功能码的字体
                    XFont funFont = new XFont(fontName, 9);
                    XFont FunBoldFont = new XFont(fontName, 9, XFontStyle.Underline | XFontStyle.Bold);

                    //字体的高度
                    XSize funcSize = gfx.MeasureString("KK00.00", funFont);
                    XSize funcBoldSize = gfx.MeasureString("KK00.00", FunBoldFont);

                    int count = dataTable.Rows.Count;
                    string str = "";
                    string strBak = "";
                    int j = 0;


                    for (int i = 0; i < count; i++)
                    {//遍历功能码
                        if ((y + funcSize.Height + 3) > (page.Height - padding_topBottom))
                        {//换页
                            page = doc.Pages.Add();
                            page.Size = PageSize.A4;
                            gfx = XGraphics.FromPdfPage(page);
                            gfxList.Add(gfx);
                            //绘制功能码表头
                            y = DrawPDFCodeTitle(page, gfx, 10) + 10;
                        }

                        DataRow dataRow = dataTable.Rows[i];
                        strBak = dataRow[0].ToString().Substring(0, 4);
                        if (strBak != str)
                        {//绘制功能码组
                            str = strBak;
                            string converStr = strBak;
                            j++;
                            funcBoldSize = gfx.MeasureString(converStr, FunBoldFont);
                            y += (float)funcBoldSize.Height + 6;

                            gfx.DrawString(converStr, FunBoldFont, XBrushes.Black, padding_leftRight, y);

                            y += 2;
                            i--;
                            continue;
                        }
                        // else
                        {//绘制

                            string tempStr = dataRow[0].ToString() + " " + dataRow[1].ToString();

                            funcSize = gfx.MeasureString(tempStr, funFont);
                            y += (float)funcSize.Height + 3;

                            if ((y + funcSize.Height + 3) > (page.Height - padding_topBottom))
                            {//换页
                                page = doc.Pages.Add();
                                page.Size = PageSize.A4;
                                gfx = XGraphics.FromPdfPage(page);

                                gfxList.Add(gfx);
                                //绘制功能码表头
                                y = DrawPDFCodeTitle(page, gfx, 10) + 10;
                            }

                            //序号+描述
                            float widthX = padding_leftRight;
                            gfx.DrawString(tempStr, funFont, XBrushes.Black, widthX, y);

                            //当前值
                            widthX += (float)(page.Width * 0.32);
                            gfx.DrawString(dataRow[2].ToString(), funFont, XBrushes.Black, widthX, y);

                            //设置值
                            widthX += (float)(page.Width * 0.31);
                            gfx.DrawString(dataRow[4].ToString(), funFont, XBrushes.Black, widthX, y);
                        }

                    }

                    gfx = null;
                    int Total = doc.PageCount;
                    for (int i = 0; i < Total; i++)
                    {//绘制页脚
                        DrawPDFFooter(page, gfxList[i], i + 1, Total);
                    }
                   // string path = "PdfSharpDemo.pdf";
                  //  doc.Save(path);
                }
                catch (Exception ex)
                {

                }

            }
        }
    }


将使用PdfSharp生成的PDF文件流,在PdfViewer中显示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using PdfiumViewer;

namespace PdfiumViewerDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 加载PDF文档
          // LoadPdfByDocument();
            LoadPdfByStream();
        }


       /// <summary>
       /// 加载本地PDF文档
       /// </summary>
        private void LoadPdfByDocument()
        {

            //创建一个PDFView控件
            PdfViewer pdfViewer1 = new PdfViewer();
            //设置位置和大小
            pdfViewer1.Location = new Point(5, 5);
            pdfViewer1.Size = new Size(200, 300);
            pdfViewer1.Dock = DockStyle.Fill;

            //将控件添加到界面上
            this.Controls.Add(pdfViewer1);

            //加载PDF文档
            pdfViewer1.Document = PdfDocument.Load(@"D:Demo.pdf");
        }



        /// <summary>
        /// 加载PDF文件流
        /// </summary>
        private void LoadPdfByStream()
        {
            //创建一个PDFView控件
            PdfViewer pdfViewer1 = new PdfViewer();
            //设置位置和大小
            pdfViewer1.Location = new Point(5, 5);
            pdfViewer1.Size = new Size(200, 300);
            pdfViewer1.Dock = DockStyle.Fill;

            //将控件添加到界面上
            this.Controls.Add(pdfViewer1);

            //加载PDF文件流
            pdfViewer1.Document = PdfDocument.Load(PdfSharpHelper.SaveToStream());
        }
    }
}

在这里插入图片描述

小节

主要记录PdfiumViewer对PDF文档打印预览的两种方法,一种是直接打开加载PDF文档,另外一种是加载PDF文件流(与PdfSharp配合使用)。
PdfiumViewer组件主要是使用PdfDocument.Load来加载PDF文档。

附录

PdfiumViewer GitHub链接:https://github.com/pvginkel/PdfiumViewer

C# 使用自带的组件PrintPreviewDialog 和 PrintDocument实现打印预览(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

家用洗地机哪个好用?家用洗地机分享

洗地机是一种代表现代化清洁的设备&#xff0c;它具有高效、环保、经济、智能等多种特点。洗地机可以为您提供先进的清洁技术和设备&#xff0c;为您的清洁工作提供有力的支持。洗地机可以适应不同场所和建筑物的需求&#xff0c;提高工作效率和卫生形象。因此&#xff0c;选择…

Dockerfile构建镜像读取环境变量问题

起初使用如下Dockerfile构建Java镜像&#xff1a; FROM 10.170.33.245/base/openjdk:11.0.6-jdk-slim-busterMAINTAINER luo.hq <luo.hqneusoft.com>ENV TZ "Asia/Shanghai" ENV TERM xterm ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 ENV JVM_OPTIONS ""…

CSS 径向渐变

background: radial-gradient([ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> ); 属性解析&#xff1a; ending-shape &#xff1a;渐变结束的形状 默认为椭圆ellipse&#xff0c;可以设置为圆形circle size&#xff1a;渐…

R语言 | 认识apply家族

目录 一、apply()函数 二、sapply()函数 三、lapply()函数 四、tapply()函数 ​五、iris鸢尾花数据集 R语言提供了一个循环系统称apply家族&#xff0c;它具有类似for循环的功能&#xff0c;但是若想处理相同问题&#xff0c;apply家族函数好用太多了。 一、apply()函数 …

隐藏加密文件夹怎么找到?看这里就够了!

当隐藏遇到加密&#xff0c;可以很好地保护电脑文件夹数据安全&#xff0c;那么隐藏加密的文件夹该怎么找到呢&#xff1f;方法其实很简单&#xff0c;下面我们通过两款提供文件夹隐藏加密的软件来了解一下。 文件夹加密超级大师 作为一款能够提供5种文件夹加密类型的软件&…

Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

ThreadPoolExecutor是JDK中的线程池实现&#xff0c;这个类实现了一个线程池需要的各个方法&#xff0c;它提供了任务提交、线程管理、监控等方法。 下面是ThreadPoolExecutor类的构造方法源码&#xff0c;其他创建线程池的方法最终都会导向这个构造方法&#xff0c;共有7个参…

什么是网络——TCP/IP协议

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

聚观早报 | 科大讯飞称10月整体赶超ChatGPT;苹果遭欧盟警告

今日要闻&#xff1a;科大讯飞称10月整体赶超ChatGPT&#xff1b;苹果遭欧盟警告&#xff1b;科研人员研发纳米粒子治疗癌症&#xff1b;中小学教材不得夹带商业广告&#xff1b;Z-Library又被美国FBI查封了 科大讯飞称10月整体赶超ChatGPT 5 月 6 日&#xff0c;科大讯飞董事…

JS判断用户终端与CSS判断用户终端的写法(源代码实例)

当用户使用手机等移动终端访问网站时&#xff0c;我们可以通过程序检测用户终端类型&#xff0c;如果是手机用户&#xff0c;则引导用户访问适配手机屏幕的移动站点。 JS判断用户终端&#xff1a; // 判断浏览器类型 myBrowser() {var userAgent navigator.userAgent; //取得…

Python每日一练(20230508) 石子游戏 I\II\III

目录 1. 石子游戏 Stone Game I 2. 石子游戏 Stone Game II 3. 石子游戏 Stone Game III &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 石子游戏 Stone Game I Alice 和 Bob 用几堆…

数字化转型对企业的好处有哪些(下)

过时的技术、流程和客户关系管理困难是当前阻碍企业增长的主要障碍&#xff0c;CRM系统是企业数字化转型的主要工具&#xff0c;帮助企业简化操作、提高效率&#xff0c;为客户提供更加卓越的客户体验。下面说说&#xff0c;企业数字化转型的十大好处。 5、提升竞争力 数字技…

HQChart实战教程61-自定义十字星K线颜色

HQChart实战教程61-自定义平盘K线颜色 十字星步骤1. 注册事件2. 监听回调函数阐述说明HQChart插件源码地址完整的demo源码十字星 十字星是一种K线基本型态。十字星,是一种只有上下影线,没有实体的K线图。开盘价即是收盘价,表示在交易中,股价出现高于或低于开盘价成交,但收…

asp.net+sqlserver社区居民健康档案管理系统

社区居民健康档案管理系统1 摘 要1 1 课题背景及研究内容1 1.1 课题背景和意义1 1.2 研究现状1 1.3 论文结构安排1 2 系统开发环境3 2.1开发工具介绍3 2.1.1 Visual Studio介绍3 2.1.2 SQL Server介绍4 2.1.3 IIS介绍4 2.2 动态网站技术介绍4 2.3开发模式B/S介绍4 2.4 AS…

【云台】开源版本SimpleBGC的传感器校准与姿态融合

传感器校准 俄版云台使用的是 MPU6050&#xff0c;磁力计使用的是 HMC5883 MPU6050校准 MPU6050校准包含两部分&#xff1a;加速度计与陀螺仪。校准过程想要校准出的数据也就是加速度计与陀螺仪的温漂与零漂。 正常来说&#xff0c;如果将 IMU 朝上静置&#xff0c;加速度计…

SSM框架学习-Spring Framework系统架构

Spring是一个用来管理对象的技术&#xff1b; 上层需要依赖下层的支持&#xff1b; 面向切面编程&#xff1a;在不影响原始程序的基础上&#xff0c;增强功能&#xff1b; 提供数据访问与集成&#xff1a;说明兼容其它方式访问数据&#xff1b; Transactions&#xff1a;事务控…

第四十章 Unity 按钮 (Button) UI

本章节我们介绍一下按钮UI。首先&#xff0c;我们创建一个新的场景“SampleScene3.unity”。然后&#xff0c;在菜单栏中点击“GameObject”->“UI”->“Button”&#xff0c;截图如下 我们选中刚刚创建的Button&#xff0c;然后查看它的Inspector检视面板&#xff0c;如…

SonarQube Api调用指南

好几年前写过一篇sonar api调用的文档&#xff0c;很多人看&#xff0c;但是当时写的比较简陋&#xff0c;很多小伙伴在下方留言&#xff0c;也答应过一些小伙伴些一篇示例&#xff0c;本文主要目的是一篇扫盲贴。 一、接口文档 要使用sonarqube的api接口&#xff0c;你首先要…

递归递推练习题答案

1.用递归的方法123…N的值&#xff08;in:5,out:15&#xff09; def dg(n):if n1:return 1else:return dg(n-1)n nint(input()) print(dg(n))2.输出斐波那契数列的第N项&#xff0c;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xf…

GIT:git 教程

1. 版本控制 版本控制&#xff08;Revision Control&#xff09;用于在开发过程中管理文件修改历史&#xff0c;方便查看和备份。 它的作用如下&#xff1a; 实现跨区域多人协同开发。追踪和记载一个或者多个文件的历史记录。组织和保护你的源代码和文档。统计工作量。并行开…

Java EE企业级应用开发(SSM)第9章

第9章MyBatis入门 一.预习笔记 1.MyBatis框架的特点 1-1.简单易学 1-2.灵活 1-3.提供映射标签 2.MyBatis核心类 2-1.Configuration 2-2.SqlSessionFactory 2-3.SqlSession 2-4.Exector 2-5.MappedStatement 3.MyBatis工作流程 4.Mybatis入门程序 4-0&#xff1a;导…