我想将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
})
}
但我无法弄清楚如何准确呈现文档。有任何想法吗?
答案 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)