pdf下载后可以使用PDF.js吗?

时间:2017-11-03 12:30:16

标签: javascript pdf vue.js pdf.js

我想将PDF.js(或Viewer.js)与Flask应用程序一起使用,我已经从服务器下载了该文件。

而不是使用

public_html/your_project_folder/public/

我想查看通过Ajax调用下载到浏览器的pdf。 (这允许更多服务器控制而不是仅向客户端提供允许用户访问的文件)

例如在Flask中

PDFJS.getDocument('helloworld.pdf') 

在客户端:

@mayapp.route('/files/<int:file_id>', methods=['GET'])
def file_access(file_id: int=None):
    // lookup access and file path in database, get file
    return send_file(file_path)

然后我想将this.file提供给PDF.js来查看它。

例如,根据Flask / postgres - display pdf with PDFJS使用base64编码的字符串:

fetchData: function () {
    axios({
      method: 'get',
      url: '/myapp/files/' + this.file_id,
      dataType: ...,
      headers: ...,
      data: {}
    })
    .then((response) => {
        this.file = response.data
      })
}

但我无法弄清楚如何准确呈现文档。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

您可以遍历PDF页面并将每个页面绘制到画布上。

首先创建一个可以插入画布的HTML元素:

<body>
    <div id="pdf-view"></div>
</body>

然后使用PDF.js的.numPages.getPage()工具(如下所示)来创建和绘制画布:

async function renderPDFPage(pdf, pgNum) {
    const pg = await pdf.getPage(pgNum)
    const scale = 2
    const viewport = pg.getViewport(scale)
    const canvas = document.createElement('canvas')
    const canvasContext = canvas.getContext('2d')
    canvas.height = viewport.height
    canvas.width = viewport.width
    document.getElementById('pdf-view').appendChild(canvas)
    await pg.render({canvasContext, viewport})
}

async function renderPDF(pdf) {
    for (let i = 1; i <= pdf.numPages; i++) {
        await renderPDFPage(pdf, i)
    }
}

const pdf = PDFJS.getDocument({data: pdfData})
renderPDF(pdf)