一、vuepdf插件打印字体变小
在使用vuepdf插件对文件进行打印时,有时候会发现打印出来的字体变得很小,这是因为在引入PDF.js库时,该库默认会将canvas的dip值设置为96,而在有些设备上,dip值可能会不同,因此会导致打印字体的大小产生变化。为了解决这个问题,我们需要手动设置canvas的dip值,代码如下:
//设置canvas dpi pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.bootcdn.net/ajax/libs/pdf.js/2.8.335/pdf.worker.min.js' pdfjsLib.GlobalWorkerOptions.workerPort = 80 pdfjsLib.globalOptions.resetDpi = true pdfjsLib.globalOptions.set('dpi', window.devicePixelRatio * 96)
二、vuepdf插件显示空白表格
在渲染带有表格的pdf文件时,有时候会出现表格完全空白的情况,这是因为PDF.js库默认是开启图像渲染的,而表格这种纯文本而已的内容在图像的处理方式下可能会出现偏差,导致不显示。解决方法是关闭图像渲染,改用一种更加准确的方式来渲染pdf,代码如下:
//关闭图像渲染 const loadingTask = pdfjsLib.getDocument({url: pdfUrl, disableImageDecoding: true})
三、vueckplayer插件
vuepdf插件是基于PDF.js库来实现的,PDF.js库还可以应用于其他方面。与视频播放器Vueckplayer结合使用,可以实现在线预览pdf文件并且支持查看原文档,代码如下:
//引用Vueckplayer组件 import Vueckplayer from 'vue-ckplayer' import PdfViewer from './PdfViewer.vue' export default { components: { Vueckplayer, PdfViewer }, data () { return { url: 'http://localhost:8080/pdfjs-2.8.335-dist/web/index.pdf' } }, methods: { //视频播放器选择预览 viewer() { this.$refs.PdfViewer.OpenPdfViewer() } } }
四、vuepdf下载
通过vuepdf插件,我们可以轻松实现pdf文件下载的功能,代码如下:
//下载pdf文件 pdf.getPage(1).then((page) => { const canvas = document.createElement('canvas') canvas.width = page.view[2] canvas.height = page.view[3] const ctx = canvas.getContext('2d') const renderContext = { canvasContext: ctx, viewport: page.view, } const renderTask = page.render(renderContext) renderTask.promise.then(function () { const a = document.createElement('a') a.href = canvas.toDataURL('image/jpeg', 1.0) a.download = 'test.pdf' document.body.appendChild(a) a.click() document.body.removeChild(a) }) })
五、vuepdf添加批注
vuepdf插件还支持在pdf页面上添加批注,帮助用户更好地交流与分享,代码如下:
//添加批注 pdfViewer.currentScaleValue = 'page-width' pdfViewer.currentScaleValue = 'page-fit' pdfViewer.currentScaleValue = '0.5' const webViewerContainer = document.getElementById('viewerContainer') const canvas = document.createElement('canvas') const mainContainer = document.getElementById('mainContainer') canvas.width = webViewerContainer.clientWidth canvas.height = webViewerContainer.clientHeight const ctx = canvas.getContext('2d') ctx.drawImage(webViewerContainer.querySelector('.page:first-child canvas'), 0, 0) const imgData = canvas.toDataURL('image/png') const annotationLayerDiv = document.createElement('div') annotationLayerDiv.className = 'annotationLayer' annotationLayerDiv.style.marginLeft = mainContainer.scrollLeft + 'px' annotationLayerDiv.style.marginTop = mainContainer.scrollTop + 'px' const img = new Image() img.onload = function () { annotationLayerDiv.appendChild(img) mainContainer.appendChild(annotationLayerDiv) } img.src = imgData
六、vuepdf预览
vuepdf插件可以帮助我们完成基本的pdf预览功能,代码如下:
//预览pdf<script> import pdfViewer from './components/PdfViewer.vue' export default { components: { pdfViewer }, data () { return { url: '' } }, methods: { //选择预览的pdf文件 onFileChange(event) { this.url = URL.createObjectURL(event.target.files[0]) } } } </script>
七、vuepdf跨域
在异步请求获取pdf文件时,有可能会出现跨域问题,导致请求失败。通过配置PDF.js的options,我们可以轻松解决跨域问题,代码如下:
//跨域请求pdf文件 pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.bootcdn.net/ajax/libs/pdf.js/2.8.335/pdf.worker.min.js' pdfjsLib.enableRangeRequest = true pdfjsLib.GlobalWorkerOptions.workerPort = 80 pdfjsLib.getDocument({ 'url': 'http://localhost/test.pdf', 'rangeChunkSize': 65535, 'withCredentials': false, 'httpHeaders': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', }, }).promise.then(function (pdf) { // 加载完成处理pdf })
八、vuepdf显示不全
有时候,在应用vuepdf插件时,我们可能会发现pdf文件无法完整显示,这有可能是因为我们需要手动设置pdf页面大小,代码如下:
//手动设置pdf页面大小 pdf.getPage(1).then((page) => { const scale = 1.5 const viewport = page.getViewport({ scale: scale }) const canvas = document.createElement('canvas') const context = canvas.getContext('2d') canvas.height = viewport.height canvas.width = viewport.width const renderContext = { canvasContext: context, viewport: viewport } const renderTask = page.render(renderContext) renderTask.promise.then(() => { canvas.toBlob(function (blob) { const url = URL.createObjectURL(blob) const a = document.createElement('a') a.setAttribute('href', url) a.setAttribute('download', 'test.pdf') a.setAttribute('target', '_blank') a.click() URL.revokeObjectURL(url) }) }) })