pdf.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <template>
  2. <div class="pdf">
  3. <div class="show">
  4. <pdf
  5. ref="pdf"
  6. :src="pdfUrl"
  7. :page="pageNum"
  8. :rotate="pageRotate"
  9. @password="password"
  10. @progress="loadedRatio = $event"
  11. @page-loaded="pageLoaded($event)"
  12. @num-pages="pageTotalNum = $event"
  13. @error="pdfError($event)"
  14. @link-clicked="page = $event"
  15. ></pdf>
  16. </div>
  17. <!-- <div class="pdf_footer">
  18. <div class="info">
  19. <div>当前页数/总页数:{{pageNum}}/{{pageTotalNum}}</div>
  20. </div>
  21. <div class="operate">
  22. <div class="btn" @click.stop="prePage">上一页</div>
  23. <div class="btn" @click.stop="nextPage">下一页</div>
  24. </div>
  25. </div>-->
  26. </div>
  27. </template>
  28. <script>
  29. import pdf from "vue-pdf";
  30. export default {
  31. name: "vue_pdf_preview",
  32. props: {
  33. // 当前pdf路径
  34. pdfUrl: {
  35. type: String,
  36. default:
  37. "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/0629%E5%AE%9E%E6%97%B6%E8%AF%BE%E5%A0%82%E6%A8%A1%E6%8B%9F%E6%BC%94%E7%A4%BA%E8%AF%BE%E4%BB%B61656920880446.pdf",
  38. },
  39. ppage: {
  40. type: Number,
  41. default: 1,
  42. },
  43. },
  44. components: {
  45. pdf,
  46. },
  47. data() {
  48. return {
  49. // 总页数
  50. pageTotalNum: 1,
  51. // 当前页数
  52. pageNum: 1,
  53. // 加载进度
  54. loadedRatio: 0,
  55. // 页面加载完成
  56. curPageNum: 0,
  57. // 放大系数 默认百分百
  58. scale: 69,
  59. // 旋转角度 ‘90’的倍数才有效
  60. pageRotate: 0,
  61. // 单击内部链接时触发 (目前我没有遇到使用场景)
  62. page: 0,
  63. loading: null,
  64. };
  65. },
  66. watch: {
  67. ppage(val) {
  68. this.pageNum = val;
  69. },
  70. pageTotalNum(val) {
  71. if (val) {
  72. this.loading.close();
  73. // this.$parent.setData();
  74. this.$parent.getRealTimeClass();
  75. }
  76. this.$emit("getPageTotal", val);
  77. },
  78. },
  79. computed: {},
  80. created() {},
  81. mounted() {
  82. this.loading = this.$loading.service({
  83. background: "rgba(255, 255, 255, 0.7)",
  84. target: document.querySelector(".pdf"),
  85. });
  86. this.pageNum = this.ppage;
  87. let dwidth = document.body.offsetWidth;
  88. let cwidth = document.getElementsByClassName("pdf")[0].offsetHeight * 1.77;
  89. let owidth = "";
  90. if (cwidth > dwidth) {
  91. owidth = dwidth + "px";
  92. } else {
  93. owidth = cwidth + "px";
  94. }
  95. var a = document.getElementsByClassName("pdf")[0].offsetWidth;
  96. let _this = this;
  97. this.$refs.pdf.$el.style.width = owidth;
  98. this.$emit("getWidth", owidth);
  99. window.addEventListener("resize", () => {
  100. dwidth = document.body.offsetWidth;
  101. cwidth = document.getElementsByClassName("pdf")[0].offsetHeight * 1.77;
  102. if (cwidth > dwidth) {
  103. owidth = dwidth + "px";
  104. } else {
  105. owidth = cwidth + "px";
  106. }
  107. this.$refs.pdf.$el.style.width = owidth;
  108. this.$emit("getWidth", owidth);
  109. });
  110. },
  111. methods: {
  112. //下载PDF
  113. fileDownload(data, fileName) {
  114. let blob = new Blob([data], {
  115. //type类型后端返回来的数据中会有,根据自己实际进行修改
  116. type: "application/pdf;charset-UTF-8",
  117. });
  118. let filename = fileName || "pdf.pdf";
  119. if (typeof window.navigator.msSaveBlob !== "undefined") {
  120. window.navigator.msSaveBlob(blob, filename);
  121. } else {
  122. var blobURL = window.URL.createObjectURL(blob);
  123. // 创建隐藏<a>标签进行下载
  124. var tempLink = document.createElement("a");
  125. tempLink.style.display = "none";
  126. tempLink.href = blobURL;
  127. tempLink.setAttribute("download", filename);
  128. if (typeof tempLink.download === "undefined") {
  129. tempLink.setAttribute("target", "_blank");
  130. }
  131. document.body.appendChild(tempLink);
  132. tempLink.click();
  133. document.body.removeChild(tempLink);
  134. window.URL.revokeObjectURL(blobURL);
  135. }
  136. },
  137. //放大
  138. scaleD() {
  139. this.scale += 5;
  140. this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
  141. },
  142. //缩小
  143. scaleX() {
  144. // scale 是百分百展示 不建议缩放
  145. if (this.scale == 100) {
  146. return;
  147. }
  148. this.scale += -5;
  149. console.log(parseInt(this.scale) + "%");
  150. this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
  151. },
  152. // 切换上一页
  153. prePage() {
  154. var p = this.pageNum;
  155. p = p > 1 ? p - 1 : this.pageTotalNum;
  156. this.pageNum = p;
  157. // this.getPage(p);
  158. },
  159. // 切换下一页
  160. nextPage() {
  161. var p = this.pageNum;
  162. p = p < this.pageTotalNum ? p + 1 : 1;
  163. this.pageNum = p;
  164. // this.getPage(p);
  165. },
  166. // 顺时针选中角度
  167. clock() {
  168. this.pageRotate += 90;
  169. },
  170. // 逆时针旋转角度
  171. counterClock() {
  172. this.pageRotate -= 90;
  173. },
  174. // pdf 有密码 则需要输入秘密
  175. password(updatePassword, reason) {
  176. updatePassword(prompt('password is "test"'));
  177. console.log("...reason...");
  178. console.log(reason);
  179. console.log("...reason...");
  180. },
  181. // 页面加载成功 当前页数
  182. pageLoaded(e) {
  183. this.$emit("current", e);
  184. this.curPageNum = e;
  185. },
  186. // 异常监听
  187. pdfError(error) {
  188. console.error(error);
  189. },
  190. // 打印所有
  191. pdfPrintAll() {
  192. this.$refs.pdf.print();
  193. },
  194. // 打印 第一页和第二页
  195. pdfPrint() {
  196. // 第一个参数 文档打印的分辨率
  197. // 第二个参数 文档打印的页数
  198. this.$refs.pdf.print(100, [1, 2]);
  199. },
  200. // 获取当前页面pdf的文字信息内容
  201. logContent() {
  202. this.$refs.pdf.pdf.forEachPage(function (page) {
  203. return page.getTextContent().then(function (content) {
  204. let text = content.items.map((item) => item.str);
  205. let allStr = content.items.reduce(
  206. (initVal, item) => (initVal += item.str),
  207. ""
  208. );
  209. console.log(allStr); // 内容字符串
  210. console.log(text); // 内容数组
  211. });
  212. });
  213. },
  214. },
  215. };
  216. </script>
  217. <style scoped>
  218. .pdf {
  219. height: 100%;
  220. position: relative;
  221. box-sizing: border-box;
  222. }
  223. .pdf .show {
  224. overflow: auto;
  225. margin: auto;
  226. width: 100%;
  227. height: calc(100%);
  228. display: flex;
  229. align-items: center;
  230. justify-content: center;
  231. }
  232. .pdf .pdf_footer {
  233. position: absolute;
  234. bottom: 0;
  235. left: 0;
  236. right: 0;
  237. padding: 10px 0;
  238. width: 100%;
  239. height: 75px;
  240. background-color: rgba(255, 255, 255, 0.5);
  241. display: flex;
  242. align-items: center;
  243. justify-content: center;
  244. flex-direction: column;
  245. }
  246. .pdf .pdf_footer .info {
  247. display: flex;
  248. flex-wrap: wrap;
  249. width: 100%;
  250. justify-content: center;
  251. }
  252. /* .pdf .pdf_footer .info div {
  253. width: 30%;
  254. } */
  255. .pdf .pdf_footer .operate {
  256. margin: 10px 0 0;
  257. display: flex;
  258. flex-wrap: wrap;
  259. justify-content: center;
  260. width: 100%;
  261. }
  262. .pdf .pdf_footer .operate div {
  263. text-align: center;
  264. font-size: 15px;
  265. }
  266. .pdf .pdf_footer .operate .btn {
  267. cursor: pointer;
  268. margin: 5px 10px;
  269. width: 100px;
  270. border-radius: 10px;
  271. padding: 5px;
  272. color: #fff;
  273. background-color: #066ebe;
  274. }
  275. </style>