C# 将PDF文档转换为Word文档

news2024/11/25 4:26:14

一.开发框架:

.NetCore6.0
工具:Visual Studio 2022

二.思路:

1.使用SHA256Hash标识文档转换记录,数据库已经存在对应散列值,则直接返还已经转换过的文档
2.数据库没有对应散列值记录的话,则保存上传PDF文档,并进行文档转换,保留Word
3.转换成功,则在数据库记录对应文档的转换记录,用散列值做标识

三.C#后台包:

1.方法一:Spire.PDF转换包(免费的只能一次转换10页)
在这里插入图片描述
2.方法二:iTextSharp包,没有10页转换限制
在这里插入图片描述
3.mssql数据库连接包
在这里插入图片描述
4.iTextSharp包转换Word文档时,文档格式包
在这里插入图片描述

四:C#代码案例:

1.PDF转Word方法:
a.方法一:Spire.PDF包,PDF转Word方法(旧版,有页码限制):

	 /// <summary>
    /// PDF文件转化为Word文件
    /// </summary>
    /// <param name="pdfFilePath"></param>
    /// <param name="wordFilePath"></param>
    public static void ConvertPdfToWord(string pdfFilePath, string wordFilePath)
    {
        try
        {
            Spire.Pdf.PdfDocument pdfDoc = new Spire.Pdf.PdfDocument();
            pdfDoc.LoadFromFile(pdfFilePath);
            pdfDoc.SaveToFile(wordFilePath, Spire.Pdf.FileFormat.DOCX);
            pdfDoc.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error converting PDF to Word: " + ex.Message);
        }
    }

b.iTextSharp包,没有页码限制:

	 /// <summary>
    /// iTextSharp库PDF文件转Word文件
    /// </summary>
    /// <param name="pdfFilePath"></param>
    /// <param name="wordFilePath"></param>
    public static void ConvertPdfToWordByText(string pdfFilePath, string wordFilePath)
    {
        
        using (iText.Kernel.Pdf.PdfReader reader = new iText.Kernel.Pdf.PdfReader(pdfFilePath))
        {
            using (iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(reader))
            {
                Spire.Doc.Document doc = new Spire.Doc.Document();
                for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
                {
                    iText.Kernel.Pdf.PdfPage page = pdfDoc.GetPage(i);
                    var strategy = new iText.Kernel.Pdf.Canvas.Parser.Listener.LocationTextExtractionStrategy();
                    PdfCanvasProcessor parser = new PdfCanvasProcessor(strategy);
                    parser.ProcessPageContent(page);
                    string textFromPage = strategy.GetResultantText();
                    var paragraph = doc.AddSection().AddParagraph();
                    paragraph.AppendText(textFromPage);
                }

                doc.SaveToFile(wordFilePath, Spire.Doc.FileFormat.Docx);
            }
        }


    }

2.获取文件散列值方法(两种):

a.根据上传文件,获取散列值

	/// <summary>
    /// 根据上传文件获取文件散列值
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    public string CalculateSHA256Hash(IFormFile file)
    {
        try
        {
            using (var sha256 = SHA256.Create())
            {
                using (var stream = file.OpenReadStream())
                {
                    byte[] hashBytes = sha256.ComputeHash(stream);
                    string hashString = BitConverter.ToString(hashBytes).Replace("-", String.Empty);
                    return hashString;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error calculating SHA256 hash: " + ex.Message);
            return null;
        }
    }

b.根据文件路径,获取散列值

    /// <summary>
    /// 根据文件路径获取文件散列值
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public string CalculateSHA256Hash(string filePath)
    {
        try
        {
            using (FileStream stream = System.IO.File.OpenRead(filePath))
            {
                SHA256 sha = SHA256.Create();
                byte[] hash = sha.ComputeHash(stream);
                string hashString = BitConverter.ToString(hash).Replace("-", String.Empty);
                return hashString;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error calculating SHA256 hash: " + ex.Message);
            return null;
        }
    }

3.上传PDF文件,转化为Word文件方法:

    /// <summary>
    /// 文件上传
    /// </summary>
    /// <returns></returns>
    public ActionResult UploadFile()
    {
        var files = HttpContext.Request.Form.Files;
        if (files == null || files.Count <= 0)
        {
            return Json(new { code = -1, msg = "请上传文件!" });
        }

        var file = files[0];
        if (file.ContentType != "application/pdf")
        {
            return Json(new { code = -1, msg = "不是PDF文件!" });
        }

        var SHA256Hash = CalculateSHA256Hash(file);
        long fileSize = file.Length;
        if (new FileConversionBll().ExistsSHA256Hash(SHA256Hash, fileSize))
        {
            var model = new FileConversionBll().GetFileBySHA256HashAndSize(SHA256Hash, fileSize);
            return Json(new { code = 0, msg = "",data = model.WordFilePath }); 
        }
        else
        {
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            //var filePath = $@"~/File/Pdf/{fileName}";
            string pdfFilePath = System.IO.Path.Combine("PDF文档路径", fileName + ".pdf");
            using (var fileStream = new FileStream(pdfFilePath, FileMode.Create))
            {
                file.CopyTo(fileStream);
            }

            string wordFilePath = System.IO.Path.Combine("Word文档路径", fileName + ".docx");
            //ConvertPdfToWord(pdfFilePath, wordFilePath);
            ConvertPdfToWordByText(pdfFilePath, wordFilePath);

            var res = new FileConversionBll().AddFileConversion(
                new FileConversion()
                {
                    PdfFilePath = pdfFilePath,
                    WordFilePath = wordFilePath,
                    PdfSHA256Hash = SHA256Hash,
                    FileSize = fileSize
                }
            ) ;

            if (res)
            {
                return Json(new { code = 0, msg = "",data = wordFilePath });
            }
        }

        

        return Json(new {code = -2,msg = "出错了!"});
    }

五.效果图:

旧版Spire.PDF包,只转化了10页:在这里插入图片描述
新版iTextSharp包,全部转化完成(但是去除了原本的Word文档格式):
在这里插入图片描述

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

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

相关文章

Nginx 版本信息泄露解决方案

Nginx 【CVE-2021-23017;CVE-2022-41742】 【影响】 攻击者可能使用泄露的版本信息来确定该版本服务器有哪些安全漏洞&#xff0c;据此展开进一步的攻击。以下是百度的请求示例&#xff0c;也是有版本泄露&#xff1a; 【解决方案】 在Server节点增加以下配置&#xff1a; #…

一张图搞懂什么是BCD8421编码

如图所示 BCD8421编码的意义是 用四位二进制数表达一位的十进制数 因此十进制下的0&#xff5e;9在BCD8421编码下与其二进制表达是一样的 而多位的十进制数 比如说“10” 则需要将它拆分成两个单独的数“1”和“0” 分别用BCD8421编码表示这两个数 十进制“1” -> 0001 十进…

labview实现仪器的控制visa

*IDN? 是识别大多数仪器的查询指令。仪器会回应一个用于描述仪器的识别字符串。如果仪器不接受该指令&#xff0c;请在仪器手册中查询仪器能识别的指令列表。 如下图所示&#xff1a; 程序如下&#xff1a;

场景案例∣企业如何打造数智采购商城,赋能企业提速降本增效

从1998年第一个电商平台成立至今&#xff0c;已经有25年。 随着数字化经济加快发展&#xff0c;大数据、云计算、物联网及人工智能的进一步应用&#xff0c;近年来电商化采购模式也强势崛起&#xff0c;在企业采购领域掀起革命性的巨浪。 而随着市场需求的变化多样&#xff0c;…

『MySQL快速上手』-⑨-复合查询

文章目录 1.基本查询回顾2.多表查询案例3.自链接案例4.子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询5.合并查询5.1 union5.2 union all1.基本查询回顾 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J;

du_命令可以像find_命令那样列出最大的文件吗

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等_厦门微思网络的博客-CSDN博客文章浏览阅读418次。风和日丽&#xff0c;小微给你送福利~如果你是小微的老粉&#xff0c;这里有一份粉丝福利待领取...如果你是新粉关注到了小微&am…

Git企业开发级讲解(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、添加⽂件--场景⼀1、操作2、演示 二、查看 .git ⽂件1、tree .git命令2、内容讲解3、总结…

Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线

2023年11月14日&#xff0c;中国上海 —— 近日&#xff0c;由全球领先的电子商务欺诈和风险智能解决方案提供商 Riskified 发布的《政策滥用及其对商家的影响&#xff1a;2023年全球参考基准》报告显示&#xff0c;政策滥用问题正进一步恶化&#xff0c;超过九成电商商家正在承…

常用的Linux命令;Linux常用命令用法及实现方式

1.系统工作命令 (1)echo命令&#xff1a;echo命令用于在终端设备上输出字符串或变量提取后的值&#xff0c;语法格式为“echo [字符串] [$变量]”。 (2)date命令&#xff1a;date命令用于显示或设置系统的时间与日期&#xff0c;语法格式为“date [指定的格式]”。 (3)timedate…

微信怎么群发消息?答案在这,1分钟就能学会!

微信群发消息是一种方便快捷的消息发送方式&#xff0c;该功能允许用户一次性给多个好友发送相同的内容。一般来说&#xff0c;群发消息比较适用于发送节日祝福、通知、品牌推广等场景。微信怎么群发消息&#xff1f;本文将给大家详细介绍微信群发消息的操作方法&#xff0c;只…

列出目录内最大十个文件并排序

在Linux中&#xff0c;可以使用以下命令列出目录内最大的十个文件并排序&#xff1a; find ./ -type f -print0 | xargs -0 du -h | sort -rh | head -n 10 find ./ -type f -print0: find命令用于在指定目录下查找文件。这里&#xff0c;我们在当前目录下查找所有的文件&…

【Nginx】CentOS 安装Nignx

CentOS上安装Nginx&#xff1a; 1. 打开终端&#xff1a;使用SSH或者直接在服务器上打开终端。 2. 更新系统&#xff1a;运行以下命令以确保您的系统软件包列表是最新的&#xff1a; sudo yum update3. 安装Nginx&#xff1a;运行以下命令以安装Nginx&#xff1a; sudo yum…

应用在微波炉触摸屏中的低功耗触摸芯片

微波炉&#xff08;microwave oven/microwave&#xff09;&#xff0c;顾名思义&#xff0c;就是一种用微波加热食品的现代化烹调灶具。微波是一种电磁波。微波炉由电源&#xff0c;磁控管&#xff0c;控制电路和烹调腔等部分组成。电源向磁控管提供大约4000伏高压&#xff0c;…

Nodejs操作缓存数据库-Redis

Hi I’m Shendi Nodejs专栏 Nodejs操作缓存数据库-Redis 在服务端开发中&#xff0c;缓存数据库也是不可或缺的&#xff0c;可以提高程序并发以及方便后续扩展&#xff0c;而目前最常用的莫过于Redis了 安装依赖 和之前的mysql一样&#xff0c;redis的依赖最常用的就是redis …

创意无限:7大AI绘画软件揭示人工智能的绘画魅力!

本篇文章将为大家推荐7款2023年好用的AI绘画软件&#xff0c;为艺术家和设计师提供了创作灵感和效率的提升。 1、即时设计 即时设计是一款依托于浏览器运行的在线设计工具&#xff0c;可使用它进行UI设计、原型制作&#xff0c;以及团队项目管理等&#xff0c;功能十分强大&a…

el-table本地与线上的样式不一致出现错乱

使用el-table的时候有几个表头是循环出来的&#xff0c;出现在本地运行的时候&#xff0c;表头内el-input输入框样式正常&#xff0c;但是发布以后出现样式错乱问题 线上样式错乱&#xff1a;​ 本地正常&#xff1a; 出现这个问题的原因是我有几个表头是循环出来的&#xff0…

问题 D: 过山车(二分图)

首先&#xff0c;绘制二分图 核心思想&#xff1a; 对于每一个左边端点&#xff0c;查找每个右边端点&#xff0c; 若右边端点无对象&#xff0c;则暂时作为该左端点的对象 若右边端点有对象&#xff0c;递归查询其对象是否有其他选择 &#xff08;1.若有其他选择&#xf…

全网最全synchronized锁升级过程

一、前言 在面试题中经常会有这么一道面试题&#xff0c;谈一下synchronized锁升级过程&#xff1f; 之前背了一些&#xff0c;很多文章也说了&#xff0c;到底怎么什么条件才会触发升级&#xff0c;一直不太明白。 实践是检验真理的唯一标准&#xff0c;今天就和大家一起实…

uniapp+vite+vue3开发跨平台app,运行到安卓模拟器调试方法

因为没有使用hbuilder开发uniapp&#xff0c;而是使用了vscode和vite来开发的&#xff0c;所以怎么将这个程序运行到安卓模拟器调试开发呢&#xff1f;其实方法很简单&#xff0c;使用android studio创建一个模拟器或者其他mumu模拟器&#xff0c;然后将项目使用hbuilder打开&a…

空间数据结构笔记:层次包围盒树(Bounding Volume Hierarchy Based On Tree)

1 总览 层次包围盒树&#xff08;BVH树&#xff09;是一棵多叉树&#xff0c;用来存储包围盒形状。它的根节点代表一个最大的包围盒&#xff0c;其多个子节点则代表多个子包围盒。为了统一化层次包围盒树的形状&#xff0c;它只能存储同一种包围盒形状 2 AABB包围盒树&#x…