181  
查询码:00000709
使用pdf转图片解决在MUI移动端在线预览pdf的问题
作者: 朱鹏程 于 2020年07月23日 发布在分类 / 人防组 / 人防后端 下,并于 2020年07月23日 编辑
PDF转图片


  1. 在MUI移动端框架中尝试使用pdf.js等第三方前端插件进行pdf在线查看功能开发,但是在多次尝试之后也无法实现,故打算采用后端将pdf转为图片的方式给到前端进行展示。
  2. 使用的pdf转换的包:粘贴图片
  3. 主要思路:首先与前端约定好输入输出参数,其次将pdf转换为图片后存放于新创建的文件夹中,再将相对路径拼接好返回。
  4. 在解决完成后发现一个问题:如果每次前端想预览pdf都会做一次转换,然后会产生冗余的图片,占用资源会非常大。针对这个问题又对其进行了改进:首先在输入参数中增加了一个标识,这个标识是pdf的唯一标识,我根据这个标识创建文件夹,保证了文件夹中存放单各pdf转换出的图片(可能会又多张),每次转换之前我会先查找目录是否存在,如果存在则将该目录下的所有图片返回,如果不存在则创建文件夹、转换图片保存之后返回,具体实现代码如下:
            /// <summary>
            /// pdf转图片
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            [AllowAnonymous]
            [HttpPost, Route("PdfConvertImage")]
            public IEnumerable<PdfConvertImageOutputDto>  PdfConvertImage([FromBody]PdfConvertImageInputDto dto)
            {
                List<PdfConvertImageOutputDto> result= new List<PdfConvertImageOutputDto>();
                //判断pdf路径下文件是否存在
                if (System.IO.File.Exists(serverBaseUrl + dto.PdfUrl)) {
                    //判断是否该pdf文件是否已转成过图片
                    if (System.IO.Directory.Exists(serverBaseUrl + @"/images/" + dto.RowGuid))
                    {
                        //查找该文件夹下所有jpg图片
                        var files = Directory.GetFiles(serverBaseUrl + @"/images/" + dto.RowGuid, "*.jpg");
                        foreach (var file in files)
                        {
                            //将所有图片路径循环拼接返回
                            result.Add(new PdfConvertImageOutputDto()
                            {
                                ImageUrl = @"/Upload/images/" + dto.RowGuid + "/" + Path.GetFileName(file)
                            });
                        }
                    }
                    else
                    {
                        //创建文件夹
                        Directory.CreateDirectory(serverBaseUrl + @"/images/" + dto.RowGuid);
                        //加载pdf文件
                        var pdf = PdfDocument.Load(serverBaseUrl + dto.PdfUrl);
                        var pdfpage = pdf.PageCount;
                        var pagesizes = pdf.PageSizes;
                        //循环pdf中的每一页,按页转成图片
                        for (int i = 1; i <= pdfpage; i++)
                        {
                            Size size = new Size();
                            size.Height = (int)pagesizes[(i - 1)].Height;
                            size.Width = (int)pagesizes[(i - 1)].Width;
                            RenderPage(serverBaseUrl + dto.PdfUrl, i, size, serverBaseUrl + @"\images\" + dto.RowGuid + "/" + i + @".jpg");
                            //将所有图片路径循环拼接返回
                            result.Add(new PdfConvertImageOutputDto()
                            {
                                ImageUrl = @"/Upload/images/" + dto.RowGuid + "/" + i + @".jpg"
                            });
                        }
                    }
                }
                return result;
            }


参考的博文:https://blog.csdn.net/touhousonic/article/details/86711506




 推荐知识

 历史版本

修改日期 修改人 备注
2020-07-23 10:03:17[当前版本] 朱鹏程 创建版本

 附件

附件类型

JPGJPG

知识分享平台 -V 4.8.7 -wcp