C# Spire.Pdf将PDF文件转换为Word文件

一.开发框架:

.NetCore6.0
工具:Visual Studio 2022

二.思路:

1.界面上传PDF文件,并保存
2.PDF文件转换为Word文件并保存
3.使用SHA256Hash判断文件是否已经转换过了,转换过了的话,就返回原先转换过的文件

三.C#后台包:

1.Spire.PDF转换包(免费的只能一次转换10页)
在这里插入图片描述
2.mssql数据库连接包
在这里插入图片描述

四:C#代码案例:

1.PDF转Word方法:

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

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");
                string pdfFilePath = Path.Combine("这里是你上传PDF文件保存的文件路径", fileName + ".pdf");
                using (var fileStream = new FileStream(pdfFilePath, FileMode.Create))
                {
                    file.CopyTo(fileStream);
                }

                string wordFilePath = Path.Combine("这里是你需要保存转化后Word文件的文件路径", fileName + ".docx");
                ConvertPdfToWord(pdfFilePath, wordFilePath);
				
				//FileConversion是自定义的类,在数据库记录上传过的记录
                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 = "出错了!"});
        }

五.效果图:

这里的PDF文件转化后只有10页Word。。。

上传保存的文件(源文件54页):
在这里插入图片描述

转化后的文件(只转化了10页):在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保姆级使用vuedraggable三方组件

第一步 引入vuedraggable npm i vuedraggable -S 第二步 直接使用&#xff0c;源码如下 <template><draggableclass"list-group"tag"ul"v-model"list"v-bind"{animation: 1000,group: description,disabled: false,ghostClass:…

嵌入式养成计划-49----ARM--计算机相关理论--ARM相关内容

一百二十三、计算机相关理论 123.1 计算机的组成 目前的计算机都还是 冯诺依曼体系 &#xff0c;也就是由&#xff1a;输入、输出、运算器、存储器、控制器&#xff0c;这个五个部分构成。输入&#xff1a;Input&#xff0c;常见的输入设备&#xff0c;比如鼠标&#xff0c;键…

五、L2TPv2 VPN

L2TPv2 VPN 1、L2TPv2概述1.1.目的1.2.特点 2、L2TP原理2.1.基本概念2.2.工作原理2.2.1.协议架构2.2.2.报文结构2.2.3.报文封装2.2.4.报文传输 3、工作过程4、应用场景4.1、远程拨号用户发起L2TP隧道连接4.2、LAC接入拨号请求发起L2TP隧道连接4.3、LAC接入PPPoE用户发起L2TP隧道…

远程运维的定义以及优点详细讲解-行云管家

对于IT运维小伙伴而言&#xff0c;远程运维是最平常不过的一件事情了。比如下班了需要工作&#xff0c;可以远程运维就好了&#xff1b;比如帮助用户远程安装远程运维软件等等。今天我们就一起来简单聊聊远程运维的定义以及优点&#xff0c;顺便看看市面上哪款远程运维软件好用…

开发企业微信群机器人,实现定时提醒

大家好&#xff0c;我是鱼皮&#xff0c;今天分享一个用程序解决生活工作问题的真实案例。 说来惭愧&#xff0c;事情是这样的&#xff0c;在我们公司&#xff0c;每天都要轮流安排一名员工&#xff08;当然也包括我&#xff09;去楼层中间一个很牛的饮水机那里接水。但由于大…

深耕智慧物流夯实竞争优势,极智嘉(Geek+)斩获多项大奖

全球仓储机器人引领者极智嘉(Geek)&#xff0c;一直以来致力于为仓储与制造场景提供高效柔性的智能物流解决方案&#xff0c;强劲的发展实力备受认可。而近段时间&#xff0c;极智嘉更是频频传来好消息&#xff0c;不仅斩获了英国机器人与自动化仓储创新大奖&#xff0c;获评胡…

RT-DETR算法优化改进:一种新颖的动态稀疏注意力(BiLevelRoutingAttention) | CVPR2023

💡💡💡本文独家改进: 提出了一种新颖的动态稀疏注意力(BiLevelRoutingAttention),以实现更灵活的计算分配和内容感知,使其具备动态的查询感知稀疏性 1)代替RepC3进行使用; 2)BiLevelRoutingAttention直接作为注意力进行使用; 推荐指数:五星 RT-DETR魔术师专栏介…

睿登RD6012P数控可调电源简单开箱评测

睿登RD6012P恒压恒流数控直流可调电源简单开箱评测&#xff0c;测试了一下 空载功耗和效率测试、恒流输出精度和电流回读精度测试、恒压输出精度和电压回读精度测试、输出纹波&#xff0c;还有简单分析了一下用到的芯片&#xff08;背面可看到的芯片&#xff0c;没有拆开看里面…

Flutter实践二:repository模式

1.repository 几乎所有的APP&#xff0c;从简单的到最复杂的&#xff0c;在它们的架构里几乎都包括状态管理和数据源这两部分。状态管理常见的有Bloc、Cubit、Provider、ViewModel等&#xff0c;数据源则是一些直接和数据库或者网络客户端进行交互&#xff0c;取得相应的数据&…

Spring的Redis客户端

如何在Spring中操作redis 在创建springboot项目的时候引入redis的依赖. 在配置文件里指定redis主机的地址和端口,此处我们配置了ssh隧道,所以连接的就是本机的8888端口. 创建一个controller类,注入操作redis的对象. 前面使用jedis,是通过jedis对象里的各种方法来操作redis的,此…

python用pychart库,实现将经纬度信息在地图上显示

python使用pyecharts对给到的经纬度数据进行位置标注&#xff0c;下面是批量更新。给入数据&#xff0c;将地图生成。实验数据在下面附件。 from pyecharts import options as opts from pyecharts.charts import Geo import osfolder_path F:\\GPS file_names os.listdir(f…

腾讯小程序音视频 TRTC live-pusher 黑屏等各种问题

微信小程序进行音视频开发, 主要会用到live-player live-pusher,这两个媒体组件. 在开发的过程中,会遇到各种各样的问题,其中最直接的就是黑屏问题, 以下就这个问题进行整理. 文档: https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html https://dev…

【Python】jupyter notebook(学习笔记)

Jupyter Notebook初见 1、Jupyter Notebook介绍 web版的ipython 编程、写文档、记笔记、展示 格式.ipynb 2、为什么使用Jupyter Notebook? 画图方面的优势&#xff1a;图像的生成不会堵塞后面代码的执行数据展示方面的优势&#xff1a;生成的数据可以保存在文件中 3、J…

Springboot细节补充

一、Bean是怎么装配的&#xff1f; 1、bean扫描 在之前的ssm中&#xff0c;spring要么用标签的形式来扫描包&#xff0c;要么使用注解ComponentScan来扫描 但是在Springboot中&#xff0c;启动类上默认有一个注解SpringBootApplication&#xff0c;里面就包含了ComponentScan…

CCF ChinaSoft 2023 论坛巡礼 | 云原生与智能化运维论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

[原创]仅需小小的改变,B++ Builder 12的代码完成提示即可完美工作.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

隔离在高可用架构中的使用

写作目的 最近看到了河北王校长隔离的视频&#xff0c;结合自己在工作中的应用&#xff0c;分享常见的隔离落地方案。 隔离落地方案 服务环境隔离 因为我们的项目服务于整个国内的多条产品线&#xff0c;也服务于国外。为了低成本所以使用一套代码。在产品线之间隔离&#…

14.求n!和1!+2!+...+20!和2^1+2^2+……++2^20和2^1+2^3+……++2^19

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述&#xff1a;求1&#xff01;2&#xff01;...20! 二、题目分析 三、解题 程序运行代码1程序运行代码2 一、题目描述&#xff1a;求求2^1^2^2^……2^20^二、解题 程序运行代码 一、题目…

大数据毕业设计选题推荐-消防监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

通过百度翻译API完成Java中的中英文翻译

因为要做英文文献索引分词&#xff0c;所以对于索引词汇必须得是英文&#xff0c;将表中的中文都转换成英文 这里用到百度的翻译API 首先需要注册成为百度翻译开发者&#xff1a;百度翻译开放平台 注册成为个人开发者就可以&#xff0c; 这里可以完善相关信息&#xff0c;要记…