c#和pdf.js实现分片预览pdf

这篇具有很好参考价值的文章主要介绍了c#和pdf.js实现分片预览pdf。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源码如下:

/// <summary>
    /// 文件处理
    /// </summary>
    [RoutePrefix("api/fs")]
    public class FileStoreController : ApiController
    {

        /// <summary>
        /// 文件预览
        /// </summary>
        /// <param name="filepath">文件路径</param>
        /// <returns></returns>
        [Description("文件预览")]
        [HttpGet, Route("preview")]
        public  HttpResponseMessage Preview([Description("文件路径")] string filepath)
        {
            try
            {
                FileInfo fileInfo = new FileInfo(filepath);
                long fileSize = fileInfo.Length;
                var response = Request.CreateResponse();
                StreamContent content = null;
                // 下载的字节范围
                long startByte = 0, endByte = fileSize - 1, totalByte = fileSize;
                if (Request.Headers.TryGetValues("range", out IEnumerable<string> rangeHeader))
                {
                    // 断点续传
                    var rangeString = rangeHeader.FirstOrDefault();
                    var match = Regex.Match(rangeString, @"bytes=(\d+)-(\d+)");
                    // 文件总大小
                    totalByte = fileSize;
                    startByte = long.Parse(match.Groups[1].Value);
                    endByte = long.Parse(match.Groups[2].Value);
                    // 返回http状态
                    response.StatusCode = HttpStatusCode.PartialContent;
                    long bytesToRead = endByte - startByte + 1;
                    var contentStream = ReadFileInRange(filepath, startByte, endByte);
                    content = new StreamContent(contentStream);
                    content.Headers.ContentLength = Convert.ToInt32(endByte - startByte + 1);

                }
                else
                {
                    // 文件总大小
                    totalByte = fileSize;
                    // 下载起始位置
                    startByte = 0;
                    // 下载结束位置
                    endByte = totalByte - 1;
                    response.StatusCode = HttpStatusCode.OK;
                    using (var ms = new MemoryStream())
                    {
                        content = new StreamContent(ms);
                    }


                }
                   
                  
                   
                //表明服务器支持分片加载
                response.Headers.AcceptRanges.Add("bytes");
                //Content - Range: bytes 0 - 65535 / 408244,表明此次返回的文件范围
                content.Headers.ContentRange = new ContentRangeHeaderValue(startByte, endByte, totalByte);
                告知浏览器这是一个字节流,浏览器处理字节流的默认方式就是下载
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response.Content = content;
                //需要设置此属性,否则浏览器默认不会读取到响应头中的Accept-Ranges属性,因此会认为服务器端不支持分片,所以会直接全文下载
                response.Headers.Add("Access-Control-Expose-Headers", "*");
                response.Headers.Add("Access-Control-Allow-Headers", "range,Accept-Ranges,Content-Range,Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN,Cache-Control,If-Modified-Since");
                return response;
            }
            catch (Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "服务器内部异常");
            }
        }


        private static MemoryStream ReadFileInRange(string filePath, long startByte, long endByte)
        {
            // 验证参数
            if (startByte < 0 || endByte < startByte)
            {
                throw new ArgumentException("Invalid byte range");
            }

            try
            {
                using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    // 计算要读取的字节数
                    long bytesToRead = endByte - startByte + 1;

                    // 创建缓冲区
                    byte[] buffer = new byte[bytesToRead];

                    // 将文件流的位置设置为开始字节
                    fileStream.Seek(startByte, SeekOrigin.Begin);

                    // 读取字节到缓冲区
                    fileStream.Read(buffer, 0, (int)bytesToRead);

                    // 创建一个MemoryStream来存储读取的字节
                    MemoryStream resultStream = new MemoryStream(buffer);

                    return resultStream;
                }
            }
            catch (Exception ex)
            {
                // 在这里处理任何异常,比如文件未找到或读取错误
                Console.WriteLine("Error: " + ex.Message);
                return null;
            }
        }

源代码github地址:

https://github.com/LeoMingGit/dotNetPractiseCollect/blob/master/%E5%88%86%E7%89%87%E9%A2%84%E8%A7%88pdf/FileStoreController.cs文章来源地址https://www.toymoban.com/news/detail-653269.html

到了这里,关于c#和pdf.js实现分片预览pdf的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现PDF预览功能——pdf.js(含源码解析)

    前言 前一段时间遇到了一个需求,关于 pdf 文件的预览,客户要求如下: 只能在微信小程序内预览,不能调起本地浏览器预览; 需要让用户强制阅读 10s 后才算阅读完成,进而进行下一步操作; 用户不能下载预览的 pdf 文件; 因为一些原因(此处省略一万字🐎),这个项目

    2023年04月09日
    浏览(41)
  • vue2 使用pdf.js 实现pdf预览,并可复制文本

            需求:pdf预览,并且可以选中pdf的内容进行复制。                 在ruoyi的vue前端项目中用到,参考了网上不少文章,因为大部分没给具体的pdf.js版本,导致运行过程中报各种api 错误,经过尝试以下版本可用,故记录一下:         安装依赖:         vue 页面

    2024年01月19日
    浏览(58)
  • 【PDF.js】PDF文件预览

    使用PDFJS实现pdf文件的预览,支持预览指定页、搜索、缩略图、页面尺寸调整等等。 官方地址 文档地址 下载地址 将下载的压缩包解压并放入到项目中的public文件夹下,我这里下载的是pdfjs-4.0.379-dist版本,如下 在 pdfjs-4.0.379-dist/web/viewer.mjs 内搜索 throw new Error(“file or

    2024年04月11日
    浏览(64)
  • pdf.js预览pdf文件

    预览pdf一般通过浏览器自带的pdf预览器就可以,但有时候需要窗口预览或自定义操作,可以使用pdf.js操作 pdf.js需要构建后使用,我们可以直接下载安装pdfjs-dist,这是构建好的版本 这里注意你的环境,新版本使用了可选链,空值合并和私有 class 字段/方法等,如果你的浏览器

    2024年02月03日
    浏览(69)
  • 利用PDF.js在微信小程序里预览PDF文件

    在微信小程序可以通过wx.downloadFile 和 wx.openDocument 两个api下载并打开pdf文件。这种方式主要有不少的缺点: 1、需要下载才可以查看,且每次打开都需要下载生成一个临时文件,如果PDF文件比较多的话,临时文件会越来越多,且如果PDF文件比较大的话,打开会比较慢。 2、在导

    2024年02月03日
    浏览(75)
  • js下载图片、pdf等文件,无预览

    直接使用window.open()或window.locat.href()下载文件遇到图片或pdf文件就会跳转预览页,不能满足我想要的点击直接下载文件到本地的需求,尝试多次,最终通过以下方法实现了我的需求。 鉴于后端返回的是文件路径,首先要将文件url地址转为文件对象,代码如下: npm install saveA

    2024年02月13日
    浏览(48)
  • 使用pdf.js预览pdf文件时如何兼容chrome66版本

    最近在做一个需求,在PC端实现预览pdf文件的功能,但是要最低兼容chrome的66版本,因为公司用的chrome浏览器最低版本就是66版本。 现在下载PDF.js (链接:https://mozilla.github.io/pdf.js/) 下载下来的版本是 v3.11.174 ,都是已经构建好的。 我先拿 v3.11.174 这个版本试了一下,发现在

    2024年02月07日
    浏览(55)
  • vue或uniapp使用pdf.js预览

    一、先下载稳定版的pdf.js,可以去官网下载  官网下载地址  或  pdf.js包下载(已配置好,无需修改) 二、下载好的pdf.js文件放在public下静态文件里, uniapp是放在 static下静态文件里 三、使用方式    1. vue项目 注意路径  :src=\\\"`static/pdfjs-1.9/web/viewer.html?file=你的pdf路径  2.

    2024年02月13日
    浏览(44)
  • vue+pdf.js预览本地pdf文件(可以复制文本,滚动页码展示)

    1、安装pdfjs-dist插件,推荐使用2.0.943这个版本 2、页面中引入使用 3、页面标签 3、解析pdf,获取pdf所有页数据,使用canvas渲染,并使用TextLayerBuilder创建文本层,可以复制文本信息 在渲染pdf数据时,当pdf文件很大渲染量很多时,会导致页面卡住,无法执行其他操作;这涉及到

    2024年01月21日
    浏览(52)
  • 【vue2中的pdf预览】iframe/pdf.js/vue-pdf

    vue2中预览pdf的方法有pdf.js和vue-pdf等。下面进行简单对比使用方法的介绍。 使用iframe预览pdf 如果后端返回的不是url,那么需要使用 responseType = \\\'blob\\\' 来读取后端传来的内容。 扩展: 同样是使用iframe进行预览,如果有 其他格式 如word/xls/ppt/txt的文件需要预览,可以使用微软解

    2024年02月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包