PDF补丁丁( PDFPatcher.)

PDF补丁丁( PDFPatcher.)PDF 补丁丁是一个用于修改 PDF 文件信息的工具 它具有以下功能 修改 PDF 信息 修改文档属性 页码编号 页面链接 页面尺寸 删除自动打开网页等动作 去除复制及打印限制 设置阅读器初始模式 贴心 PDF 书签编辑器 可批量修改 PDF 书签属性 颜色 样式 目标页码 缩放比例等 在书签中执行查找替换 支持正则表达式及 XPath 匹配 生成 PDF 书签 无需手工输入 自动识别正文标题或目录 为 PDF 文档生成书签 制作 PDF 文件 合并已有 PDF 文件或图片 生成新的 PDF 文件 可挂上书签 拆分或合并 PDF 文件

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  RunAndGetReturn(AspectContext context, AspectDelegate next) { await context.Invoke(next); return context.IsAsync() ? await context.UnwrapAsyncReturnValue() : context.ReturnValue; } ///  /// 处理拦截器返回结果 ///  ///  ///  ///  /// 
             private object ResultFactory(object result, Type returnType, bool isAsync) { return !isAsync ? result : TypeofTaskResultMethod .GetOrAdd(returnType, t => typeof(Task) .GetMethods() .First(p => p.Name == "FromResult" && p.ContainsGenericParameters) .MakeGenericMethod(returnType)) .Invoke(null, new object[] { result }); } #endregion   
     
   
 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

(0)
上一篇 2026年3月18日 下午8:40
下一篇 2026年3月18日 下午8:40


相关推荐

  • 安装VMtool_虚拟机没有安装VMware Tools

    安装VMtool_虚拟机没有安装VMware Tools安装VMTOOL工具1.VMtoolsVMtools顾名思义就是Vmware的一组工具。主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件、鼠标无缝切换、显示分辨率调整等,十分实用。2.先启动系统3.安装4.将安装包复制到桌面5.解压压缩包tar-zxvf*.tar.gz6.进入解压文件运行./vmware-install.pl7.安装完成选择yes,遇到选项回车。安装完成reboot。..

    2026年4月16日
    5
  • Android怎么查看手机中的本地数据库

    Android怎么查看手机中的本地数据库我前几天做的项目中有本地数据库,所以就用的SQLite,在调试数据库时,,很想看一下里面的表结构是否正确,这个时候就十分苦恼,因为这个db文件不能够直接拿出来,我们知道,在DDMS里面有一个FileExplorer,它里面保存着手机中的各个文件夹,但是尝试打开里面的文件夹的时候,却发现怎么点都没有东西,于是我就十分不解,明明我写了数据库,为什么没找到这个文件呢?后来发现其实是没有权限。下面需要注意…

    2022年5月31日
    45
  • LoadRunner11.00安装&使用教程[通俗易懂]

    LoadRunner11.00安装&使用教程[通俗易懂]本教程分为四部分内容:安装序言:由于LoadRunner12.02或者12.53版本是HP公司推出的自带免费50个虚拟用户进行压力测试的版本,目的为了工程师去学习与了解的该工具。为了增大压力(增加虚拟用户数)到达高并发的性能测试,采用LoadRunner11.00,增加对应的Lice…

    2025年11月11日
    5
  • windows安装git cmd_git for windows

    windows安装git cmd_git for windowsGitLFS(GitLargeFileStorge,Git大文件储存)。本文只介绍windows下的安装方式。写在前面,GitLFS安装依赖Git,所以我们先安装git下载地址【传送门】双击安装,直接next1.安装地址【传送门】2.安装双击->默认->确定->安装完成运行cmd下输入gitlfsinstall一般命令gitlfsinstall开启LFS功能gitlfstrackl文件追踪,一般后面”文件名.后缀”gitlf

    2025年10月4日
    6
  • [转]托管DirectX,从MDX到SlimDX的转换

    [转]托管DirectX,从MDX到SlimDX的转换开始迁移到托管 DirectXSlimD 框架的 例如 MDX 应用的帕特里克 Murrisa 地形的浏览器 在托管 DirectX 代码所示 到新的代码 与 SlimDX 评论的形式 MDX 迁移项目中 SlimDX 图书馆设置 SlimDX 下载并安装 2010 年 2 月 SlimDXSDK 微星 添加一个引用到项目中 NET 库 C ProgramFiles 文件 Sl

    2026年3月17日
    1
  • typedef关键字与结构体、结构体指针的定义

    typedef关键字与结构体、结构体指针的定义一使用 typedef 定义结构体二使用 typedef 定义结构体指针一 使用 typedef 定义结构体 typedef 用来定义新的数据类型 通常 typedef 与结构体的定义配合使用 使用 typedef 的目的使结构体的表达更加简练 所以说 typedef 语句并不是必须使用的 定义一个名字为 TreeNode 的结构体类型 现在并没有定义结构体变量 并不占用内存空间 structTreeNo

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号