猫晨 2024-09-02 14:42 采纳率: 25%
浏览 152
已结题

pdfjs库如何在前端实现打印、旋转等功能

在下面的代码中,我使用pdfjs实现了pdf的预览功能,但是这里的预览框并没有像浏览器内置预览框那样有打印、旋转、放大缩小等按钮。初步分析原因可能是因为没有pdfviewer库,这里要怎么集成呢?或者说是否是我的思路有误,可以用其他的实现方式呢?


        // 函数:渲染PDF到Canvas
        function renderPDF(url, canvasId) {
            var loadingTask = pdfjsLib.getDocument(url);
            loadingTask.promise.then(function(pdf) {
                console.log('PDF loaded');
                pdf.getPage(1).then(function(page) {
                    console.log('Page loaded');
                    var scale = 1.5;
                    var viewport = page.getViewport({scale: scale, rotation: 0});
                    var canvas = document.getElementById(canvasId);
                    var context = canvas.getContext('2d');
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;
                    var renderContext = {
                    canvasContext: context,
                    viewport: viewport
                    };
                    page.render(renderContext).promise.then(function() {
                    console.log('Page rendered');
                    });
                });
            }, function(reason) {
                console.error(reason);
            });
        }


        //系统加载
        $(document).ready(function () {
            // 初始化加载菜单内容        
            var lm_html = '<div class="layui-collapse" lay-accordion="">' + leftSubMenu(convertMenuData(leftMenuData)) + '</div>';
            $('.father-box').html(lm_html);
            element.init();
            // 将搜索按钮点击事件和搜索文本输入回车事件绑定到performSearch函数上
            $('.search-button').on('click', performSearch);
            $('.search-input').on('keypress', function (event) {
                if (event.which === 13) {
                    performSearch();
                    element.init();
                }
            });
            // 点击清空按钮时执行
            $('.home-button').on('click', function () {
                $('.search-input').val(''); // 清空搜索框内容
                $('.father-box').html(lm_html);
                $('.img-box').html('<div id="home" class="home">欢迎使用检验科外部文档库<br>LIS-DOC</div>');
                element.init();
            });
            $('.search-input').focus();           
        });


        //在右侧父元素father-box上绑定点击事件,事件委托到class为child-li的元素上。
        $('.father-box').on('click', '.child-li', function () {
            //当点击菜单项时,获取该元素的自定义属性data-id并替换其中的单引号为双引号。
            var filesStr = $(this).data("id").replace(/'/g, '"');
            //将获取到的文件信息的JSON字符串解析为JavaScript对象。
            var files = JSON.parse(filesStr);
            //定义一个变量_html,用于存储生成的HTML代码。
            var _html = '';
            //遍历文件数组,如果文件名包含'.pdf',则生成一个包含pdf文件的embed元素的div,否则生成一个包含图片的img元素的div。
            $.each(files, function (i, file) {
                if (file.indexOf('.pdf') > -1) {
                    // _html += '<div class="d-box embed-d-box"><embed class="pdf-box" src="./files/' + file + '" /></div>';

                    _html += '<div class="d-box"><canvas id="pdf-canvas"></canvas></div>';
                    // 渲染PDF
                    renderPDF('./files/' + file, 'pdf-canvas');
                } else if (file.indexOf('.mp4') > -1) {
                    _html += '<div class="d-box video-d-box"><video controls><source src="./files/' + file + '" type="video/mp4"></video></div>';
                } else {
                    _html += '<div class="d-box"><img src="./files/' + file + '"></div>';
                }
            });
            //将生成的HTML代码插入到class为img-box的元素中。
            $('.img-box').html(_html);
            //将class为embed-d-box的div的高度设置为浏览器窗口高度减去55。
            $('div.embed-d-box').height($(window).height() - 55)
            //函数提前返回,下面的代码不会执行。
            return;
            //获取点击元素在兄弟元素中的索引和在父元素layui-colla-item中的索引。
            var childLiIndex = $(this).index();
            var fatherIndex = $('.father-box').find('.layui-colla-item').index($(this).parent().parent()
                .parent());
            //遍历imgs对象,找到父元素对应的key。
            for (var key in imgs) {
                //根据key获取父元素对应的子元素对象。
                if (key == fatherIndex) {
                    //遍历子元素对象,找到对应的子菜单项的key。
                    var fatheritem = imgs[fatherIndex];
                    //根据key获取子菜单项对应的文件名数组childimgArr。
                    for (var childkey in fatheritem) {
                        if (childkey == childLiIndex) {
                            var childimgArr = fatheritem[childkey];
                            var _html = '';
                            //遍历文件名数组,如果文件名包含'.pdf',则生成一个包含pdf文件的embed元素的div,否则生成一个包含图片的img元素的div。
                            for (var i = 0; i < childimgArr.length; i++) {
                                if (childimgArr[i].indexOf('.pdf') > -1) {
                                    _html += '<div class="d-box embed-d-box"><embed class="pdf-box" src="./files/' + childimgArr[
                                        i] + '"></div>'
                                } else if (childimgArr[i].indexOf('.mp4') > -1) {
                                    _html += '<div class="d-box video-d-box"><video controls><source src="./files/' + childimgArr[
                                        i] + '" type="video/mp4"></video></div>'
                                } else {
                                    _html += '<div class="d-box"><img src="./img/' + childimgArr[i] +
                                        '"></div>'
                                }
                            }
                            //将生成的HTML代码插入到class为img-box的元素中。
                            $('.img-box').html(_html);
                        }
                    }
                }
            }
        })
  • 写回答

28条回答 默认 最新

  • bug菌¹ Java领域优质创作者 2024-09-02 20:15
    关注
    获得0.30元问题酬金

    在这里插入代码片该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳🤝🤝🤝


    要在前端使用 pdf.js 库实现 PDF 的打印、旋转、放大缩小等功能,你可以考虑以下几个步骤:

    1. 集成 PDF.js Viewer
      pdf.js 提供了一个完整的 PDF 浏览器查看器实现,称为 PDF.js Viewer。你可以将这个查看器集成到你的应用中,它包含了打印、旋转、缩放等常用功能。你可以从 pdf.js 的 GitHub 仓库下载完整的查看器代码。

    2. 自定义控制按钮
      如果你想在 pdf.js 的基础上添加自定义的控制按钮,你可以在渲染 PDF 后,使用 JavaScript 添加这些功能。例如,添加打印按钮并绑定打印事件:

      document.getElementById('print-button').addEventListener('click', function() {
          var pdfDocument = pdfjsLib.getDocument(url).promise;
          pdfDocument.then(function(pdfDoc_) {
              pdfDoc_.getPage(1).then(function(page) {
                  var printService = new pdfjsViewer.PrintService(pdfDoc_);
                  printService.print();
              });
          });
      });
      
    3. 旋转 PDF
      你可以在 pdf.js 中设置旋转角度来实现旋转功能:

      var viewport = page.getViewport({scale: scale, rotation: 90}); // 旋转 90 度
      
    4. 缩放 PDF
      缩放功能可以通过调整 scale 参数来实现:

      var scale = 2; // 放大两倍
      var viewport = page.getViewport({scale: scale, rotation: 0});
      
    5. 添加工具栏
      你可以创建一个工具栏,包含不同的按钮来控制 PDF 的显示,例如:

      <div id="toolbar">
          <button id="print-button">打印</button>
          <button id="zoom-in-button">放大</button>
          <button id="zoom-out-button">缩小</button>
          <button id="rotate-button">旋转</button>
      </div>
      
    6. 实现功能逻辑
      对于每个按钮,你需要实现相应的逻辑来控制 PDF 的显示。例如,放大和缩小可以通过增加或减少 scale 值来实现。

    7. 使用现有库
      如果你不想自己实现这些功能,你可以寻找一些现成的库,它们可能已经集成了 pdf.js 并提供了这些功能。

    请注意,pdf.js 是一个库,它提供了渲染 PDF 文件的能力,而 pdf.js Viewer 是一个基于 pdf.js 的完整应用,它提供了一个用户界面和一些交互功能。如果你只需要预览功能,你可以只使用 pdf.js。但如果你想要更多的交互功能,比如打印、旋转、缩放等,你可能需要使用 pdf.js Viewer 或者自己实现这些功能。

    最后,确保你遵守 pdf.js 的许可协议,并正确地引用和集成了所有必要的脚本和样式。

    评论

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 创建了问题 9月2日