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

一.开发框架:

.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文档格式):
在这里插入图片描述

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

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

相关文章

2024郑州光伏展|郑州储能展|郑州国际太阳能光伏储能展览会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年4月8-10日 地点&#xff1a;郑州.中原国际博览中心 随着人们对环境保护意识的不断提高&#xff0c;太阳能光伏和储能技术在能源领域的应用越来越广泛。为了更好地推广和应用太…

StackExchange.Redis 高并发下timeout超时问题如何解决?

查看服务端程序负载还行&#xff0c;根据打印的连接看到一知半懂&#xff0c;按GitHub的issue提示&#xff0c;这2个Busy的数量不能比Min的大&#xff0c;即要提示Min的数值; 的各个字段&#xff1a; Timeout performing EXEC (1000ms): 表示在执行一个事务&#xff08;MULTI..…

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

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

振南技术干货集:研发版本乱到“妈不认”? Git!(5)

注解目录 1、关于 Git 1.1Git 今生 (Git 和 Linux 的生父都是 Linus&#xff0c;振南给你讲讲当初关于 Git 的爱恨情愁&#xff0c;其背后其实是开源与闭源两左阵营的明争暗斗。) 1.2Git的爆发 (Git 超越时代的分布式思想。振南再给你讲讲旧金山三个年轻人创办 GitHub&…

程序猿的护城河是什么

文章目录 什么类型的程序员容易被淘汰&#xff1f;T型人才往底层学抛弃焦虑&#xff0c;无所畏惧地往前冲。多看多想多实践 什么类型的程序员容易被淘汰&#xff1f; 微信前首席技术负责人张绍文说过&#xff1a; “坦白说&#xff0c;现在很多移动开发工程师更像是 API工程师…

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

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

【ArcGIS Pro微课1000例】0031:las点云提取(根据范围裁剪点云)

本文讲解ArcGIS Pro3.0中,las点云数据的提取(根据范围裁剪点云)方法。 文章目录 一、加载数据二、工具介绍三、点云裁剪一、加载数据 打开ArcGIS Pro,新建地图,加载配套实验数据包中的0031.rar中的点云数据point.las与范围bound.shp,如下图所示: 二、工具介绍 名称:提…

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

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

突然消失的桌面文件如何恢复?详细教程让你轻松解决问题!

桌面文件突然消失&#xff0c;对于很多人来说&#xff0c;可能是个令人头疼的问题。这些文件可能包含重要的信息&#xff0c;也可能是数日甚至数周的努力成果。那么&#xff0c;当这种情况发生时&#xff0c;我们如何恢复丢失的文件呢&#xff1f;本文将提供一些实用的建议。 1…

QT windows与linux之间sokcet通信中文乱码问题解决方法

QT windows与linux之间sokcet通信中文乱码问题解决方法 linux发送与接收都转码utf-8: tcpClient ->write( send_msg.toUtf8());//解决乱码&#xff0c;发送转码 接收&#xff1a; QByteArray buffer tcpClient->readAll(); if(!buffer.isEmpty()) { // ui->plain…

⛳面试题-简述并分析ThreadLocalMap的key为什么是弱引用

⛳目录 简述 ThreadLocalMap 的 key 为弱引用的原因&#xff1a;分析&#xff1a;注意 &#xff1a; ThreadLocalMap 是 Java 中与 ThreadLocal 相关的一个重要类&#xff0c;用于在每个线程中存储和访问线程本地变量。在 ThreadLocalMap 中&#xff0c;key 为弱引用的主要原因…

Cesium 展示——根据鼠标移动,线实体也跟着移动

文章目录 需求分析需求 如图所示,点击第一个点后鼠标移动,实现线实体跟着鼠标移动而移动 分析 创建初始化点实体和线实体更改线实体的坐标let centerPoint; // 用于存储圆心位置 let lineEntity;//存储绘制的线条 const that = this; this.handler

navicat创建MySql定时任务

navicat创建MySql定时任务 前提 需要root用户权限 需要开启定时任务 1、开启定时任务 1.1 查看定时任务是否开启 mysql> show variables like event_scheduler;1.2 临时开启定时任务(下次重启后失效) set global event_scheduler on;1.3 设置永久开启定时任务 查看my…

【最好用最省事最权威】VMware安装出现无法删除VMware旧版本,请与技术小组联系

彻底删除之----windows install clean up 微软自己出的卸载软件&#xff0c;用它可以完美卸载VMware 选中VMware

DALL·E 2 文生图模型实践指南

前言&#xff1a;本篇博客记录使用dalle2模型进行推断时借鉴的相关资料和DEBUG流程。 相关博客&#xff1a;超详细&#xff01;DALL E 文生图模型实践指南 目录 1. 环境搭建和预训练模型准备环境搭建预训练模型下载 2. 代码3. BUG&DEBUGURLErrorCUDA errorRuntimeErrorPyd…

算法笔记-第五章-分数的四则运算

分数的四则运算 分数约分分数加法分数减法分数乘法分数除法分数的输出 分数约分 #include <cstdio> #include <algorithm> using namespace std; struct Fraction {//用结构体表示分子和分母int up, down; }; int gcd(int a, int b) {//求出最大公约数if (b 0) {r…

编程实例与解释,编程入门自学指南,中文编程工具下载

编程实例与解释&#xff0c;编程入门自学指南&#xff0c;中文编程工具下载。 编程实例可以点击最下方卡片了解&#xff0c;编程入门自学可以先从容易的入手&#xff0c;比如中文编程&#xff0c;先学习编程思路&#xff0c;然后再学习其他语言会比较轻松。中文编程工具可以下…

浅谈JavaScript闭包,小白的JS学习之路!

前言 在JavaScript中&#xff0c;闭包是一种强大而灵活的特性&#xff0c;它不仅允许变量私有化&#xff0c;而且提供了一种在函数执行完毕后仍然保持对外部作用域变量引用的机制。本文将深入讨论JavaScript闭包的概念、优点、缺点以及如何避免潜在的内存泄漏问题。 调用栈与…

Shiro快速入门之二

一、前言 Shiro快速入门之一 介绍了Shiro三大核心组件&#xff0c;四大核心功能&#xff0c;以及一个简单的Test Demo&#xff0c;接下来两篇我会用一个比较完整的例子来讲述Shiro的认证及授权是怎么做的&#xff0c;本篇侧重于介绍认证的过程 二、Shiro认证例子 1、例子概述…

H5三网魔幻手游【众神传奇】win服务端+GM授权后台+架设教程

搭建资源下载地址&#xff1a;H5三网魔幻手游【众神传奇】win服务端GM授权后台架设教程-海盗空间