uniapp微信小程序pdf预览,且可以添加自定义水印(兼容安卓和ios) ...

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

微信小程序pdf预览,且可以添加自定义水印(兼容安卓和ios)
uniapp微信小程序pdf预览

一、使用webview方式,访问pdf文件地点
  1. <web-view  :src="showFilePath">
  2. </web-view>
  3. // showFilePath 是pdf文件访问路径
复制代码
但是这样有个题目,如果这个访问地点是使用了署理,不是直接访问pdf文件的路径(以pdf末端的路径),在小程序上安卓真机上会显示白屏,IOS可以显示。那么这个方式就不太可行
使用pdfjs实现预览pdf文件,支持自定义水印

我遇到的题目是:pdf文件在浏览器上访问是有水印的,但是通过pdfjs转成的预览,会直接忽略掉文档中的水印层,导致本来pdf文件有的水印,使用pdfjs渲染的内容没有水印,于是我就本身添加水印仅用于查看。以下是实现的代码:
  1. <template>
  2.     <div class="pdf-container">
  3.         <div class="image-container">
  4.             <img v-for="(image, index) in pageImages"
  5.                  :key="index"
  6.                  :src="image"
  7.                  :alt="`Page ${index + 1}`"
  8.                  class="pdf-page-image">
  9.         </div>
  10.     </div>
  11. </template>
  12. <script setup>
  13. import { onMounted, ref } from 'vue';
  14. import pdfFile from './aa.pdf'
  15. import { useRoute } from 'vue-router';
  16. const route = useRoute();
  17. const pageImages = ref([]);
  18. const pdfUrl = ref('');
  19. const watermarkText = ref('');
  20. let pdfDoc = null;
  21. const waitForPdfJs = () => {
  22.     return new Promise((resolve) => {
  23.         const checkPdfJs = () => {
  24.             if (window.pdfjsLib) {
  25.                 resolve();
  26.             } else {
  27.                 setTimeout(checkPdfJs, 100);
  28.             }
  29.         };
  30.         checkPdfJs();
  31.     });
  32. };
  33. const convertPageToImage = async (pageNum) => {
  34.     const page = await pdfDoc.getPage(pageNum);
  35.     const viewport = page.getViewport({ scale: 2 });
  36.    
  37.     const canvas = document.createElement('canvas');
  38.     const context = canvas.getContext('2d');
  39.    
  40.     canvas.height = viewport.height;
  41.     canvas.width = viewport.width;
  42.    
  43.     await page.render({
  44.         canvasContext: context,
  45.         viewport: viewport
  46.     }).promise;
  47.    
  48.     if (watermarkText.value) {
  49.         context.save();
  50.         
  51.         context.globalAlpha = 0.2;
  52.         context.font = '36px Arial';
  53.         context.fillStyle = '#888';
  54.         
  55.         const text = watermarkText.value;
  56.         const textWidth = context.measureText(text).width;
  57.         const spacing = 130;
  58.         const verticalSpacing = 100;
  59.         
  60.         for (let y = 50; y < canvas.height; y += verticalSpacing) {
  61.             for (let x = -30; x < canvas.width; x += spacing + textWidth) {
  62.                 context.save();
  63.                 context.translate(x, y);
  64.                 context.rotate(-0.3);
  65.                 context.fillText(text, 0, 0);
  66.                 context.restore();
  67.             }
  68.         }
  69.         
  70.         context.restore();
  71.     }
  72.    
  73.     return canvas.toDataURL('image/jpeg', 0.8);
  74. };
  75. const renderAllPages = async () => {
  76.     const promises = [];
  77.     for (let i = 1; i <= pdfDoc.numPages; i++) {
  78.         promises.push(convertPageToImage(i));
  79.     }
  80.     pageImages.value = await Promise.all(promises);
  81. };
  82. onMounted(async () => {
  83.     const encodedUrl = route.query.url || '';
  84.     watermarkText.value = route.query.text ? decodeURIComponent(route.query.text) : ''; // 自定义水印的文字
  85.    
  86.     pdfUrl.value = encodedUrl ? decodeURIComponent(encodedUrl) : pdfFile; // pdfFile这个是本地pdf文件用来调试
  87.     await waitForPdfJs();
  88.    
  89.     const loadingTask = pdfjsLib.getDocument(pdfUrl.value);
  90.     loadingTask.promise.then(function (pdf) {
  91.         pdfDoc = pdf;
  92.         renderAllPages();
  93.     });
  94. });
  95. </script>
  96. <style scoped>
  97. .pdf-container {
  98.     display: flex;
  99.     flex-direction: column;
  100.     align-items: center;
  101.     width: 100%;
  102.     max-width: 1200px;
  103.     margin: 0 auto;
  104. }
  105. .image-container {
  106.     width: 100%;
  107.     overflow-y: auto;
  108.     background: #f5f5f5;
  109.     box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  110. }
  111. .pdf-page-image {
  112.     display: block;
  113.     margin: 0 auto 20px;
  114.     width: 100%;
  115.     max-width: 800px;
  116.     height: auto;
  117.     background: white;
  118. }
  119. </style>
复制代码
注意:
这里标注一下pdfjsLib这个对象是这两个文件里面有的,会把pdfjsLib放在window里面的

下面是效果哦!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表