通过上节,我们能把pdf 文件渲染到页面实现预览功能,此时PDF只是一个图像文件,如果满足文本复制功能,我们需要把 pdf 文件的文本内容也要解析出来,渲染到相应的位置。我们就能像复制网页文字那样复制pdf里面的文字

使用依赖包

pdf.js 是能够在canvas 页面上渲染出文本。需要用到的文件。
渲染的原理:在canvas同样的位置添加一个div, 把文本信息渲染到div中

  • text_layer_builder.js
  • text_layer_builder.css
  • import { TextLayerBuilder } from 'pdfjs-dist/web/pdf_viewer';
    import 'pdfjs-dist/web/pdf_viewer.css';
    

    编写一个 renderText 函数

    const renderText = (textContent, canvas, page, viewport) => {
        const textLayerDiv = document.createElement('div');
        textLayerDiv.setAttribute('class', 'textLayer');
        textLayerDiv.style.width = `${canvas.width}px`
        textLayerDiv.style.height = `${canvas.height}px`
        // 将文本图层div添加至每页pdf的div中
        const pageDom = canvas.parentNode
        pageDom.appendChild(textLayerDiv);
        // 创建新的TextLayerBuilder实例
        const textLayer = new TextLayerBuilder({
            textLayerDiv,
            pageIndex: page.pageIndex,
            viewport,
        textLayer.setTextContent(textContent);
        textLayer.render();
    

    参数说明:

    textContent:文本信息
    canvas: 渲染PDF的Canvas
    page: 渲染的页面
    viewport: 渲染PDF时的PDF
    

    除此之外我们需要修改上节渲染PDF的一段代码

    await renderTask.promise.then(() => {
        return page.getTextContent()
    }).then(textContent => {
        renderText(textContent, canvas, page, viewport)
    
    getTextContent():该函数的成功回调会返回PDF页面上的文本片段。
    TextLayerBuilder():该类的实例有两个重要的方法。
    setTextContent():用于设置page.getTextContent()函数返回的文本片段;
    render():用于渲染文本图层。
    

    到此位置PDF的渲染已经全部完成了,但是他的功能只限于浏览,如果想要翻页还需要修改源代码,下节我们编写工具栏实现翻页和缩放

    源码地址:https://github.com/LiuSandy/react-pdf-render

  •