trying to rendering pdf(not succeeded yet)

This commit is contained in:
Zhigang Wang 2024-06-03 23:02:22 -07:00
parent 6386694d02
commit 05d03451dc
10 changed files with 125 additions and 7 deletions

View File

@ -26,6 +26,7 @@
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"axios": "^1.4.0", "axios": "^1.4.0",
"bootstrap": "^5.3.1", "bootstrap": "^5.3.1",
"buffer": "^6.0.3",
"pdfjs-dist": "^4.2.67", "pdfjs-dist": "^4.2.67",
"pinia": "^2.1.6", "pinia": "^2.1.6",
"quill": "^1.3.7", "quill": "^1.3.7",

View File

@ -14,6 +14,9 @@ export default {
mnx_navToContact() { mnx_navToContact() {
this.$router.push('/contact') this.$router.push('/contact')
}, },
mnx_navToContentViewer(content_id) {
this.$router.push('/content-viewer/' + content_id)
},
//common //common
mnx_navToFrontDoor() { mnx_navToFrontDoor() {

View File

@ -1,8 +1,14 @@
<template> <template>
<div class="">Blogs</div> <div v-if="blogs" class="blogs_containter">
<div class="blog_containter" v-for="(blog, index) in blogs" :key="index" @click="view_blog(blog)">
<h2>{{ blog.blog_name }}</h2>
<img :src="blog.cover_picture">
<p v-text="retrieve_summary(blog)"> </p>
</div>
</div>
</template> </template>
<script> <script>
import { ContentApi } from '../../utils/index' import { ContentApi, mediaDataHandler } from '../../utils/index'
export default { export default {
name: 'Blogs', name: 'Blogs',
components: {}, components: {},
@ -14,12 +20,34 @@ export default {
retrieve_blogs() { retrieve_blogs() {
ContentApi.retrieve_blogs() ContentApi.retrieve_blogs()
.then((response) => { .then((response) => {
response this.blogs = response.data
}) })
.catch((error) => { .catch((error) => {
this.mnx_backendErrorHandler(error) this.mnx_backendErrorHandler(error)
}) })
},
view_blog(blog) {
this.mnx_navToContentViewer(blog.content_id)
},
retrieve_summary(blog) {
return mediaDataHandler.retrieveText(blog.summary_text);
}
},
data() {
return {
blogs: null
} }
} }
} }
</script> </script>
<style scoped lang="scss">
.blogs_containter {
@extend .container;
}
.blog_containter {
@extend .container;
cursor: pointer;
}
</style>

View File

@ -0,0 +1,48 @@
<template>
<div class="">ContentViewer</div>
</template>
<script>
import { pdfjsLib } from '../../plugins/index'
import { ContentApi, mediaDataHandler } from '../../utils/index'
import { Buffer } from 'buffer';
export default {
name: 'ContentViewer',
props: {
content_id: {
required: true,
type: String
}
},
components: {},
computed: {},
mounted() {
this.retrieve_blog_content()
},
methods: {
retrieve_blog_content() {
ContentApi.retrieve_blog_content(this.content_id)
.then((response) => {
this.content_media_data = response.data
var loadingTask = pdfjsLib.getDocument({ data: Buffer.from(this.content_media_data, 'base64') })
loadingTask.promise.then(function(pdf) {
//
// Fetch the first page
//
pdf.getPage(1).then(function(page) {
//rendering
});
});
})
.catch((error) => {
this.mnx_backendErrorHandler(error)
})
},
},
data() {
return {
content_media_data: null
}
}
}
</script>

View File

@ -1,6 +1,7 @@
import * as pdfjsLib from 'pdfjs-dist' import * as pdfjsLib from 'pdfjs-dist'
//need to set worker before the pdfjs can be used.
//pdfjsLib.GlobalWorkerOptions.workerPort = new Worker() // pdfjsLib.GlobalWorkerOptions.workerPort = new Worker(
//new URL('pdfjs-dist/build/pdf.worker.js', import.meta.url) // new URL('pdfjs-dist/build/pdf.worker.mjs', import.meta.url)
// )
export { pdfjsLib } export { pdfjsLib }

View File

@ -1,10 +1,12 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import { store, userRoleEnum } from '../store/index' import { store, userRoleEnum } from '../store/index'
//public //public
import About from '../../pages/public/About.vue' import About from '../../pages/public/About.vue'
import Blogs from '../../pages/public/Blogs.vue' import Blogs from '../../pages/public/Blogs.vue'
import Career from '../../pages/public/Career.vue' import Career from '../../pages/public/Career.vue'
import Contact from '../../pages/public/Contact.vue' import Contact from '../../pages/public/Contact.vue'
import ContentViewer from '../../pages/public/ContentViewer.vue'
//guest //guest
import FrontDoor from '../../pages/guest/FrontDoor.vue' import FrontDoor from '../../pages/guest/FrontDoor.vue'
@ -107,6 +109,14 @@ const router = createRouter({
components: { default: Contact, footer: FooterGuest, header: HeaderGuest } components: { default: Contact, footer: FooterGuest, header: HeaderGuest }
}, },
{
name: 'content-viewer',
path: '/content-viewer/:content_id',
meta: { requiredRoles: [userRoleEnum.NONE] },
components: { default: ContentViewer, footer: FooterGuest, header: HeaderGuest },
props: true
},
// guest // guest
{ {
name: 'front-door', name: 'front-door',

View File

@ -11,5 +11,17 @@ class ContentApi {
) )
return request return request
} }
static retrieve_blog_content(document_id) {
const request = backendAxios.post(
'/api/content/retrieve-blog-content',
{
document_id: document_id
},
{
}
)
return request
}
} }
export { ContentApi } export { ContentApi }

View File

@ -1,3 +1,4 @@
export { textAreaAujuster } from './textArea' export { textAreaAujuster } from './textArea'
export { tooltip } from './tooltip' export { tooltip } from './tooltip'
export { elementHandler } from './element' export { elementHandler } from './element'
export { mediaDataHandler } from './mediaData'

View File

@ -0,0 +1,14 @@
class MediaDataHandler {
retrieveText(mediaData) {
let prefix = "data:text/plain;base64,"
let pos = mediaData.search(prefix);
if (pos < 0) return "";
return atob(mediaData.substring(pos + prefix.length))
}
}
const mediaDataHandler = new MediaDataHandler()
export { mediaDataHandler }

View File

@ -16,4 +16,4 @@ export { ValueChecker, DateUtils, OIDUtils } from './common/index'
export { userProfileValidator } from './validator/index' export { userProfileValidator } from './validator/index'
export { textAreaAujuster, tooltip, elementHandler } from './html/index' export { textAreaAujuster, tooltip, elementHandler, mediaDataHandler } from './html/index'