基于C#实现PDF文件合并工具

2025-01-20 16:50

本文主要是介绍基于C#实现PDF文件合并工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下...

界面

基于C#实现PDF文件合并工具

主要用于发票PDF文件的合并。经常出差要报销的很有用。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
//using PdfSharp.Pdf;
//using PdfSharp.Pdf.IO;
 
namespace PdfMergeApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            btnOpenDir.Enabled = false;
        }
 
        private List<string> pdfList;
        private string outputPdfDir;
 
        private void bntSelectDir_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            DialogResult dialogResult = folderBrowserDialog.ShowDialog();
 
            if (dialogResult == DialogResult.OK)
            {
                string selectedFolderPath = folderBrowserDialog.SelectedPath;
                //Console.WriteLine("选择的目录是: " + selectedFolderPath);
                txtFileDir.Text = selectedFolderPath;
 
                pdfList = Directory.GetFiles(selectedFolderPath, "*.pdf").ToList();
 
                if (pdfList != null && pdfList.Count > 0)
                {
                    pdfList = pdfList.OrderBy(t => t).ToList();
                }
 
                addPdfList();
            }
        }
 
        private void addPdfList()
        {
            this.listViewWorkLogs.Items.Clear();
            int no = 1;
            foreach (var item in pdfList)
            {
                ListViewItem lvItem = new ListViewItem();
 
                lvItem.ForeColor = Color.Blue;
                lvItem.Text = no.ToString();
                lvItem.StateImageIndex = 0;
                lvItem.Tag = no - 1;
                lvItem.SubItems.Add(item);
 
                this.listViewWorkLogs.Items.Add(lvItem);
                no++;
            }
        }China编程
 
        /// <summary>
        /// 合并多个PDF文件为一个PDF文件
        /// </summary>
        /// <param name="inputFolderPath"></param>
        /// <param name="outputFolderPath"></param>
        /// <param name="outputPdfName"></param>
        public void MergePDFs(string outputFilePath, params string[] inputFilePaths)
        {
            // 获取输入文件夹中所有的PDF文件  
            //string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");
 
            // 创建输出PDF文件路径  
            //string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);
 
            // 检查新输出文件是否已存在  
            if (File.Exists(outputFilePath))
            {
                // 如果已存在,则删除旧文件并创建新文件  
                Fhttp://www.chinasem.cnile.Delete(outputFilePath);
            }
 
            // 创建输出PDF文件  
            using (FileStream stream = new FileStream(outputFilePath, FileMode.Create))
            {
                Document pdfDoc = new Document();
                PdfCopy pdf = new PdfCopy(pdfDoc, stream);
                pdfDoc.Open();
 
                foreach (string file in inputFilePaths)
                {
                    // 读取每个PDF文件并将其页面添加到输出PDF中  
                    PdfReader reader = new PdfReader(file);
                    int n = reader.NumberOfPages;
                    for (int i = 1; i <= n; i++)
                    {
                        pdf.AddPage(pdf.GetImportedPage(reader, i));
                    }
                    reader.Close();
                }
 
                if (pdfDoc != null) pdfDoc.Close();
                stream.Close();
            }
        }
 
        /// <summary>
        /// 合并多个PDF文件为一个PDF文件
        /// </summary>
        /// <param name="inputFolderPath"></param>
        /// <param name="outputFolderPath"></param>
        /// <param name="outputPdfName"></param>
        public void MergePDFs(string inputFolderPath, string outputFolderPath, string outputPdfName)
        {
            // 获取输入文件夹中所有的PDF文件  
            string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");
 
            // 创建输出PDF文件路径  
            string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);
 
            outputPdfPath.CreateDirectoryByPath();
 
            // 创建输出PDF文件  
            using (FileStream stream = new FileStream(outputPdfPath, FileMode.Create))
            {
                Document pdfDoc = new Document();
                PdfCopy pdf = new PdfCopy(pdfDoc, stream);
                pdfDoc.Open();
 
                foreach (string file in inputFiles)
                {
                    // 读取每个PDF文件并将其页面添加到输出PDF中  
                    PdfReader reader = new PdfReader(file);
                    int n = reader.NumberOfPages;
                    for (int i = 1; i <= n; i++)
                    {
                        pdf.AddPage(pdf.GetImportedPage(reader, i));
                    }
                    reader.Close();
                }
 
                if (pdfDoc != null) pdfDoc.Close();
                stream.Close();
            }
 
            string newOutputPdfPath = Path.Combine(outputFolderPath, "AllPDF_Merged.pdf");
            //string newOutputPdfPath = Path.Combine(outputFolderPath, outputPdfName);
 
            // 检查新输出文件是否已存在  
            if (File.Exists(newOutputPdfPath))
            {
                // 如果已存在,则删除旧文件并创建新文件  
                File.Delete(newOutputPdfPath);
            }
 
            // 重命名输出PDF文件  
            File.Move(outputPdfPath, newOutputPdfPath);
        }
 
        /// <summary>
        /// 合并多个PDF文件为一个PDF文件
        /// </summary>
        /// <param name="inputFolderPath"></param>
        /// <param name="outputFolderPath"></param>
        /// <param name="outputPdfName"></param>
        public bool MergePDFs(string outputFolderPath, string outputPdfName)
        {
            var isOk = false;
            try
            {
                // 获取输入文件夹中所有的PDF文件  
                //string[] inputFiles = Directory.GetFiles(inputFolderPath, "*.pdf");
 
                // 创建输出PDF文件路径  
                string outputPdfPath = Path.Combine(outputFolderPath, outputPdfName);
 
                outputPdfPath.CreateDirectoryByPath();
 
                // 创建输出PDF文件  
                using (FileStream stream = new FileStream(outputPdfPath, FileMode.Create))
                {
                    Document pdfDoc = new Document();
                    PdfCopy pdf = new PdfCopy(pdfDoc, stream);
                    pdfDoc.Open();
 
                    foreach (string file in pdfList)
                    {
                        // 读取每个PDF文件并将其页面添加到输出PDF中  
                        PdfReader reader = new PdfReader(file);
                        int n = reader.NumberOfPages;
                        for (int i = 1; i <= n; i++)
                        {
                            pdf.AddPage(pdf.GetImportedPage(reader, i));
                        }
                        reader.Close();
                    }
 
                    if (pdfDoc != null) pdfDoc.Close();
                    stream.Close();
                }
 
                string newOutputPdfPath = Path.Combine(outputFolderPath, "AllPDF_Merged.pdf");
                //string newOutputPdfPath = Path.Combine(outputFolderPath, outputPdfName);
 
                // 检查新输出文件是否已存在  
                if (File.Exists(newOutputPdfPath))
                {
                    // 如果已存在,则删除旧文件并创建新文件  
                    File.Delete(newOutputPdfPath);
                }
 
                // 重命名输出PDF文件  
                File.Move(outputPdfPath, newOutputPdfPath);
                isOk = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("合并异常:" + ex.Message);
            }
            return isOk;
        }
 
        private void btnMergePDF_Click(object sender, EventArgs e)
        {
            if (pdfList != null && pdfList.Count > 0)
            {
                var outputFilePath = txtFileDir.Text + "\\MergePDF_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
                //MergePDFs(outputFilePath, pdfList.ToArray());
 
                var outputPdfName = "MergePDF_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
                var outputPdfNameAll = txtFileDir.Text + "\\MergePDF\\" + outputPdfName;
                outputPdfDir = txtFileDir.Text + "\\MergePDF";
                //MergePDFs(txtFileDir.Text, txtFileDir.Text+ "\\MergePDF", outputPdfName);
                var isOk = MergePDFs(outputPdfDir, outputPdfName);
                if (isOk)
                {
                    lblResult.Text = "合并完成。输出文件目录:" + outputPdfNameAll;
                    btnOpenDir.Enabled = true;
                    MessageBox.Show("合并完成");
                }                
            }
            else
            {
                MessageBox.Show("你没有要合并的PDF文件");
            }
        }
 
        private void btnOpenDir_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(outputPdfDir))
            {
                OpenDirectory(outputPdfDir);
            }
            else
            {
                MessageBox.Show("合并文件没有生成");
            }
        }
 
        static void OpenDirectory(string path)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                Arguments = path,
                FileName = "explorer.exe"
            };
 
            Process.Start(startInfo);
        }
 
        private void listViewWorkLogs_ItemCheck(object sender, ItemChecwww.chinasem.cnkEventArgs e)
        {
            var listViewItem = sender as ListViewItem;
            var index = listViewItem.Tag;
            var a = 0;
        }
 
        private int selectIndex;
        private int newIndex;
        //private string selectFileName;
 
        private void listViewWorkLogs_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listViewWorkLogs.SelectedItems.Count > 0)
            {
                var listViewItem = listViewWorkLogs.SelectedItems[0];
                selectIndex = (int)listViewItem.Tag;
                newIndex = selectIndex;
            }
        }
 
        
        private void btnMoveUp_Click(object sender, EventArgs e)
        {
            if (pdfList != null && pdfList.Count > 0)
            {
                newIndex--;
                if (newIndex >= 0 && newIndex < pdfList.Count)
                {
                    var selectFileName = pdfList[selectIndex];
                    pdfList[selectIndex] = pdfList[newIndex];
                    pdfList[newIndex] = selectFileName;
                    selectIndex = newIndex;
 
                    addPdfList();
                }
                else
                {
                    newIndex = 0;
                }
            }
        }
 
        private void btnMoveDown_Click(object sender, EventArgs e)
        {
            if (pdfList != null && pdfList.Count > 0)
            {
                newIndex++;
                if (newIndex < pdfList.Count)
                {
                    var selectFileName = pdfList[selectIndex];
                    pdfList[selectIndex] = pdfList[newIndex];
                    pdfList[newIndex] = selectFileName;
                    selectIndex = newIndex;
 
                    addPdfList();
                }
              hSFiPr  else
                {
                    newIndex = pdfList.Count - 1;
                }
            }
        }
    }
}

UI代码

 
namespace PdfMergeApp
{
    partial class Form1
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows 窗体设计器生成的代码
 
        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.txtFileDir = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.bntSelectDir = new System.Windows.Forms.Button();
            this.btnMergePDF = new System.Windows.Forms.Button();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.listViewWorkLogs = new System.Windows.Forms.ListView();
            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
            this.groupBox2 = new System.Windows.Forms.GroupBox();
            this.lblResult = new System.Windows.Forms.Label();
            this.btnOpenDir = new System.Windows.Forms.Button();
            this.btnMoveUp = new System.Windows.Forms.Button();
            this.btnMoveDown = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.groupBox2.SuspendLayout();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(12, 9);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(75, 15);
            this.label1.TabIndex = 0;
            this.label1.Text = "选择目录:";
            // 
            // txtFileDir
            // 
            this.txtFileDir.Location = new System.Drawing.Point(90, 6);
            this.txtFileDir.Name = "txtFileDir";
            this.txtFileDir.ReadOnly = true;
            this.txtFileDir.Size = new System.Drawing.Size(491, 25);
            this.txtFileDir.TabIndex = 1;
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(120, 141);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(8, 8);
            this.button1.TabIndex = 2;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // bntSelectDir
            // 
            this.bntSelectDir.Location = new System.Drawing.Point(600, 6);
            this.bntSelectDir.Name = "bntSelectDir";
            this.bntSelectDir.Size = new System.Drawing.Size(118, 35);
            this.bntSelectDir.TabIndex = 3;
            this.bntSelectDir.Text = "选择目录";
            this.bntSelectDir.UseVisualStyleBackColor = true;
            this.bntSelectDir.Click += new System.EventHandler(this.bntSelectDir_Click);
            // 
            // btnMergePDF
            // 
China编程            this.btnMergePDF.Location = new System.Drawing.Point(724, 7);
            this.btnMergePDF.Name = "btnMergePDF";
            this.btnMergePDF.Size = new System.Drawing.Size(94, 32);
            this.btnMergePDF.TabIndex = 3;
            this.btnMergePDF.Text = "合并PDF";
            this.btnMergePDF.UseVisualStyleBackColor = true;
            this.btnMergePDF.Click += new System.EventHandler(this.btnMergePDF_Click);
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.listViewWorkLogs);
            this.groupBox1.Location = new System.Drawing.Point(15, 49);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(764, 589);
            this.groupBox1.TabIndex = 4;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "文件列表";
            // 
            // listViewWorkLogs
            // 
            this.listViewWorkLogs.BackColor = System.Drawing.SystemColors.InactiveCaption;
            this.listViewWorkLogs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
            this.columnHeader1,
            this.columnHeader2});
            this.listViewWorkLogs.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listViewWorkLogs.FullRowSelect = true;
            this.listViewWorkLogs.GridLines = true;
            this.listViewWorkLogs.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
            this.listViewWorkLogs.HideSelection = false;
            this.listViewWorkLogs.ImeMode = System.Windows.Forms.ImeMode.NoControl;
            this.listViewWorkLogs.LabelWrap = false;
            this.listViewWorkLogs.Location = new System.Drawing.Point(3, 21);
            this.listViewWorkLogs.MultiSelect = false;
            this.listViewWorkLogs.Name = "listViewWorkLogs";
            this.listViewWorkLogs.Size = new System.Drawing.Size(758, 565);
            this.listViewWorkLogs.TabIndex = 2;
            this.listViewWorkLogs.UseCompatibleStateImageBehavior = false;
            this.listViewWorkLogs.View = System.Windows.Forms.View.Details;
            this.listViewWorkLogs.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.listViewWorkLogs_ItemCheck);
            this.listViewWorkLogs.SelectedIndexChanged += new System.EventHandler(this.listViewWorkLogs_SelectedIndexChanged);
            // 
            // columnHeader1
            // 
            this.columnHeader1.Text = "序号";
            this.columnHeader1.Width = 50;
            // 
            // columnHeader2
            // 
            this.columnHeader2.Text = "文件名";
            this.columnHeader2.Width = 580;
            // 
            // groupBox2
            // 
            this.groupBox2.Controls.Add(this.lblResult);
            this.groupBox2.Controls.Add(this.btnOpenDir);
            this.groupBox2.Location = new System.Drawing.Point(15, 644);
            this.groupBox2.Name = "groupBox2";
            this.groupBox2.Size = new System.Drawing.Size(809, 68);
            this.groupBox2.TabIndex = 5;
            this.groupBox2.TabStop = false;
            this.groupBox2.Text = "合并结果";
            // 
            // lblResult
            // 
            this.lblResult.AutoSize = true;
            this.lblResult.Location = new System.Drawing.Point(17, 34);
            this.lblResult.Name = "lblResult";
            this.lblResult.Size = new System.Drawing.Size(55, 15);
            this.lblResult.TabIndex = 0;
            this.lblResult.Text = "label2";
            // 
            // btnOpenDir
            // 
            this.btnOpenDir.Location = new System.Drawing.Point(709, 24);
            this.btnOpenDir.Name = "btnOpenDir";
            this.btnOpenDir.Size = new System.Drawing.Size(94, 32);
            this.btnOpenDir.TabIndex = 3;
            this.btnOpenDir.Text = "查看文件";
            this.btnOpenDir.UseVisualStyleBackColor = true;
            this.btnOpenDir.Click += new System.EventHandler(this.btnOpenDir_Click);
            // 
            // btnMoveUp
            // 
            this.btnMoveUp.Location = new System.Drawing.Point(785, 141);
            this.btnMoveUp.Name = "btnMoveUp";
            this.btnMoveUp.Size = new System.Drawing.Size(33, 42);
            this.btnMoveUp.TabIndex = 6;
            this.btnMoveUp.Text = "上移";
            this.btnMoveUp.UseVisualStyleBackColor = true;
            this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);
            // 
            // btnMoveDown
            // 
            this.btnMoveDown.Location = new System.Drawing.Point(785, 224);
            this.btnMoveDown.Name = "btnMoveDown";
            this.btnMoveDown.Size = new System.Drawing.Size(33, 42);
            this.btnMoveDown.TabIndex = 6;
            this.btnMoveDown.Text = "下移";
            this.btnMoveDown.UseVisualStyleBackColor = true;
            this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(836, 724);
            this.Controls.Add(this.btnMoveDown);
            this.Controls.Add(this.btnMoveUp);
            this.Controls.Add(this.groupBox2);
            this.Controls.Add(this.groupBox1);
            this.Controls.Add(this.btnMergePDF);
            this.Controls.Add(this.bntSelectDir);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.txtFileDir);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "PDF文件合并";
            this.groupBox1.ResumeLayout(false);
            this.groupBox2.ResumeLayout(false);
            this.groupBox2.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox txtFileDir;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button bntSelectDir;
        private System.Windows.Forms.Button btnMergePDF;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.ListView listViewWorkLogs;
        private System.Windows.Forms.ColumnHeader columnHeader1;
        private System.Windows.Forms.ColumnHeader columnHeader2;
        private System.Windows.Forms.GroupBox groupBox2;
        private System.Windows.Forms.Label lblResult;
        private System.Windows.Forms.Button btnOpenDir;
        private System.Windows.Forms.Button btnMoveUp;
        private System.Windows.Forms.Button btnMoveDown;
    }
}

到此这篇关于基于C#实现PDF文件合并工具的文章就介绍到这了,更多相关C# PDF文件合并内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于基于C#实现PDF文件合并工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153143

相关文章

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

SpringBoot3使用Jasypt实现加密配置文件

《SpringBoot3使用Jasypt实现加密配置文件》这篇文章主要为大家详细介绍了SpringBoot3如何使用Jasypt实现加密配置文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... 目录一. 使用步骤1. 添加依赖2.配置加密密码3. 加密敏感信息4. 将加密信息存储到配置文件中5

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

MySQL中闪回功能的方案讨论及实现

《MySQL中闪回功能的方案讨论及实现》Oracle有一个闪回(flashback)功能,能够用户恢复误操作的数据,这篇文章主要来和大家讨论一下MySQL中支持闪回功能的方案,有需要的可以了解下... 目录1、 闪回的目标2、 无米无炊一3、 无米无炊二4、 演示5、小结oracle有一个闪回(flashb