Vue3實現(xiàn)pdf預覽功能
更新時間:2025年03月26日 09:38:00 作者:一城煙雨_
在開發(fā)中,PDF預覽和交互功能是一個常見的需求,無論是管理系統(tǒng)、在線教育平臺,還是企業(yè)內部的知識庫,能夠高效地展示和操作PDF文件都能極大地提升用戶體驗,本文將詳細介紹如何在Vue項目中實現(xiàn)pdf預覽功能,需要的朋友可以參考下
1.使用到的插件 vue3-pdf-app 以及預覽效果
2.下載依賴
// 可以使用npm 以及pnpm // 下載版本1.0.3 pnpm install vue3-pdf-app@^1.0.3
3.封裝pdfModel組件復用
<template> <VuePdfApp :page-scale="pageScale" :theme="theme" :style="`width: ${viewerWidth}; height: ${viewerHeight};`" :pdf="src" :fileName="fileName" @pages-rendered="pagesRendered" v-bind="$attrs" :config="config"></VuePdfApp> </template> <script setup lang="ts"> import { computed, ref } from 'vue' import VuePdfApp from 'vue3-pdf-app' import 'vue3-pdf-app/dist/icons/main.css' // 工具欄配置項 const config = ref({ // 右側其他區(qū)工具 sidebar: { viewThumbnail: true,//啟用縮略圖視圖 viewOutline: true,//啟用大綱視圖 viewAttachments: false,//啟用附件視圖 }, secondaryToolbar: { secondaryPresentationMode: true,//啟用演示模式 secondaryOpenFile: true, //啟用打開文件功能 secondaryPrint: true,//啟用打印功能 secondaryDownload: true,//啟用下載功能 secondaryViewBookmark: true,//啟用書簽視圖 firstPage: false,//啟用跳轉到第一頁 lastPage: false,//啟用跳轉到最后一頁 pageRotateCw: true,//啟用順時針旋轉頁面 pageRotateCcw: true,//啟用逆時針旋轉頁面 cursorSelectTool: false,//啟用選擇工具 cursorHandTool: false,//啟用手形工具 scrollVertical: false,//啟用垂直滾動 scrollHorizontal: false,//啟用水平滾動 scrollWrapped: false,//啟用包裹滾動 spreadNone: false,//啟用無跨頁模式 spreadOdd: false,// 啟用奇數(shù)頁跨頁模式 spreadEven: false,//啟用偶數(shù)頁跨頁模式 documentProperties: false,//啟用文檔屬性查看 }, // 配置左側工具欄 toolbar: { toolbarViewerLeft: { findbar: false,//啟用查找條 previous: true,// 啟用上一頁按鈕 next: true,//啟用下一頁按鈕 pageNumber: true,// 啟用頁碼顯示 }, // 配置右側工具欄 toolbarViewerRight: { presentationMode: false,//啟用演示模式 openFile: false,//啟用打開文件功能 print: false,//啟用打印功能 download: false,// 啟用下載功能 viewBookmark: false,// 啟用書簽視圖 }, // 配置中間工具欄 toolbarViewerMiddle: { zoomOut: true,// 啟用縮小功能 zoomIn: true,//啟用放大功能。 scaleSelectContainer: false,//啟用縮放選擇容器功能 }, }, //啟用錯誤包裝,這可能用于顯示錯誤信息或處理錯誤情況。 errorWrapper: true, }) interface Props { src: string | ArrayBuffer // pdf地址 width?: string | number // 預覽容器寬度 height?: string | number // 預覽容器高度 pageScale?: number | string // 頁面默認縮放規(guī)則,可選 'page-actual'|'page-width'|'page-height'|'page-fit'|'auto' theme?: string // 預覽主題 可選 dark | light fileName?: string // 覆蓋pdf文件名 } const props = withDefaults(defineProps<Props>(), { src: '', width: '100%', height: '100%', pageScale: 'page-fit', // 默認自適應展示一頁 theme: 'dark', fileName: '' }) const viewerWidth = computed(() => { if (typeof props.width === 'number') { return props.width + 'px' } else { return props.width } }) const viewerHeight = computed(() => { if (typeof props.height === 'number') { return props.height + 'px' } else { return props.height } }) const emit = defineEmits(['loaded']) function pagesRendered(pdfApp: any) { // console.log('pdfApp頁碼渲染完成:', pdfApp) emit('loaded', pdfApp) } </script> <style lang="less" scoped> @themeColor: #1677FF; :deep(*) { box-sizing: content-box; } // 定制化主題色 .pdf-app.dark { --pdf-app-background-color: rgb(83, 86, 89, 0); --pdf-sidebar-content-color: rgb(51, 54, 57); --pdf-toolbar-sidebar-color: #24364e; --pdf-toolbar-color: rgb(50, 54, 57); --pdf-loading-bar-color: #606c88; --pdf-loading-bar-secondary-color: @themeColor; --pdf-find-results-count-color: #d9d9d9; --pdf-find-results-count-font-color: #525252; --pdf-find-message-font-color: #a6b7d0; --pdf-not-found-color: #f66; --pdf-split-toolbar-button-separator-color: #fff; --pdf-toolbar-font-color: #d9d9d9; --pdf-button-hover-font-color: @themeColor; --pdf-button-toggled-color: #606c88; --pdf-horizontal-toolbar-separator-color: #fff; --pdf-input-color: #606c88; --pdf-input-font-color: #d9d9d9; --pdf-find-input-placeholder-font-color: @themeColor; --pdf-thumbnail-selection-ring-color: hsla(0, 0%, 100%, .15); --pdf-thumbnail-selection-ring-selected-color: rgb(147, 179, 242); --pdf-error-wrapper-color: #f55; --pdf-error-more-info-color: #d9d9d9; --pdf-error-more-info-font-color: #000; --pdf-overlay-container-color: rgba(0, 0, 0, .2); --pdf-overlay-container-dialog-color: #24364e; --pdf-overlay-container-dialog-font-color: #d9d9d9; --pdf-overlay-container-dialog-separator-color: #fff; --pdf-dialog-button-font-color: #d9d9d9; --pdf-dialog-button-color: #606c88; :deep(.thumbnail.selected>.thumbnailSelectionRing) { background-color: rgb(147, 179, 242); } } .pdf-app.light { --pdf-app-background-color: rgb(245, 245, 245); --pdf-sidebar-content-color: rgb(245, 245, 245); --pdf-toolbar-sidebar-color: rgb(190, 190, 190); --pdf-toolbar-color: rgb(225, 225, 225); --pdf-loading-bar-color: #3f4b5b; --pdf-loading-bar-secondary-color: #666; --pdf-find-results-count-color: #3f4b5b; --pdf-find-results-count-font-color: hsla(0, 0%, 100%, .87); --pdf-find-message-font-color: hsla(0, 0%, 100%, .87); --pdf-not-found-color: brown; --pdf-split-toolbar-button-separator-color: #000; --pdf-toolbar-font-color: rgb(142, 142, 142); --pdf-button-hover-font-color: #666; --pdf-button-toggled-color: #3f4b5b; --pdf-horizontal-toolbar-separator-color: #000; --pdf-input-color: #3f4b5b; --pdf-input-font-color: #d9d9d9; --pdf-find-input-placeholder-font-color: #666; --pdf-thumbnail-selection-ring-color: hsla(208, 7%, 46%, .7); --pdf-thumbnail-selection-ring-selected-color: #3f4b5b; --pdf-error-wrapper-color: #f55; --pdf-error-more-info-color: #d9d9d9; --pdf-error-more-info-font-color: #000; --pdf-overlay-container-color: hsla(208, 7%, 46%, .7); --pdf-overlay-container-dialog-color: #6c757d; --pdf-overlay-container-dialog-font-color: #d9d9d9; --pdf-overlay-container-dialog-separator-color: #000; --pdf-dialog-button-font-color: #d9d9d9; --pdf-dialog-button-color: #3f4b5b; :deep(.thumbnail.selected>.thumbnailSelectionRing) { background-color: rgb(105, 105, 105); } } </style>
4.頁面使用(可以直接使用在線pdf鏈接 也可以上傳pdf預覽)
<template> <div style="margin: 20px;"> <input type="file" @change="handleChange" /> </div> <div class="pdfBox" v-if="pdfUrl !== ''"> <PdfPreview page-scale="page-fit" :width="900" :height="600" theme="light" :src="pdfUrl" @loaded="onLoaded" /> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import PdfPreview from './pdfModel.vue'; // const pdfUrl = ref<any>('http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf'); const pdfUrl = ref<any>(''); // 判斷文件加載完成 const onLoaded = (pdfApp: any) => { console.log('文件加載完成'); }; // 也可直接上傳文件顯示 let handleChange = (e: any) => { let files = e.target.files[0]; let reader = new FileReader(); reader.readAsArrayBuffer(files); reader.onload = function () { // docxSrc.value = reader.result; pdfUrl.value = reader.result; }; }; </script> <style scoped lang="less"> .pdfBox { width: 900px; height: 600px; overflow: scroll; overflow-x: hidden; overflow-y: hidden; } </style>
5.設置中文
能看到在使用的時候操作欄全部都是英文
6.創(chuàng)建 viewer.properties文件與src同級
文件代碼
# vue3-pdf-app插件轉中文配置代碼 # Copyright 2012 Mozilla Foundation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Main toolbar buttons (tooltips and alt text for images) previous.title=上一頁 previous_label=上一頁 next.title=下一頁 next_label=下一頁 # LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. page.title=頁面 # LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number # representing the total number of pages in the document. of_pages=/ {{pagesCount}} # LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" # will be replaced by a number representing the currently visible page, # respectively a number representing the total number of pages in the document. page_of_pages=({{pageNumber}} / {{pagesCount}}) zoom_out.title=縮小 zoom_out_label=縮小 zoom_in.title=放大 zoom_in_label=放大 zoom.title=縮放 presentation_mode.title=切換到演示模式 presentation_mode_label=演示模式 open_file.title=打開文件 open_file_label=打開 print.title=打印 print_label=打印 download.title=下載 download_label=下載 bookmark.title=當前在看的內容(復制或在新窗口中打開) bookmark_label=當前在看 save.title=保存 save_label=保存 bookmark1.title=當前頁面(在當前頁面查看 URL) bookmark1_label=當前頁面 # Secondary toolbar and context menu tools.title=工具 tools_label=工具 first_page.title=轉到第一頁 first_page_label=轉到第一頁 last_page.title=轉到最后一頁 last_page_label=轉到最后一頁 page_rotate_cw.title=順時針旋轉 page_rotate_cw_label=順時針旋轉 page_rotate_ccw.title=逆時針旋轉 page_rotate_ccw_label=逆時針旋轉 cursor_text_select_tool.title=啟用文本選擇工具 cursor_text_select_tool_label=文本選擇工具 cursor_hand_tool.title=啟用手形工具 cursor_hand_tool_label=手形工具 scroll_page.title=使用頁面滾動 scroll_page_label=頁面滾動 scroll_vertical.title=使用垂直滾動 scroll_vertical_label=垂直滾動 scroll_horizontal.title=使用水平滾動 scroll_horizontal_label=水平滾動 scroll_wrapped.title=使用平鋪滾動 scroll_wrapped_label=平鋪滾動 spread_none.title=不加入銜接頁 spread_none_label=單頁視圖 spread_odd.title=加入銜接頁使奇數(shù)頁作為起始頁 spread_odd_label=雙頁視圖 spread_even.title=加入銜接頁使偶數(shù)頁作為起始頁 spread_even_label=書籍視圖 # Document properties dialog box document_properties.title=文檔屬性… document_properties_label=文檔屬性… document_properties_file_name=文件名: document_properties_file_size=文件大小: # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" # will be replaced by the PDF file size in kilobytes, respectively in bytes. document_properties_kb={{size_kb}} KB ({{size_b}} 字節(jié)) # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" # will be replaced by the PDF file size in megabytes, respectively in bytes. document_properties_mb={{size_mb}} MB ({{size_b}} 字節(jié)) document_properties_title=標題: document_properties_author=作者: document_properties_subject=主題: document_properties_keywords=關鍵詞: document_properties_creation_date=創(chuàng)建日期: document_properties_modification_date=修改日期: # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" # will be replaced by the creation/modification date, and time, of the PDF file. document_properties_date_string={{date}}, {{time}} document_properties_creator=創(chuàng)建者: document_properties_producer=PDF 生成器: document_properties_version=PDF 版本: document_properties_page_count=頁數(shù): document_properties_page_size=頁面大?。? document_properties_page_size_unit_inches=英寸 document_properties_page_size_unit_millimeters=毫米 document_properties_page_size_orientation_portrait=縱向 document_properties_page_size_orientation_landscape=橫向 document_properties_page_size_name_a3=A3 document_properties_page_size_name_a4=A4 document_properties_page_size_name_letter=文本 document_properties_page_size_name_legal=法律 # LOCALIZATION NOTE (document_properties_page_size_dimension_string): # "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by # the size, respectively their unit of measurement and orientation, of the (current) page. document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}({{orientation}}) # LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): # "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by # the size, respectively their unit of measurement, name, and orientation, of the (current) page. document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}({{name}},{{orientation}}) # LOCALIZATION NOTE (document_properties_linearized): The linearization status of # the document; usually called "Fast Web View" in English locales of Adobe software. document_properties_linearized=快速 Web 視圖: document_properties_linearized_yes=是 document_properties_linearized_no=否 document_properties_close=關閉 print_progress_message=正在準備打印文檔… # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by # a numerical per cent value. print_progress_percent={{progress}}% print_progress_close=取消 # Tooltips and alt text for side panel toolbar buttons # (the _label strings are alt text for the buttons, the .title strings are # tooltips) toggle_sidebar.title=切換側欄 toggle_sidebar_notification2.title=切換側欄(文檔所含的大綱/附件/圖層) toggle_sidebar_label=切換側欄 document_outline.title=顯示文檔大綱(雙擊展開/折疊所有項) document_outline_label=文檔大綱 attachments.title=顯示附件 attachments_label=附件 layers.title=顯示圖層(雙擊即可將所有圖層重置為默認狀態(tài)) layers_label=圖層 thumbs.title=顯示縮略圖 thumbs_label=縮略圖 current_outline_item.title=查找當前大綱項目 current_outline_item_label=當前大綱項目 findbar.title=在文檔中查找 findbar_label=查找 additional_layers=其他圖層 # LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. page_landmark=第 {{page}} 頁 # Thumbnails panel item (tooltip and alt text for images) # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page # number. thumb_page_title=第 {{page}} 頁 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page # number. thumb_page_canvas=頁面 {{page}} 的縮略圖 # Find panel button title and messages find_input.title=查找 find_input.placeholder=在文檔中查找… find_previous.title=查找詞語上一次出現(xiàn)的位置 find_previous_label=上一頁 find_next.title=查找詞語后一次出現(xiàn)的位置 find_next_label=下一頁 find_highlight=全部高亮顯示 find_match_case_label=區(qū)分大小寫 find_match_diacritics_label=匹配變音符號 find_entire_word_label=全詞匹配 find_reached_top=到達文檔開頭,從末尾繼續(xù) find_reached_bottom=到達文檔末尾,從開頭繼續(xù) # LOCALIZATION NOTE (find_match_count): The supported plural forms are # [one|two|few|many|other], with [other] as the default value. # "{{current}}" and "{{total}}" will be replaced by a number representing the # index of the currently active find result, respectively a number representing # the total number of matches in the document. find_match_count={[ plural(total) ]} find_match_count[one]=第 {{current}} 項,共匹配 {{total}} 項 find_match_count[two]=第 {{current}} 項,共匹配 {{total}} 項 find_match_count[few]=第 {{current}} 項,共匹配 {{total}} 項 find_match_count[many]=第 {{current}} 項,共匹配 {{total}} 項 find_match_count[other]=第 {{current}} 項,共匹配 {{total}} 項 # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are # [zero|one|two|few|many|other], with [other] as the default value. # "{{limit}}" will be replaced by a numerical value. find_match_count_limit={[ plural(limit) ]} find_match_count_limit[zero]=超過 {{limit}} 項匹配 find_match_count_limit[one]=超過 {{limit}} 項匹配 find_match_count_limit[two]=超過 {{limit}} 項匹配 find_match_count_limit[few]=超過 {{limit}} 項匹配 find_match_count_limit[many]=超過 {{limit}} 項匹配 find_match_count_limit[other]=超過 {{limit}} 項匹配 find_not_found=找不到指定詞語 # Error panel labels error_more_info=更多信息 error_less_info=更少信息 error_close=關閉 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be # replaced by the PDF.JS version and build ID. error_version_info=PDF.js v{{version}} (build: {{build}}) # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an # english string describing the error. error_message=信息:{{message}} # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack # trace. error_stack=堆棧:{{stack}} # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename error_file=文件:{{file}} # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number error_line=行號:{{line}} # Predefined zoom values page_scale_width=適合頁寬 page_scale_fit=適合頁面 page_scale_auto=自動縮放 page_scale_actual=實際大小 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a # numerical scale value. page_scale_percent={{scale}}% # Loading indicator messages loading=正在加載… # Loading indicator messages loading_error=加載 PDF 時發(fā)生錯誤。 invalid_file_error=無效或損壞的 PDF 文件。 missing_file_error=缺少 PDF 文件。 unexpected_response_error=意外的服務器響應。 rendering_error=渲染頁面時發(fā)生錯誤。 # LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be # replaced by the modification date, and time, of the annotation. annotation_date_string={{date}},{{time}} # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. # "{{type}}" will be replaced with an annotation type from a list defined in # the PDF spec (32000-1:2008 Table 169 – Annotation types). # Some common types are e.g.: "Check", "Text", "Comment", "Note" text_annotation_type.alt=[{{type}} 注釋] password_label=輸入密碼以打開此 PDF 文件。 password_invalid=密碼無效。請重試。 password_ok=確定 password_cancel=取消 printing_not_supported=警告:此瀏覽器尚未完整支持打印功能。 printing_not_ready=警告:此 PDF 未完成加載,無法打印。 web_fonts_disabled=Web 字體已被禁用:無法使用嵌入的 PDF 字體。 # Editor editor_free_text2.title=文本 editor_free_text2_label=文本 editor_ink2.title=繪圖 editor_ink2_label=繪圖 free_text2_default_content=開始輸入… # Editor Parameters editor_free_text_color=顏色 editor_free_text_size=字號 editor_ink_color=顏色 editor_ink_thickness=粗細 editor_ink_opacity=不透明度 # Editor aria editor_free_text2_aria_label=文本編輯器 editor_ink2_aria_label=繪圖編輯器 editor_ink_canvas_aria_label=用戶創(chuàng)建圖像
7.在index.html引入當前文件
// index.html在src文件同級 <link rel="resource" type="application/l10n" href="./viewer.properties" rel="external nofollow" >
最終效果
到此這篇關于Vue3實現(xiàn)pdf預覽功能的文章就介紹到這了,更多相關Vue3 pdf預覽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue中watch監(jiān)聽器的觸發(fā)時機(watch的坑及解決)
這篇文章主要介紹了vue中watch監(jiān)聽器的觸發(fā)時機(watch的坑及解決),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04vue3?騰訊地圖設置簽到范圍并獲取經緯度的實現(xiàn)代碼
本文給大家介紹vue3?騰訊地圖設置簽到范圍并獲取經緯度的實現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2022-05-05Vue數(shù)據與事件綁定以及Class和Style的綁定詳細講解
這篇文章主要介紹了Vue數(shù)據與事件綁定以及Class和Style的綁定,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01