C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)
介绍将PDF转换多种不同格式的图像文件格式,如PNG,BMP,EMF,TIFF等,同时,转换文档也分为转换全部文档和转换部分文档为图片两种情况,本文也将作进一步介绍
文件:n459.com/file/25127180-478311028
以下内容无关:
-------------------------------------------分割线---------------------------------------------
在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件、短信的基础支持,那么只需要根据自己的情况实现对应的接口即可。本篇随笔介绍ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成。
1、基于第三方阿里云短信的实现
阿里云短信的实现,GitHub上也有一些人实现了一些模块,我们只需要使用对应的模块,然后在Core模块中配置一下依赖即可。
我们一般在做某件事情的时候,先去看看别人是否已经做好了,使用它或者参考它来做事情是个不错的思路。
基于这个道理,我们可以在VS的Nuget包管理中查找一下基于ABP的阿里云短信,可以找到一个合适的进行参考。
这个阿里云的ABP实现适合我们当前的ABP框架版本,因此使用它即可,因此安装引入对应的类库在Core项目中。
在网站https://github.com/tangyanglai/Sms.Core 我们看到它的使用过程,引入后在项目中启动模块依赖中添加对应的代码即可。
[DependsOn(typeof(AliyunSmsModule))]
那么我们在项目中的代码如下所示
默认支持两种配置方式,配置文件和SettingManager。下面以配置文件为例,格式为:
复制代码
{
“AliyunSmsSettings”: {
“AccessKeyId”: “”,
“AccessKeySecret”: “”,
“SignName”: “”, //SendCodeAsync发送验证码使用
“TemplateCode”: “” , //SendCodeAsync发送验证码使用
}
}
复制代码
根据上面的说明,我们在Host项目的AppSettings.json中增加对应的阿里云配置项,如下所示。
其中AccessKeyId是标识用户身份的ID,AccessKeySecret 是秘钥,SigName是我们申请的短信商户签名,TemplateCode是我们验证码的配置
而短信一般是基于某个模板进行发送的,因此需要确定系统使用的短信模板。
阿里云的发送模块是使用ISmsTemplateSender进行发送的,因此在代码中使用如下所示。
那么在使用发送短信验证码的地方,如AccountService应用层中,使用的时候使用它的注入接口即可发送短信验证码了。
使用发送短信的操作如下所示。
复制代码
///
/// 发送短信验证码
///
/// 手机号码
/// 验证码
///
public async Task SendCodeAsync(string phone, string code)
{
return await _smsTemplateSender.SmsService.SendCodeAsync(phone, code);
} /// <summary>/// 发送模板消息/// </summary>/// <param name="input">模板对象</param>/// <returns></returns>public async Task<SmsResult> SendTemplateMessageAsync(SendTemplateMessageInput input){return await _smsTemplateSender.SmsService.SendTemplateMessageAsync(input);}
复制代码
2、使用自己的阿里云短信发送封装
我之前随笔《使用阿里云的短信服务发送短信》中写过如何处理阿里云短信,虽然那个是常规.net framework的程序中集成的,不过在.net Core的代码都是差不多的。
我们知道ABP框架提供了对应的短信发送接口,一般注入在系统中使用即可。
复制代码
namespace MyProject.Net
{
///
/// 短信发送接口
///
public interface ISmsSender
{
Task SendAsync(string number, string message);
}
}
复制代码
那么我们自己定义的短信发送接口,实现它即可,然后注入使用对应的接口即可。
根据阿里云接口需求,定义一个类似的模型用作加载参数的。
复制代码
///
/// 阿里云配置参数
///
internal class AliyunSmsSettting
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string RegionId { get; set; }
public string EndpointName { get; set; }
public string Domain { get; set; }
public string Product { get; set; }
public string SignName { get; set; }
public string TemplateCode { get; set; }
public string TemplateParam { get; set; }
}
复制代码
然后让我们的接口实现函数,初始化的时候获取对应的配置信息供使用。
复制代码
{
///
/// 使用简单封装,不依赖其他外部模块的阿里云短信发送
///
public class AliyunSmsSender : IShouldInitialize, ISmsSender, ITransientDependency
{
public IConfiguration AppConfiguration { get; set; }
public IIocManager IocManager { get; set; }
public ILogger Logger { get; set; }
private const string Key = "AliyunSmsSettings";private const string endpoint = "dysmsapi.aliyuncs.com";/// <summary>/// 短信配置信息/// </summary>private AliyunSmsSettting SmsSettings { get; set; }public AliyunSmsSender(IConfiguration appConfiguration, IIocManager iocManager){this.AppConfiguration = appConfiguration;this.IocManager = iocManager;this.Logger = NullLogger.Instance;}public void Initialize(){this.SmsSettings = GetConfigFromConfigOrSettingsByKey<AliyunSmsSettting>().Result;}
复制代码
然后根据我之前随笔的实现逻辑,给他实现对应的发送操作即可,部分关键代码如下所示
复制代码
///
/// 发送短信
///
/// 手机号码
/// 消息或验证码
///
public async Task SendAsync(string number, string message)
{
var result = await PrivateSend(number, message);
return result;
}
/// <summary>/// 发送逻辑/// </summary>/// <returns></returns>private async Task<CommonResult> PrivateSend(string number, string code){ string nowDate = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");//GTM时间var keyValues = new Dictionary<string, string>();//声明一个字典//1.系统参数keyValues.Add("SignatureMethod", "HMAC-SHA1");keyValues.Add("SignatureNonce", Guid.NewGuid().ToString());keyValues.Add("AccessKeyId", this.SmsSettings.AccessKeyId);keyValues.Add("SignatureVersion", "1.0");keyValues.Add("Timestamp", nowDate);keyValues.Add("Format", "Json");//可换成xml//2.业务api参数keyValues.Add("Action", "SendSms");keyValues.Add("Version", "2017-05-25");keyValues.Add("RegionId", "cn-hangzhou");keyValues.Add("PhoneNumbers", number);keyValues.Add("SignName", this.SmsSettings.SignName);keyValues.Add("TemplateCode", this.SmsSettings.TemplateCode);keyValues.Add("TemplateParam", string.Format("{{\"code\":\"{0}\"}}", code));keyValues.Add("OutId", "123");//3.去除签名关键字keyif (keyValues.ContainsKey("Signature")){keyValues.Remove("Signature");}//4.参数key排序Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString());//5.构造待签名的字符串var builder = new StringBuilder();foreach (var item in ascDic){if (item.Key == "SignName"){}else{builder.Append("&").Append(specialUrlEncode(item.Key)).Append("=").Append(specialUrlEncode(item.Value));}if (item.Key == "RegionId"){builder.Append("&").Append(specialUrlEncode("SignName")).Append("=").Append(specialUrlEncode(keyValues["SignName"]));}}string sorteQueryString = builder.ToString().Substring(1);StringBuilder stringToSign = new StringBuilder();stringToSign.Append("GET").Append("&");stringToSign.Append(specialUrlEncode("/")).Append("&");stringToSign.Append(specialUrlEncode(sorteQueryString));string Sign = MySign(this.SmsSettings.AccessKeySecret + "&", stringToSign.ToString());//6.签名最后也要做特殊URL编码string signture = specialUrlEncode(Sign);//最终打印出合法GET请求的URLstring url = string.Format("http://{0}/?Signature={1}{2}", endpoint, signture, builder);var modal = await GetHtmlResult(url);return new CommonResult(modal.Success, modal.Message); }
复制代码
然后在Core模块中初始化的时候,替换对应的短信发送实现即可。
这样就可以使用我们自己的短信接口了
发送代码如下所示
复制代码
///
/// 发送短信验证码
///
/// 手机号码
/// 验证码
///
public async Task SendSmsCodeAsync(string phone, string code)
{
return await _smsSender.SendAsync(phone, code); //使用阿里云接口
}
复制代码
3、普通短信商的短信发送集成
还有一种我们可能不是基于阿里云,而是其他提供商的接口发送,操作也是自定义短信接口的封装。
我们使用如下参数来确定短信提供商的信息,也可以根据需要自己调整。
定义一个配置对应的配置对象,方便获取参数信息。
复制代码
///
/// 自定义短信配置
///
internal class MySmsSettings
{
///
/// 供应商代码
///
public string spcode { get; set; }
///
/// 账户
///
public string username { get; set; }
///
/// 密码
///
public string password { get; set; }
}
复制代码
由于我们这个的实现也是基于标准接口ISmsSender的,那么我们实现这个后,也需要特定指定这个实现为ISmsSender的使用。
例如在CoreModule中替换为这个短信实现的话,如下代码。
//使用自定义的 ISmsSender
Configuration.ReplaceService<ISmsSender, MySmsSender>();
使用接口发送短信的时候,就和我们上面的操作类似的了。
C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)相关推荐
- C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)
PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...
- .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...
- 怎么把PDF转换成CAD文件格式呢?
我们在工作中难免会遇到各种文件格式,而每种格式都有其独特的优点.比如PDF文件格式比其他文件格式更稳定,基本上所有系统都可以打开,内容不容易修改.而CAD文件格式,在工程建设中,尤其是设计阶段被广泛应 ...
- word文档转为PDF以及多种文档格式转换
word文档转为PDF以及多种文档格式转换 项目地址:https://gitee.com/Jakewabc/word-of-pdf.git 相关案例: https://github.com/aspos ...
- 计算机的图形图像文件格式,常见图形图像文件格式.ppt
常见图形图像文件格式 课程简介 1.多媒体技术的基本概念 2.多媒体特征与关键技术 3.多媒体计算机系统(软件和硬件) 4.常见多媒体文件格式 5.多媒体技术的发展与应用 6.多媒体作品设计的一般流程 ...
- 通过Python的pdfplumber库将pdf转为图片
文章目录 前言 一.pdfplumber库是什么? 二.安装pdfplumber库 三.查看pdfplumber库版本 四.pdf素材 五.将pdf转为图片 1.引入库 2.定义pdf路径 3.打开P ...
- 计算机常用图像文件格式,常用的图像文件格式
常用的图像文件格式介绍 常用的图像文件格式 图像的文件格式决定了图像数据的存储内容和存储方式,以及文件是否与一些应用程序兼容,另外还涉及到如何与其他程序交换数据等.我们现在来列举一些常用的图像文件格式 ...
- Python PIL支持的图像文件格式
Python PIL 支持的图像文件格式: BMP BUFR (identify only) CUR (read only) DCX (read only) EPS (write-only) FITS ...
- 如何将pdf转为word使用?
如何将pdf转为word使用?为什么我们要将pdf文件转换成word再使用呢,因为pdf文件是一种比较稳定的文件格式,它不好编辑,转成word后我们就能随意对文件内容进行编辑修改.由于pdf文件越来越 ...
- 图形图像文件格式分类
图形图像文件大致上可以分为两大类:一类为位图文件:另一类称为描绘类.矢量 类或面向对象图形图像文件.前者以点阵形式描述图形图像,后者是以数学方法描 述的一种由几何元素组成的图形图像.一般说来,后者对图 ...
最新文章
- adviser vs mentor
- “误用姓名”,前哈佛教授炮轰中国学者“碰瓷”:“整件事都让人讨厌!
- 递归计算Linux目录中的文件
- 一个文件下载的工具类
- 有人说,如果有条件一定要远离穷人,你赞成吗?
- Linux内核品读 /基础组件/ 模块机制快速入门
- ideahtml调用jquery函数失败_[WEB篇]-JQuery-06-Jquery实现异步调用
- 另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
- 181222每日一句
- 算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence
- Java实现数学概率C ( a , b )
- 什么是TTL?标准USB接口是TTL吗?RS232、RS422、RS485的区别?
- flash助手推荐怎么删除
- android 第三方 im,Android基于环信SDK开发IM即时聊天
- java面向对象程序设计的六大基本原则
- 平安金融卫士 互联网理财“安全第一”
- 攻防世界-reverse-easyRE1
- [Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值
- 英特尔SST音频驱动导致Windows11电脑蓝屏,驱动人生带来电脑蓝屏解决方案
- (三)棋盘覆盖问题(代码)
热门文章
- js禁止中文输入 最简洁的【禁止输入中文】
- MFC中模拟按钮控件BN_CLICKED消息事件
- windows客户端,坚果云如何开启云桥模式
- 计算机上网记录怎么清除,win7系统彻底清除上网记录的详细方法
- s7edge固件android7.0,欧版S7 edge刷上Android 7.0之后:超级流畅
- 计算机网络 8 报文交换和分组交换2
- 智能电销机器人语音自动外呼效果好吗?《各版本机器人部署》
- Linux三剑客之awk精讲
- QTreeWidget 设置图片以及图片大小
- 记录一道有意思的题目:ArrayList的add(int index, E e)时间复杂度小于O(n)吗?