基于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

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J