admin管理员组

文章数量:1279051

So I've tried to get a PDF viewer working with the likes of pdf.js and vue-pdf.

I can get vue-pdf to work however I can't seem to get local files to render and in the case of pdf.js I tried to download the example project on the website, .js/getting_started/#download, however I only get a cannot get "../.../some.pdf".

testPage.vue with vue-pdf:

<template>
  <div>
    <pdf src="../assets/test.pdf"></pdf>
  </div>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  name: 'test',
  data () {
    return {
    }
  },
  ponents: {
    pdf
  }
}
</script>

<style>
</style>

The error it gives is cannot GET "../assets/test.pdf"

testPage.vue with pdf.js:

<template>
  <div>
    <a href="../assets/viewer.html?=test.pdf"></a>
  </div>
</template>

<script>
export default {
  name: 'test',
  data () {
    return {
    }
  },
  ponents: {
  }
}
</script>

<style>
</style>

The error given is cannot GET "../assets/viewer.html?=test.pdf" clearly the errors are similar so I've probably messed up big time.

Webpack:

'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      {
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre',
        include: [resolve('src'), resolve('test')],
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.css$/,
        loader: ['style-loader']
      },
      {
        test: /\.(pdf|jpg|gif)$/,
        loader: 'file-loader'
      }
    ]
  }
}

Thanks.

So I've tried to get a PDF viewer working with the likes of pdf.js and vue-pdf.

I can get vue-pdf to work however I can't seem to get local files to render and in the case of pdf.js I tried to download the example project on the website, https://mozilla.github.io/pdf.js/getting_started/#download, however I only get a cannot get "../.../some.pdf".

testPage.vue with vue-pdf:

<template>
  <div>
    <pdf src="../assets/test.pdf"></pdf>
  </div>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  name: 'test',
  data () {
    return {
    }
  },
  ponents: {
    pdf
  }
}
</script>

<style>
</style>

The error it gives is cannot GET "../assets/test.pdf"

testPage.vue with pdf.js:

<template>
  <div>
    <a href="../assets/viewer.html?=test.pdf"></a>
  </div>
</template>

<script>
export default {
  name: 'test',
  data () {
    return {
    }
  },
  ponents: {
  }
}
</script>

<style>
</style>

The error given is cannot GET "../assets/viewer.html?=test.pdf" clearly the errors are similar so I've probably messed up big time.

Webpack:

'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      {
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre',
        include: [resolve('src'), resolve('test')],
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.css$/,
        loader: ['style-loader']
      },
      {
        test: /\.(pdf|jpg|gif)$/,
        loader: 'file-loader'
      }
    ]
  }
}

Thanks.

Share Improve this question edited Nov 28, 2020 at 16:18 Jerry Chong 9,2404 gold badges53 silver badges43 bronze badges asked Oct 31, 2017 at 9:37 Erik CastilloErik Castillo 311 gold badge2 silver badges4 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 3

Solution for vue-pdf v4.2.0

Make sure the pdf file is placed under /public folder.

The PDF file path will be: public/file1.pdf

In that case, your pdf src should be without public/ path, as per below:

<pdf src="file1.pdf"></pdf>

Now it should be render and view the PDF file successfully.

Local files may be reached using ~
try to use: <pdf src="~/assets/test.pdf"></pdf> more details

For me worked when I moved the pdf to static folder and code was like

<pdf src="../{relative_path}/static/test.pdf"></pdf>

I also had such a challenge until I used an iframe that really gets the job done with no plugins, check the code.

 <iframe id="fred" style="border:1px solid #666CCC" title="PDF in an i-Frame" :src="pdf_file" frameborder="1" scrolling="auto" width="100%" height="600px" ></iframe>

本文标签: javascriptVuejsHow to view or render local PDF filesStack Overflow