vue-pdf 打印界面字符乱码,替换pdfjsWrapper.js
import { PDFLinkService } from "pdfjs-dist/es5/web/pdf_viewer"; var pendingOperation = Promise.resolve(); export default function (PDFJS) { function isPDFDocumentLoadingTask(obj) { return ( typeof obj === "object" && obj !== null && obj.__PDFDocumentLoadingTask === true ); // or: return obj.constructor.name === 'PDFDocumentLoadingTask'; } function createLoadingTask(src, options) { var source; if (typeof src === "string") source = { url: src }; else if (src instanceof Uint8Array) source = { data: src }; else if (typeof src === "object" && src !== null) source = Object.assign({}, src); else throw new TypeError("invalid src type"); if (options && options.withCredentials) source.withCredentials = options.withCredentials; var loadingTask = PDFJS.getDocument(source); loadingTask.__PDFDocumentLoadingTask = true; // since PDFDocumentLoadingTask is not public if (options && options.onPassword) loadingTask.onPassword = options.onPassword; if (options && options.onProgress) loadingTask.onProgress = options.onProgress; return loadingTask; } function PDFJSWrapper(canvasElt, annotationLayerElt, emitEvent) { var pdfDoc = null; var pdfPage = null; var pdfRender = null; var canceling = false; canvasElt.getContext("2d").save(); function clearCanvas() { canvasElt .getContext("2d") .clearRect(0, 0, canvasElt.width, canvasElt.height); } function clearAnnotations() { while (annotationLayerElt.firstChild) annotationLayerElt.removeChild(annotationLayerElt.firstChild); } this.destroy = function () { if (pdfDoc === null) return; // Aborts all network requests and destroys worker. pendingOperation = pdfDoc.destroy(); pdfDoc = null; }; this.getResolutionScale = function () { return canvasElt.offsetWidth / canvasElt.width; }; this.printPage = function (dpi, pageNumberOnly) { if (pdfPage === null) return; // 1in == 72pt // 1in == 96px var PRINT_RESOLUTION = dpi === undefined ? 150 : dpi; var PRINT_UNITS = PRINT_RESOLUTION / 72.0; var CSS_UNITS = 96.0 / 72.0; //var iframeElt = document.createElement('iframe'); var printContainerElement = document.createElement("div"); printContainerElement.setAttribute("id", "print-container"); // function removeIframe() { // iframeElt.parentNode.removeChild(iframeElt); function removePrintContainer() { printContainerElement.parentNode.removeChild(printContainerElement); } new Promise(function (resolve, reject) { printContainerElement.frameBorder = "0"; printContainerElement.scrolling = "no"; printContainerElement.width = "0px;"; printContainerElement.height = "0px;"; printContainerElement.style.cssText = "position: absolute; top: 0; left: 0"; window.document.body.appendChild(printContainerElement); resolve(window); }) .then(function (win) { win.document.title = ""; return pdfDoc.getPage(1).then(function (page) { var viewport = page.getViewport({ scale: 1 }); //win.document.head.appendChild(win.document.createElement('style')).textContent = printContainerElement.appendChild( win.document.createElement("style") ).textContent = "@supports ((size:A4) and (size:1pt 1pt)) {" + "@page { margin: 1pt; size: " + (viewport.width * PRINT_UNITS) / CSS_UNITS + "pt " + (viewport.height * PRINT_UNITS) / CSS_UNITS + "pt; }" + "}" + "#print-canvas { display: none }" + "@media print {" + "body { margin: 0 }" + "#print-canvas { page-break-before: avoid; page-break-after: always; page-break-inside: avoid; display: block }" + "body > *:not(#print-container) { display: none; }" + "}" + "@media screen {" + "body { margin: 0 }" + "}"; return win; }); }) .then(function (win) { var allPages = []; for ( var pageNumber = 1; pageNumber <= pdfDoc.numPages; ++pageNumber ) { if ( pageNumberOnly !== undefined && pageNumberOnly.indexOf(pageNumber) === -1 ) continue; allPages.push( pdfDoc.getPage(pageNumber).then(function (page) { var viewport = page.getViewport({ scale: 1 }); //var printCanvasElt = win.document.body.appendChild(win.document.createElement('canvas')); var printCanvasElt = printContainerElement.appendChild( win.document.createElement("canvas") ); printCanvasElt.setAttribute("id", "print-canvas"); printCanvasElt.width = viewport.width * PRINT_UNITS; printCanvasElt.height = viewport.height * PRINT_UNITS; return page.render({ canvasContext: printCanvasElt.getContext("2d"), transform: [ // Additional transform, applied just before viewport transform. PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0, ], viewport: viewport, intent: "print", }).promise; }) ); } Promise.all(allPages) .then(function () { win.focus(); // Required for IE if (win.document.queryCommandSupported("print")) { win.document.execCommand("print", false, null); } else { win.print(); } removePrintContainer(); }) .catch(function (err) { removePrintContainer(); emitEvent("error", err); }); }); }; this.renderPage = function (rotate) { if (pdfRender !== null) { if (canceling) return; canceling = true; pdfRender.cancel(); return; } if (pdfPage === null) return; var pageRotate = (pdfPage.rotate === undefined ? 0 : pdfPage.rotate) + (rotate === undefined ? 0 : rotate); var scale = (canvasElt.offsetWidth / pdfPage.getViewport({ scale: 1 }).width) * (window.devicePixelRatio || 1); var viewport = pdfPage.getViewport({ scale: scale, rotation: pageRotate, }); emitEvent("page-size", viewport.width, viewport.height, scale); canvasElt.width = viewport.width; canvasElt.height = viewport.height; pdfRender = pdfPage.render({ canvasContext: canvasElt.getContext("2d"), viewport: viewport, }); annotationLayerElt.style.visibility = "hidden"; clearAnnotations(); var viewer = { scrollPageIntoView: function (params) { emitEvent("link-clicked", params.pageNumber); }, }; var linkService = new PDFLinkService(); linkService.setDocument(pdfDoc); linkService.setViewer(viewer); pendingOperation = pendingOperation.then( function () { var getAnnotationsOperation = pdfPage .getAnnotations({ intent: "display" }) .then(function (annotations) { PDFJS.AnnotationLayer.render({ viewport: viewport.clone({ dontFlip: true }), div: annotationLayerElt, annotations: annotations, page: pdfPage, linkService: linkService, renderInteractiveForms: false, }); }); var pdfRenderOperation = pdfRender.promise .then(function () { annotationLayerElt.style.visibility = ""; canceling = false; pdfRender = null; }) .catch( function (err) { pdfRender = null; if (err instanceof PDFJS.RenderingCancelledException) { canceling = false; this.renderPage(rotate); return; } emitEvent("error", err); }.bind(this) ); return Promise.all([getAnnotationsOperation, pdfRenderOperation]); }.bind(this) ); }; this.forEachPage = function (pageCallback) { var numPages = pdfDoc.numPages; (function next(pageNum) { pdfDoc .getPage(pageNum) .then(pageCallback) .then(function () { if (++pageNum <= numPages) next(pageNum); }); })(1); }; this.loadPage = function (pageNumber, rotate) { pdfPage = null; if (pdfDoc === null) return; pendingOperation = pendingOperation .then(function () { return pdfDoc.getPage(pageNumber); }) .then( function (page) { pdfPage = page; this.renderPage(rotate); emitEvent("page-loaded", page.pageNumber); }.bind(this) ) .catch(function (err) { clearCanvas(); clearAnnotations(); emitEvent("error", err); }); }; this.loadDocument = function (src) { pdfDoc = null; pdfPage = null; emitEvent("num-pages", undefined); if (!src) { canvasElt.removeAttribute("width"); canvasElt.removeAttribute("height"); clearAnnotations(); return; } // wait for pending operation ends pendingOperation = pendingOperation .then(function () { var loadingTask; if (isPDFDocumentLoadingTask(src)) { if (src.destroyed) { emitEvent("error", new Error("loadingTask has been destroyed")); return; } loadingTask = src; } else { loadingTask = createLoadingTask(src, { onPassword: function (updatePassword, reason) { var reasonStr; switch (reason) { case PDFJS.PasswordResponses.NEED_PASSWORD: reasonStr = "NEED_PASSWORD"; break; case PDFJS.PasswordResponses.INCORRECT_PASSWORD: reasonStr = "INCORRECT_PASSWORD"; break; } emitEvent("password", updatePassword, reasonStr); }, onProgress: function (status) { var ratio = status.loaded / status.total; emitEvent("progress", Math.min(ratio, 1)); }, }); } return loadingTask.promise; }) .then(function (pdf) { pdfDoc = pdf; emitEvent("num-pages", pdf.numPages); emitEvent("loaded"); }) .catch(function (err) { clearCanvas(); clearAnnotations(); emitEvent("error", err); }); }; annotationLayerElt.style.transformOrigin = "0 0"; } return { createLoadingTask: createLoadingTask, PDFJSWrapper: PDFJSWrapper, }; }
找到这个文件:node_modules/vue-pdf/src/pdfjsWrapper.js
然后根据github上这个issue,其中红色的是要删掉的,绿色的是要加上去的,照着改就可以解决了。
如何替换和引用,参考:https://zhuanlan.zhihu.com/p/274500851
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)