当前位置: 首页 > news >正文

.net6+aspose.words导出word并转pdf

本文使用net6框架,aspose.word破解激活并兼容net6,导出word模板并兼容识别html并给其设置字体,前端直接浏览器下载,后端保存文件并返回文件流,还有批量导出并压缩zip功能

1、安装Aspose.Words的nuget包选择21.8.0 版本(此版本可用于net6)。本文破解这个版本免费无水印,可适用21.8.0以下至18.x以上。

2、代码:

using Aspose.Words;

using Aspose.Words.Saving;

/// <summary>
/// 导出word
/// </summary>
/// <returns></returns>
[HttpPost("export")]
public IActionResult ExportWrod(string userid)

{

//载入模板
Document doc = new Document();
// 创建DocumentBuilder对象,用于在文档中添加内容
DocumentBuilder builder = new DocumentBuilder(doc);

 // 创建一个新的段落
Paragraph para = builder.InsertParagraph();

para.ParagraphFormat.Alignment = ParagraphAlignment.Center;   //段落居中
para.ParagraphFormat.LineSpacingRule = LineSpacingRule.Exactly;   //行距固定值
para.ParagraphFormat.LineSpacing = 22;  //行距-固定值
para.ParagraphFormat.SpaceBefore = 12;  //段前
para.ParagraphFormat.SpaceAfter = 12;   //段后
// 在段落中添加文本
Run header = new Run(doc, "文本");
header.Font.Size = 22;
header.Font.Bold = true; //加粗
header.Font.Name = "创艺简标宋";  //字体
para.AppendChild(header);

//处理含html文本的数据到word中

builder.Font.Size = 12;
builder.Font.Name = "创艺简楷体";
builder.InsertHtml("<p>含html的文本</p>", true);  //(true可设置builder的格式)

//目前激活码只找到Aspose.Word 21.8版本,找不到更高的版本了。
//激活之后可去除水印等等,添加下面代码即可
//原文https://www.cnblogs.com/cqpanda/p/16475319.html

new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String(asposeKey)));

const string saveFold = "../word/";
string outputPath = saveFold;
if (!Directory.Exists(outputPath))
{
    Directory.CreateDirectory(outputPath);
}

doc.Save(outputPath);

//如有需求转pdf则添加以下代码

String genWrod= "/自己的目录/刚才生成的word.docx";

Document doc1 = new Document(genWrod);
// 设置 PDF 转换选项
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions
{
    SaveFormat = SaveFormat.Pdf,
    EmbedFullFonts = true,
};
//保存为 PDF 文件
doc1.Save(saveFold + "/pdfs.pdf", pdfSaveOptions);

#region 文件下载
//修改utf8编码,不然可能汉字会乱码
string encodedFileName = System.Web.HttpUtility.UrlEncode(fileName.Replace("/", ""), System.Text.Encoding.UTF8);
byte[] fileBytes = memoryStream.ToArray();
// 设置响应头,指定文件类型和文件名
var contentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = encodedFileName
};
Response.Headers.Add("Content-Disposition", contentDisposition.ToString());
// 设置Content-Type,这里是根据文件类型设置
var contentType = "application/octet-stream";
Response.Headers.Add("Content-Type", contentType);
#endregion

return File(fileBytes, contentType);  //返回文件流,可以直接在浏览器直接下载

}

//aspose.words的key激活码,破解这个版本免费无水印,可适用21.8.0以下至18.x以上。

private const string asposeKey = "DQo8TGljZW5zZT4NCjxEYXRhPg0KPExpY2Vuc2VkVG8+VGhlIFdvcmxkIEJhbms8L0xpY2Vuc2VkVG8+DQo8RW1haWxUbz5ra3VtYXIzQHdvcmxkYmFua2dyb3VwLm9yZzwvRW1haWxUbz4NCjxMaWNlbnNlVHlwZT5EZXZlbG9wZXIgU21hbGwgQnVzaW5lc3M8L0xpY2Vuc2VUeXBlPg0KPExpY2Vuc2VOb3RlPjEgRGV2ZWxvcGVyIEFuZCAxIERlcGxveW1lbnQgTG9jYXRpb248L0xpY2Vuc2VOb3RlPg0KPE9yZGVySUQ+MjEwMzE2MTg1OTU3PC9PcmRlcklEPg0KPFVzZXJJRD43NDQ5MTY8L1VzZXJJRD4NCjxPRU0+VGhpcyBpcyBub3QgYSByZWRpc3RyaWJ1dGFibGUgbGljZW5zZTwvT0VNPg0KPFByb2R1Y3RzPg0KPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0Pg0KPC9Qcm9kdWN0cz4NCjxFZGl0aW9uVHlwZT5Qcm9mZXNzaW9uYWw8L0VkaXRpb25UeXBlPg0KPFNlcmlhbE51bWJlcj4wM2ZiMTk5YS01YzhhLTQ4ZGItOTkyZS1kMDg0ZmYwNjZkMGM8L1NlcmlhbE51bWJlcj4NCjxTdWJzY3JpcHRpb25FeHBpcnk+MjAyMjA1MTY8L1N1YnNjcmlwdGlvbkV4cGlyeT4NCjxMaWNlbnNlVmVyc2lvbj4zLjA8L0xpY2Vuc2VWZXJzaW9uPg0KPExpY2Vuc2VJbnN0cnVjdGlvbnM+aHR0cHM6Ly9wdXJjaGFzZS5hc3Bvc2UuY29tL3BvbGljaWVzL3VzZS1saWNlbnNlPC9MaWNlbnNlSW5zdHJ1Y3Rpb25zPg0KPC9EYXRhPg0KPFNpZ25hdHVyZT5XbkJYNnJOdHpCclNMV3pBdFlqOEtkdDFLSUI5MlFrL2xEbFNmMlM1TFRIWGdkcS9QQ2NqWHVORmp0NEJuRmZwNFZLc3VsSjhWeFExakIwbmM0R1lWcWZLek14SFFkaXFuZU03NTJaMjlPbmdyVW40Yk0rc1l6WWVSTE9UOEpxbE9RN05rRFU0bUk2Z1VyQ3dxcjdnUVYxbDJJWkJxNXMzTEFHMFRjQ1ZncEE9PC9TaWduYXR1cmU+DQo8L0xpY2Vuc2U+DQo=";

前端代码:

            //下载报告,直接在浏览器下载

            function downloadMyReport() {

                var cellData = {

                    "userid": userId

                };


 

                $.ajax({

                    url: prefix + "new/api/Export/export?userid=" + userId, // 替换为你的API地址

                    type: 'POST',

                    data: {

                        userid: userId // 用户ID

                    },

                    xhrFields: {

                        responseType: 'blob' //设置二进制

                    },

                    success: function (data, status, xhr) {

                        //获取header中的内容

                        var contentDispositionHeader = xhr.getResponseHeader('Content-Disposition');

                        var fileName = contentDispositionHeader ? contentDispositionHeader.split('filename=')[1] : 'default_filename.docx';

                        //需要对汉字编码否则会可能会路阿妈

                        var decodedFileName = decodeURIComponent(fileName);

                        // 创建Blob对象

                        var blob = new Blob([data], { type: 'application/octet-stream' });

                        // 创建临时URL并分配给一个链接

                        var url = window.URL.createObjectURL(blob);

                        var a = document.createElement('a');

                        a.href = url;

                        a.download = decodedFileName;

                        document.body.appendChild(a);

                        a.click();

                    }

                });

            }

3、如需要批量导出并压缩zip看下面代码思路

List<BatchExportWord> batchExportWordList = new List<BatchExportWord>();
//此处循环上第2步骤的思路即可

foreach (var process in processList)

{

#region此处写第2部分绘画word的代码即可

Document doc = new Document();

// 创建DocumentBuilder对象,用于在文档中添加内容
DocumentBuilder builder = new DocumentBuilder(doc);

......................

#endregion

//下面填充batchExportWordList集合存放批量word字节集合

using (MemoryStream stream = new MemoryStream())
{
    doc.Save(stream, SaveFormat.Docx); 
    batchExportWordList.Add(new BatchExportWord()
    {
        Byte = stream.ToArray(),
        Name = wordname
    }); ;
}

}  //foreach结尾

#region 批量压缩word到zip中
// 使用GZipStream进行压缩并写入文件
Guid guid = Guid.NewGuid();
string file_name = DateTime.Now.ToString("yyyyMMddhhmmss") + guid + ".zip";
using (FileStream zipStream = new FileStream(outputPath + "/" + file_name, FileMode.Create))
using (ZipArchive zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create))
{
    // 遍历字word节流集合并将每个字节流写入 ZIP 文件的一个条目
    foreach (var item in batchExportWordList)
    {
        var entry = zipArchive.CreateEntry(item.Name.Replace("/", "") + ".docx"); // 注意此处名字里如果有"/"的话会自动根据杠压缩多层层文件夹
        using (var entryStream = entry.Open())
        {
            entryStream.Write(item.Byte, 0, item.Byte.Length); //把字节写入生成
        }
    }
}
#endregion

以上代码从接口中摘抄出来,可能需要自己摘抄小部分修改。

相关文章:

.net6+aspose.words导出word并转pdf

本文使用net6框架&#xff0c;aspose.word破解激活并兼容net6&#xff0c;导出word模板并兼容识别html并给其设置字体&#xff0c;前端直接浏览器下载&#xff0c;后端保存文件并返回文件流&#xff0c;还有批量导出并压缩zip功能 1、安装Aspose.Words的nuget包选择21.8.0 版本…...

深度学习 植物识别算法系统 计算机竞赛

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…...

《深入浅出进阶篇》洛谷P4147 玉蟾宫——悬线法dp

上链接&#xff1a;P4147 玉蟾宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4147 上题干&#xff1a; 有一个NxM的矩阵&#xff0c;每个格子里写着R或者F。R代表障碍格子&#xff0c;F代表无障碍格子请找出其中的一个子矩阵&#xff0c…...

社区论坛小程序源码系统,功能齐全,页面简洁,前端+后端+完整部署教程

现如今&#xff0c;社区论坛已经成为人们交流思想&#xff0c;分享经验&#xff0c;获取信息的重要平台。近年来&#xff0c;小程序的出现更是改变了传统的网站建设方式&#xff0c;让用户体验更加便捷&#xff0c;高效。今天源码小编来和大家分享一款社区论坛小程序源码系统&a…...

大数据开发面试(一)

1、Kafka 和 Flume 的应用场景&#xff1f; Kafka 和 Flume 的应用场景如下&#xff1a; Kafka&#xff1a;定位消息队列&#xff0c;适用于多个生产者和消费者共享一个主题队列的场景。适用于需要高吞吐量、可扩展性和容错能力的场景。主要用于大数据处理、实时数据流分析和日…...

softmax的高效CUDA编程和oneflow实现初步解析

本文参考了添加链接描述,其中oneflow实现softmax的CUDA编程源代码参考链接添加链接描述 关于softmax的解读以及CUDA代码实现可以参考本人之前编写的几篇文章添加链接描述,添加链接描述,添加链接描述 下面这个图片是之前本人实现的softmax.cu经过接入python接口,最终和pytor…...

如何解决 Node.js 20 升级中未预期的请求问题

在 Tubi&#xff0c;我们使用 Node.js 为 Web/OTT 应用进行服务端渲染及代理请求。近来&#xff0c;为了从新版本的性能改进和新功能中受益&#xff0c;我们将 Node.js 从 14.x 版本升级到了 20.x。 升级像 Node.js 这样的基础设施绝非易事&#xff0c;尤其是有着许多第三方依…...

no tests were found

将带有Test的方法返回类型设为void...

泛型擦除是什么

//在编译阶段使用泛型,运行阶段取消泛型,就是擦除. //因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除, //擦除是将泛型以其父类代替,如String变成了object等. //在使用的时候还是进行带强制类型转化,只不过这是比较安全的转换,…...

7、线性数据结构-切片

切片slice 容器容量可变&#xff0c;所以长度不能定死长度可变&#xff0c;元素个数可变底层必须依赖数组&#xff0c;可以理解它依赖于顺序表&#xff0c;表现也像个可变容量和长度顺序表引用类型&#xff0c;和值类型有区别 定义切片 var s1 []int //长度、容量为0的切片&…...

linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh

系统部署在物理机上&#xff0c;开机后一直pxe不进系统&#xff0c;怀疑GRUB丢失。 查看bios 里 采用uefi 启动方式&#xff0c; 无硬盘系统引导选项&#xff0c; 且BMC设置为硬盘永久启动也无效。 挂载光驱ISO进入救援模式,sda为系统盘&#xff0c;重装grub报错 grub2-inst…...

建筑楼宇智慧能源管理系统,轻松解决能源管理问题

随着科技的进步与人们节能减排意识的不断增强&#xff0c;建筑楼宇是当下节能减排的重要工具。通过能源管理平台解决能效管理、降低用能成本、一体化管控、精细化管理和服务提供有力支撑。 建筑楼宇智慧能源管理系统是一种利用先进手段&#xff0c;采用微服务架构&#xff0c;…...

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…...

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…...

深入跨域 - 从初识到入门 | 京东物流技术团队

前言 跨域这两个字就像一块狗皮膏药一样黏在每一个前端开发者身上&#xff0c;无论你在工作上或者面试中无可避免会遇到这个问题。如果在网上搜索跨域问题&#xff0c;会出现许许多多方案&#xff0c;这些方案有好有坏&#xff0c;但是对于阐述跨域的原理和在什么情况下需要用…...

WebSocket真实项目总结

websocket websocket是什么? websocket是一种网络通讯协议。 websocket 是HTML5开始提供的一种在单个TCP链接上进行全双工通讯的协议。 为什么需要websocket? 初次接触websocket&#xff0c;都会带着疑惑去学习&#xff0c;既然已经有了HTTP协议&#xff0c;为什么还需要另一…...

Python 如何实现解释器(Interpreter)设计模式?什么是解释器设计模式?

什么是解释器&#xff08;Interpreter&#xff09;设计模式&#xff1f; 解释器&#xff08;Interpreter&#xff09;设计模式是一种行为型设计模式&#xff0c;它定义了一种语言文法的表示&#xff0c;并提供了一个解释器&#xff0c;用于解释语言中的句子。该模式使得可以定…...

单片机与PLC的区别有哪些?

单片机与PLC的区别有哪些? 什么是单片机&#xff1f; 单片机&#xff08;Microcontroller&#xff0c;缩写MCU&#xff09;是一种集成了中央处理器&#xff08;CPU&#xff09;、存储器和输入/输出接口等功能模块的微型计算机系统。它通常被用于嵌入式系统和控制系统中&#x…...

修改浏览器滚动条样式--ios同款

::-webkit-scrollbar{width: 5px;height: 5px; } ::-webkit-scrollbar-thumb{border-radius: 1em;background-color: rgba(50,50,50,.3); } ::-webkit-scrollbar-track{border-radius: 1em;background-color: rgba(50,50,50,.1); } 修改滚动条样式用到的CSS伪类&#xff1a; :…...

python自动化测试selenium核心技术3种等待方式详解

这篇文章主要为大家介绍了python自动化测试selenium的核心技术三种等待方式示例详解&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助&#xff0c;祝大家多多进步早日升职加薪 UI自动化测试过程中&#xff0c;可能会出现因测试环境不稳定、网络慢等情况&a…...

2026年4月3日 理论基石:数据量与模型参数量的关系

文章目录1. 理论基石&#xff1a;数据量与模型参数量的关系Kaplan Scaling Laws (OpenAI, 2020)Chinchilla Scaling Laws (DeepMind, 2022)2. 实战计算&#xff1a;针对你的 nanoGPT 实验第一步&#xff1a;估算总 Token 数第二步&#xff1a;计算训练步数 (max_iters)第三步&a…...

【数据结构】线索二叉树之中序遍历线索化详解与实现

在二叉树的遍历过程中&#xff0c;我们会发现大量的空指针域被浪费&#xff0c;而线索二叉树的核心思想就是利用这些空指针&#xff0c;将其指向节点的前驱或后继节点&#xff0c;从而实现二叉树的非递归遍历无需借助栈&#xff0c;提升遍历效率。本文将详细讲解中序遍历线索化…...

南京大学等联合发布开源语音大模型VITA-Qinyu,首发支持角色扮演+哼唱

在 AI 语音交互的赛道上&#xff0c;南京大学联合腾讯音乐研发的 VITA-Qinyu 正式亮相。这是业内首款兼具自然对话、高表现力角色扮演与歌唱能力的开源端到端语音语言模型&#xff08;SLM&#xff09;&#xff0c;一举打破了传统语音模型仅聚焦对话准确性、缺乏情感与场景表现力…...

NodeList 对象

NodeList 对象 概述 NodeList 对象是 DOM(文档对象模型)中的一种数据结构,它代表了包含在一个父节点内的所有元素节点的一个集合。NodeList 对象常用于处理文档中的多个元素,是 JavaScript 在操作 DOM 时的一个重要工具。 特点 1. 长度属性 NodeList 对象具有一个 len…...

OpenClaw学习助手:Qwen3.5-9B自动整理学术PDF笔记

OpenClaw学习助手&#xff1a;Qwen3.5-9B自动整理学术PDF笔记 1. 为什么需要自动化文献整理 作为一名每天需要阅读大量文献的研究者&#xff0c;我长期被两个问题困扰&#xff1a;一是PDF里的关键信息需要手动复制粘贴到笔记软件&#xff0c;二是不同文献的结论难以横向对比。…...

文件夹的修改日期可以改吗?分享你三个修改方法

在电脑文件管理中&#xff0c;系统不支持直接修改文件夹的「修改时间」&#xff0c;但日常整理文件、统一项目时间戳、还原备份文件夹时间、办公归档时&#xff0c;经常需要自定义修改这个属性。本文给大家整理了3 种实用方法&#xff1a;第一种是汇帮批量重命名工具&#xff0…...

判断当前页面是否以「添加到主屏幕」应用形态启动 (快捷方式\APP、套壳包等启动)

这里写自定义目录标题判断当前页面是否以「添加到主屏幕」应用形态启动判断当前页面是否以「添加到主屏幕」应用形态启动 /*** 判断当前页面是否以「添加到主屏幕」应用形态启动* - iOS Safari: navigator.standalone* - 标准 PWA: display-mode 为 standalone/fullscreen/min…...

拆解中金2025财报:飞轮效应,如何驱动高质量增长?

2025年的中国资本市场&#xff0c;有三条主线在交汇&#xff1a;创新驱动、资本市场深化改革、个人养老金全面推开。它们分别指向一家投行必须具备的三种能力——资产端的挖掘、交易端的兑现、资金端的配置。 与此同时&#xff0c;证券行业正在经历一场无声的洗牌。牌照红利在…...

如何用xianyu_spider实现高效电商数据采集?从入门到精通的完整指南

如何用xianyu_spider实现高效电商数据采集&#xff1f;从入门到精通的完整指南 【免费下载链接】xianyu_spider 闲鱼APP数据爬虫 项目地址: https://gitcode.com/gh_mirrors/xia/xianyu_spider 在当今电商竞争日益激烈的环境下&#xff0c;获取准确、及时的市场数据成为…...

Fast Video Cutter Joiner(视频剪切合并软件)

链接&#xff1a;https://pan.quark.cn/s/fb790471c8c6Fast Video Cutter Joiner是一款强大的视频剪切合并工具&#xff0c;可以帮助用户对视频进行剪切或者合并处理&#xff0c;并支持编辑常见视频格式。这是一个快速的视频剪辑和加入软件&#xff0c;具有易于使用的界面。它允…...