PDF补丁丁是一个用于修改PDF文件信息的工具。它具有以下功能:
修改PDF信息:修改文档属性、页码编号、页面链接、页面尺寸;删除自动打开网页等动作,去除复制及打印限制;设置阅读器初始模式。 贴心PDF书签编辑器:可批量修改PDF书签属性(颜色、样式、目标页码、缩放比例等),在书签中执行查找替换(支持正则表达式及XPath匹配)。 生成PDF书签:无需手工输入,自动识别正文标题或目录,为PDF文档生成书签。 制作PDF文件:合并已有PDF文件或图片,生成新的PDF文件(可挂上书签)。 拆分或合并PDF文件,并保留原文件的书签或挂上新的书签。 高速无损导出PDF文档的图片。 提取或删除PDF文档中指定的页面,调整PDF文档的页面顺序。 根据PDF文档元数据重命名PDF文件名。 调用微软 Office 的图像识别引擎分析PDF文档图片中的文字;将图片PDF的目录页转换为PDF书签。识别结果可写入PDF文件。 分析文档结构:以树视图显示PDF文档结构,可编辑修改PDF文档节点,或将PDF文档导出成XML文件,供PDF爱好者分析、调试之用。 永久免费,绝不过期,无广告,无弹出废话对话框。
文件:590m.com/f/–b9f9b4(访问密码:)
以下内容无关:
——————————————-分割线———————————————
在最近一段时间内,对这个框架新增了以下功能:
1、新增了CMS模块,目前整体都比较简单,适合个人博客使用。
2、新增了AOP缓存,使用AspectCore,缓存可做到Memarycache和redis一件切换。
3、新增AOP事务,服务层和控制器都可以打上特性标签使用。
4、对多租户使用Filter,不管是添加还是更新、查询即可自动赋值。
5、新增七牛云图片上传功能。
6、对于单表的增删改查,在控制器内做了封装,有新的业务按约定建立对应的CRUD实体,一套API自动完成。
7、后台管理新增站群管理。
说了那么多,让我们上点代码和截图来瞧一瞧吧。
#region 拦截处理 /// /// 过期时间,单位:分 /// /// public CacheInterceptorAttribute(string cacheKey = null, int expireMin = -1) { _expireSecond = expireMin * 60; _cacheKey = cacheKey; } public async override Task Invoke(AspectContext context, AspectDelegate next) { try { string key = string.Empty; //自定义的缓存key不存在,再获取类名+方法名或类名+方法名+参数名的组合式key if (!string.IsNullOrEmpty(_cacheKey)) { key = _cacheKey; } else { key = GetKey(context.ServiceMethod, context.Parameters); } var returnType = GetReturnType(context); var cache = context.ServiceProvider.GetService
(); if (!cache.Exists(key)) { return; } var strResult = cache.Get
(key); var result = JsonConvert.DeserializeObject(strResult, returnType); if (result != null) { context.ReturnValue = ResultFactory(result, returnType, context.IsAsync()); } else { result = await RunAndGetReturn(context, next); if (_expireSecond > 0) { cache.Set(key, result, TimeSpan.FromMinutes(_expireSecond)); } else { cache.Set(key, result); } } } catch (Exception e) { Console.WriteLine(e.Message); } } private static string GetKey(MethodInfo method, object[] parameters) { return GetKey(method.DeclaringType.Name, method.Name, parameters); } private static string GetKey(string className, string methodName, object[] parameters) { var paramConcat = parameters.Length == 0 ? string.Empty : ":" + JsonConvert.SerializeObject(parameters); return $"{className}:{methodName}{paramConcat}"; } ///
/// 获取被拦截方法返回值类型 /// ///
///
private Type GetReturnType(AspectContext context) { return context.IsAsync() ? context.ServiceMethod.ReturnType.GetGenericArguments().First() : context.ServiceMethod.ReturnType; } /// /// 执行被拦截方法 /// /// /// ///
private async Task
model.SiteId = siteId.Value; } } } //} } }
public ApiTenantBaseController(IBaseServer
service, IMapper mapper) { _service = service; _mapper = mapper; } ///
/// 批量真实删除 /// ///
///
[HttpDelete] public virtual async Task
Deletes([FromBody] TDeleteInput deleteInput) { var res = await _service.DeleteAsync(deleteInput.Ids); if (res <= 0) { throw new FriendlyException("删除失败了!"); } return new ApiResult(); } ///
/// 单个真实删除 /// ///
///
[HttpDelete] public virtual async Task
Delete([FromBody] TDeleteInput deleteInput) { foreach (var item in deleteInput.Ids) { var res = await _service.DeleteAsync(d => d.Id == item && d.SiteId == deleteInput.SiteId); if (res <= 0) { throw new FriendlyException("删除失败了!"); } } return new ApiResult(); } ///
/// 软删除 /// ///
///
[HttpDelete] public virtual async Task
SoftDelete([FromBody] TDeleteInput deleteInput) { foreach (var item in deleteInput.Ids) { var res = await _service.UpdateAsync(d => new TEntity() { Status = false }, d => d.Id == item && d.SiteId == deleteInput.SiteId&&d.Status==true); if (res <= 0) { throw new FriendlyException("删除失败了!"); } } return new ApiResult(); } ///
/// 列表分页 /// ///
参数实体 ///
[HttpGet] public virtual async Task
GetListPages([FromQuery] TListQuery listQuery) { var res = await _service.GetPagesAsync(listQuery.Page, listQuery.Limit, d => d.SiteId == listQuery.SiteId&&d.Status==true, d => d.Id, false); return new ApiResult(data: new { count = res.TotalItems, items = res.Items }); } ///
/// 详情 /// ///
参数实体 ///
[HttpGet] public virtual async Task
Detail([FromQuery] TDetailQuery detailQuery) { var res = await _service.GetModelAsync(d => d.Id == detailQuery.Id && d.SiteId == detailQuery.SiteId&&d.Status==true); return new ApiResult(data: res); } ///
/// 添加 /// ///
添加实体 ///
[HttpPost] public virtual async Task
Add([FromBody] TCreateInput createInput) { var entity = _mapper.Map
(createInput); var res = await _service.AddAsync(entity); if (res <= 0) { throw new FriendlyException("添加失败了!"); } return new ApiResult(data: res); } ///
/// 修改-默认忽略更新CreateTime字段 /// ///
修改实体 ///
[HttpPut] public virtual async Task
Modify([FromBody] TUpdateInput updateInput) { var entity = _mapper.Map
(updateInput); var res = await _service.UpdateAsync(entity, d => new { d.CreateTime }); if (res <= 0) { throw new FriendlyException("修改失败了!"); } return new ApiResult(data: res); } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212167.html原文链接:https://javaforall.net
