介绍将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)相关推荐

  1. C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)

    PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...

  2. .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)

    PDF是一种在我们日常工作学习中最常用到的文档格式之一,但常常也会因为文档的不易编辑的特点,在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼.通常对于开发者而言,可选择通过使用组件的方式来 ...

  3. 怎么把PDF转换成CAD文件格式呢?

    我们在工作中难免会遇到各种文件格式,而每种格式都有其独特的优点.比如PDF文件格式比其他文件格式更稳定,基本上所有系统都可以打开,内容不容易修改.而CAD文件格式,在工程建设中,尤其是设计阶段被广泛应 ...

  4. word文档转为PDF以及多种文档格式转换

    word文档转为PDF以及多种文档格式转换 项目地址:https://gitee.com/Jakewabc/word-of-pdf.git 相关案例: https://github.com/aspos ...

  5. 计算机的图形图像文件格式,常见图形图像文件格式.ppt

    常见图形图像文件格式 课程简介 1.多媒体技术的基本概念 2.多媒体特征与关键技术 3.多媒体计算机系统(软件和硬件) 4.常见多媒体文件格式 5.多媒体技术的发展与应用 6.多媒体作品设计的一般流程 ...

  6. 通过Python的pdfplumber库将pdf转为图片

    文章目录 前言 一.pdfplumber库是什么? 二.安装pdfplumber库 三.查看pdfplumber库版本 四.pdf素材 五.将pdf转为图片 1.引入库 2.定义pdf路径 3.打开P ...

  7. 计算机常用图像文件格式,常用的图像文件格式

    常用的图像文件格式介绍 常用的图像文件格式 图像的文件格式决定了图像数据的存储内容和存储方式,以及文件是否与一些应用程序兼容,另外还涉及到如何与其他程序交换数据等.我们现在来列举一些常用的图像文件格式 ...

  8. Python PIL支持的图像文件格式

    Python PIL 支持的图像文件格式: BMP BUFR (identify only) CUR (read only) DCX (read only) EPS (write-only) FITS ...

  9. 如何将pdf转为word使用?

    如何将pdf转为word使用?为什么我们要将pdf文件转换成word再使用呢,因为pdf文件是一种比较稳定的文件格式,它不好编辑,转成word后我们就能随意对文件内容进行编辑修改.由于pdf文件越来越 ...

  10. 图形图像文件格式分类

    图形图像文件大致上可以分为两大类:一类为位图文件:另一类称为描绘类.矢量 类或面向对象图形图像文件.前者以点阵形式描述图形图像,后者是以数学方法描 述的一种由几何元素组成的图形图像.一般说来,后者对图 ...

最新文章

  1. adviser vs mentor
  2. “误用姓名”,前哈佛教授炮轰中国学者“碰瓷”:“整件事都让人讨厌!
  3. 递归计算Linux目录中的文件
  4. 一个文件下载的工具类
  5. 有人说,如果有条件一定要远离穷人,你赞成吗?
  6. Linux内核品读 /基础组件/ 模块机制快速入门
  7. ideahtml调用jquery函数失败_[WEB篇]-JQuery-06-Jquery实现异步调用
  8. 另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  9. 181222每日一句
  10. 算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence
  11. Java实现数学概率C ( a , b )
  12. 什么是TTL?标准USB接口是TTL吗?RS232、RS422、RS485的区别?
  13. flash助手推荐怎么删除
  14. android 第三方 im,Android基于环信SDK开发IM即时聊天
  15. java面向对象程序设计的六大基本原则
  16. 平安金融卫士 互联网理财“安全第一”
  17. 攻防世界-reverse-easyRE1
  18. [Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值
  19. 英特尔SST音频驱动导致Windows11电脑蓝屏,驱动人生带来电脑蓝屏解决方案
  20. (三)棋盘覆盖问题(代码)

热门文章

  1. js禁止中文输入 最简洁的【禁止输入中文】
  2. MFC中模拟按钮控件BN_CLICKED消息事件
  3. windows客户端,坚果云如何开启云桥模式
  4. 计算机上网记录怎么清除,win7系统彻底清除上网记录的详细方法
  5. s7edge固件android7.0,欧版S7 edge刷上Android 7.0之后:超级流畅
  6. 计算机网络 8 报文交换和分组交换2
  7. 智能电销机器人语音自动外呼效果好吗?《各版本机器人部署》
  8. Linux三剑客之awk精讲
  9. QTreeWidget 设置图片以及图片大小
  10. 记录一道有意思的题目:ArrayList的add(int index, E e)时间复杂度小于O(n)吗?