• vue-pdf打印出现方字块乱码问题


    目录

     问题:

    第一种:

    第二种方法:

    好吧,改的真麻烦直接给改完后的代码:

    最终效果:

     总结:


     问题:

    今天分享vue-pdf预览显示没有问题,但是打印时出现乱码问题。话不多说先上乱码图。今天主要是分享给大家两种方法。亲测有效!!!!!!!!

    第一:在你使用vue-pdf的组件中使用

     iframe里面的' :src '是其本身的属性,"src"这个src是一个字符串,也是我PDF文件 的地址,我这里是写了一个固定地址是放在我们component文件中的。直接在data里面的return中声明一个src变量并对它赋值就可以了
    然后在你绑定的打印按钮的方法中直接使用

    document.getElementById('printIframe').contentWindow.print();

    替代原来的方法 //this.$refs.mypdf.print()就可以了

     代码如下:

    第二种方法:

    第二种方法是改变原码的方式,在node_modules下的vue-pdf下的src下的pdfjsWrapper.js中。

    乱码问题是因为我们安装vue-pdf的版本问题,它的这个源码因为版本更新已经改变了,下面这个地址详细的介绍了源码的改变。红色区域的'-'号表明是已经删除了的,绿色区域的加号是新加的。

    使用方法就是你把红色区域的注释掉,并加上绿色区域的!!!!

    github网址:https://github.com/FranckFreiburger/vue-pdf/pull/130/commits/253f6186ff0676abf9277786087dda8d95dd8ea7

     部分内容:

     需要注意的是里面的行数会有一些区别,可以Ctrl+H搜索关键字定位

    下卖以我的代码行数为例:

     首先找到上图中显示的78行位置,我是在91行:注释掉它,并且在下方加入绿色的两行!~~~~~好了就是按照这样改就好啦。

    好吧,改的真麻烦直接给改完后的代码:

    1. import { PDFLinkService } from 'pdfjs-dist/es5/web/pdf_viewer';
    2. var pendingOperation = Promise.resolve();
    3. export default function(PDFJS) {
    4. function isPDFDocumentLoadingTask(obj) {
    5. return typeof(obj) === 'object' && obj !== null && obj.__PDFDocumentLoadingTask === true;
    6. // or: return obj.constructor.name === 'PDFDocumentLoadingTask';
    7. }
    8. function createLoadingTask(src, options) {
    9. var source;
    10. if ( typeof(src) === 'string' )
    11. source = { url: src };
    12. else if ( src instanceof Uint8Array )
    13. source = { data: src };
    14. else if ( typeof(src) === 'object' && src !== null )
    15. source = Object.assign({}, src);
    16. else
    17. throw new TypeError('invalid src type');
    18. // source.verbosity = PDFJS.VerbosityLevel.INFOS;
    19. // source.pdfBug = true;
    20. // source.stopAtErrors = true;
    21. if ( options && options.withCredentials )
    22. source.withCredentials = options.withCredentials;
    23. var loadingTask = PDFJS.getDocument(source);
    24. loadingTask.__PDFDocumentLoadingTask = true; // since PDFDocumentLoadingTask is not public
    25. if ( options && options.onPassword )
    26. loadingTask.onPassword = options.onPassword;
    27. if ( options && options.onProgress )
    28. loadingTask.onProgress = options.onProgress;
    29. return loadingTask;
    30. }
    31. function PDFJSWrapper(canvasElt, annotationLayerElt, emitEvent) {
    32. var pdfDoc = null;
    33. var pdfPage = null;
    34. var pdfRender = null;
    35. var canceling = false;
    36. canvasElt.getContext('2d').save();
    37. function clearCanvas() {
    38. canvasElt.getContext('2d').clearRect(0, 0, canvasElt.width, canvasElt.height);
    39. }
    40. function clearAnnotations() {
    41. while ( annotationLayerElt.firstChild )
    42. annotationLayerElt.removeChild(annotationLayerElt.firstChild);
    43. }
    44. this.destroy = function() {
    45. if ( pdfDoc === null )
    46. return;
    47. // Aborts all network requests and destroys worker.
    48. pendingOperation = pdfDoc.destroy();
    49. pdfDoc = null;
    50. }
    51. this.getResolutionScale = function() {
    52. return canvasElt.offsetWidth / canvasElt.width;
    53. }
    54. this.printPage = function(dpi, pageNumberOnly) {
    55. if ( pdfPage === null )
    56. return;
    57. // 1in == 72pt
    58. // 1in == 96px
    59. var PRINT_RESOLUTION = dpi === undefined ? 150 : dpi;
    60. var PRINT_UNITS = PRINT_RESOLUTION / 72.0;
    61. var CSS_UNITS = 96.0 / 72.0;
    62. var printContainerElement = document.createElement('div');
    63. printContainerElement.setAttribute('id', 'print-container')
    64. function removePrintContainer() {
    65. printContainerElement.parentNode.removeChild(printContainerElement);
    66. }
    67. new Promise(function(resolve, reject) {
    68. printContainerElement.frameBorder = '0';
    69. printContainerElement.scrolling = 'no';
    70. printContainerElement.width = '0px;'
    71. printContainerElement.height = '0px;'
    72. printContainerElement.style.cssText = 'position: absolute; top: 0; left: 0';
    73. window.document.body.appendChild(printContainerElement);
    74. resolve(window)
    75. })
    76. .then(function(win) {
    77. win.document.title = '';
    78. return pdfDoc.getPage(1)
    79. .then(function(page) {
    80. var viewport = page.getViewport({ scale: 1 });
    81. printContainerElement.appendChild(win.document.createElement('style')).textContent =
    82. '@supports ((size:A4) and (size:1pt 1pt)) {' +
    83. '@page { margin: 1pt; size: ' + ((viewport.width * PRINT_UNITS) / CSS_UNITS) + 'pt ' + ((viewport.height * PRINT_UNITS) / CSS_UNITS) + 'pt; }' +
    84. '}' +
    85. '@media print {' +
    86. 'body { margin: 0 }' +
    87. '#print-canvas { page-break-before: avoid; page-break-after: always; page-break-inside: avoid; display: block }' +
    88. 'body > *:not(#print-container) { display: none; }' +
    89. '}'+
    90. '@media screen {' +
    91. 'body { margin: 0 }' +
    92. '}'
    93. return win;
    94. })
    95. })
    96. .then(function(win) {
    97. var allPages = [];
    98. for ( var pageNumber = 1; pageNumber <= pdfDoc.numPages; ++pageNumber ) {
    99. if ( pageNumberOnly !== undefined && pageNumberOnly.indexOf(pageNumber) === -1 )
    100. continue;
    101. allPages.push(
    102. pdfDoc.getPage(pageNumber)
    103. .then(function(page) {
    104. var viewport = page.getViewport({ scale: 1 });
    105. var printCanvasElt = printContainerElement.appendChild(win.document.createElement('canvas'));
    106. printCanvasElt.setAttribute('id', 'print-canvas')
    107. printCanvasElt.width = (viewport.width * PRINT_UNITS);
    108. printCanvasElt.height = (viewport.height * PRINT_UNITS);
    109. return page.render({
    110. canvasContext: printCanvasElt.getContext('2d'),
    111. transform: [ // Additional transform, applied just before viewport transform.
    112. PRINT_UNITS, 0, 0,
    113. PRINT_UNITS, 0, 0
    114. ],
    115. viewport: viewport,
    116. intent: 'print'
    117. }).promise;
    118. })
    119. );
    120. }
    121. Promise.all(allPages)
    122. .then(function() {
    123. win.focus(); // Required for IE
    124. if (win.document.queryCommandSupported('print')) {
    125. win.document.execCommand('print', false, null);
    126. } else {
    127. win.print();
    128. }
    129. removePrintContainer();
    130. })
    131. .catch(function(err) {
    132. removePrintContainer();
    133. emitEvent('error', err);
    134. })
    135. })
    136. }
    137. this.renderPage = function(rotate) {
    138. if ( pdfRender !== null ) {
    139. if ( canceling )
    140. return;
    141. canceling = true;
    142. pdfRender.cancel().catch(function(err) {
    143. emitEvent('error', err);
    144. });
    145. return;
    146. }
    147. if ( pdfPage === null )
    148. return;
    149. var pageRotate = (pdfPage.rotate === undefined ? 0 : pdfPage.rotate) + (rotate === undefined ? 0 : rotate);
    150. var scale = canvasElt.offsetWidth / pdfPage.getViewport({ scale: 1 }).width * (window.devicePixelRatio || 1);
    151. var viewport = pdfPage.getViewport({ scale: scale, rotation:pageRotate });
    152. emitEvent('page-size', viewport.width, viewport.height, scale);
    153. canvasElt.width = viewport.width;
    154. canvasElt.height = viewport.height;
    155. pdfRender = pdfPage.render({
    156. canvasContext: canvasElt.getContext('2d'),
    157. viewport: viewport
    158. });
    159. annotationLayerElt.style.visibility = 'hidden';
    160. clearAnnotations();
    161. var viewer = {
    162. scrollPageIntoView: function(params) {
    163. emitEvent('link-clicked', params.pageNumber)
    164. },
    165. };
    166. var linkService = new PDFLinkService();
    167. linkService.setDocument(pdfDoc);
    168. linkService.setViewer(viewer);
    169. pendingOperation = pendingOperation.then(function() {
    170. var getAnnotationsOperation =
    171. pdfPage.getAnnotations({ intent: 'display' })
    172. .then(function(annotations) {
    173. PDFJS.AnnotationLayer.render({
    174. viewport: viewport.clone({ dontFlip: true }),
    175. div: annotationLayerElt,
    176. annotations: annotations,
    177. page: pdfPage,
    178. linkService: linkService,
    179. renderInteractiveForms: false
    180. });
    181. });
    182. var pdfRenderOperation =
    183. pdfRender.promise
    184. .then(function() {
    185. annotationLayerElt.style.visibility = '';
    186. canceling = false;
    187. pdfRender = null;
    188. })
    189. .catch(function(err) {
    190. pdfRender = null;
    191. if ( err instanceof PDFJS.RenderingCancelledException ) {
    192. canceling = false;
    193. this.renderPage(rotate);
    194. return;
    195. }
    196. emitEvent('error', err);
    197. }.bind(this))
    198. return Promise.all([getAnnotationsOperation, pdfRenderOperation]);
    199. }.bind(this));
    200. }
    201. this.forEachPage = function(pageCallback) {
    202. var numPages = pdfDoc.numPages;
    203. (function next(pageNum) {
    204. pdfDoc.getPage(pageNum)
    205. .then(pageCallback)
    206. .then(function() {
    207. if ( ++pageNum <= numPages )
    208. next(pageNum);
    209. })
    210. })(1);
    211. }
    212. this.loadPage = function(pageNumber, rotate) {
    213. pdfPage = null;
    214. if ( pdfDoc === null )
    215. return;
    216. pendingOperation = pendingOperation.then(function() {
    217. return pdfDoc.getPage(pageNumber);
    218. })
    219. .then(function(page) {
    220. pdfPage = page;
    221. this.renderPage(rotate);
    222. emitEvent('page-loaded', page.pageNumber);
    223. }.bind(this))
    224. .catch(function(err) {
    225. clearCanvas();
    226. clearAnnotations();
    227. emitEvent('error', err);
    228. });
    229. }
    230. this.loadDocument = function(src) {
    231. pdfDoc = null;
    232. pdfPage = null;
    233. emitEvent('num-pages', undefined);
    234. if ( !src ) {
    235. canvasElt.removeAttribute('width');
    236. canvasElt.removeAttribute('height');
    237. clearAnnotations();
    238. return;
    239. }
    240. // wait for pending operation ends
    241. pendingOperation = pendingOperation.then(function() {
    242. var loadingTask;
    243. if ( isPDFDocumentLoadingTask(src) ) {
    244. if ( src.destroyed ) {
    245. emitEvent('error', new Error('loadingTask has been destroyed'));
    246. return
    247. }
    248. loadingTask = src;
    249. } else {
    250. loadingTask = createLoadingTask(src, {
    251. onPassword: function(updatePassword, reason) {
    252. var reasonStr;
    253. switch (reason) {
    254. case PDFJS.PasswordResponses.NEED_PASSWORD:
    255. reasonStr = 'NEED_PASSWORD';
    256. break;
    257. case PDFJS.PasswordResponses.INCORRECT_PASSWORD:
    258. reasonStr = 'INCORRECT_PASSWORD';
    259. break;
    260. }
    261. emitEvent('password', updatePassword, reasonStr);
    262. },
    263. onProgress: function(status) {
    264. var ratio = status.loaded / status.total;
    265. emitEvent('progress', Math.min(ratio, 1));
    266. }
    267. });
    268. }
    269. return loadingTask.promise;
    270. })
    271. .then(function(pdf) {
    272. pdfDoc = pdf;
    273. emitEvent('num-pages', pdf.numPages);
    274. emitEvent('loaded');
    275. })
    276. .catch(function(err) {
    277. clearCanvas();
    278. clearAnnotations();
    279. emitEvent('error', err);
    280. })
    281. }
    282. annotationLayerElt.style.transformOrigin = '0 0';
    283. }
    284. return {
    285. createLoadingTask: createLoadingTask,
    286. PDFJSWrapper: PDFJSWrapper,
    287. }
    288. }

    最终效果:

     

     总结:

    第一种看起来真的很简单快捷,但是第二种可以了解为什么会出现乱码问题,看看哪种方法适合你吧,如果有用欢迎点赞评论收藏一波哟

  • 相关阅读:
    小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求
    k8s-集群升级 2
    【Java 基础篇】Java网络编程实时数据流处理
    盘点 三款高可用的机器学习模型 web页面化的工具(一)
    openssl从证书中提取公钥
    vue通过一组id匹配另一个数组中的对象
    python-切换镜像源和使用PyCharm进行第三方开源包安装
    C++零碎记录(二)
    首设农作物种业专区农民丰收节国际贸易促进会舌尖上进博会
    redis的原理和源码-线程问题(单线程、BIO线程、redis6.0多IO线程)&源码解析
  • 原文地址:https://blog.csdn.net/qq_51580852/article/details/126189840