Picviewer CE+ PDF addon

Batch Download as PDF instead of ZIP

اعتبارا من 21-06-2024. شاهد أحدث إصدار.

  1. // ==UserScript==
  2. // @name Picviewer CE+ PDF addon
  3. // @name:zh-CN Picviewer CE+ PDF 扩展
  4. // @name:zh-TW Picviewer CE+ PDF 擴充
  5. // @namespace https://github.com/hoothin/UserScripts
  6. // @version 2024-06-21
  7. // @description Batch Download as PDF instead of ZIP
  8. // @description:zh-CN 取代 ZIP, 打包下载时下载为 PDF
  9. // @description:zh-TW 取代 ZIP, 打包下載時下載為 PDF
  10. // @author hoothin
  11. // @match *://*/*
  12. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAV1BMVEUAAAD////29vbKysoqKioiIiKysrKhoaGTk5N9fX3z8/Pv7+/r6+vk5OTb29vOzs6Ojo5UVFQzMzMZGRkREREMDAy4uLisrKylpaV4eHhkZGRPT08/Pz/IfxjQAAAAgklEQVQoz53RRw7DIBBAUb5pxr2m3/+ckfDImwyJlL9DDzQgDIUMRu1vWOxTBdeM+onApENF0qHjpkOk2VTwLVEF40Kbfj1wK8AVu2pQA1aBBYDHJ1wy9Cf4cXD5chzNAvsAnc8TjoLAhIzsBao9w1rlVTIvkOYMd9nm6xPi168t9AYkbANdajpjcwAAAABJRU5ErkJggg==
  13. // @grant unsafeWindow
  14. // @grant GM_registerMenuCommand
  15. // @grant GM_unregisterMenuCommand
  16. // @grant GM_getValue
  17. // @grant GM_setValue
  18. // @require https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js
  19. // ==/UserScript==
  20.  
  21. (function() {
  22. 'use strict';
  23. async function blobToDataURL(blob) {
  24. return new Promise((resolve) => {
  25. setTimeout(() => {
  26. var a = new FileReader();
  27. a.readAsDataURL(blob);
  28. a.onload = function (e) {
  29. resolve(e.target.result);
  30. };
  31. a.onerror = function (e) {
  32. resolve(null);
  33. };
  34. }, 0);
  35. });
  36. }
  37.  
  38. function img2pdf(pdfName) {
  39. if (!(this instanceof img2pdf)) {
  40. return new img2pdf();
  41. }
  42. this.fileList = [];
  43. this.file = async (fileName, blob) => {
  44. this.fileList.push([fileName, blob]);
  45. };
  46. this.generateAsync = async (config, progress) => {
  47. const pdf = new window.jspdf.jsPDF();
  48. const fileLength = this.fileList.length;
  49. for (const [key, param] of this.fileList.entries()) {
  50. let fileName = param[0];
  51. let blob = param[1];
  52. if (!blob && this.fileList.length === 1) {
  53. fileName = this.fileList[0][0];
  54. blob = this.fileList[0][1];
  55. }
  56. let dataUrl = await blobToDataURL(blob);
  57. const imgProps = pdf.getImageProperties(dataUrl);
  58. const pdfWidth = pdf.internal.pageSize.getWidth();
  59. const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
  60. pdf.addImage(dataUrl, blob.type, 0, 0, pdfWidth, pdfHeight);
  61. progress({percent: (key + 1) / fileLength * 100, currentFile: fileName});
  62. if (key + 1 < fileLength) {
  63. pdf.addPage();
  64. }
  65. }
  66. pdf.save(pdfName);
  67. };
  68. }
  69.  
  70. const _unsafeWindow = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
  71. let disabled = !!GM_getValue("pvcep_pdf_disabled"), registerId;
  72. function registerMenuCommand() {
  73. if (disabled) {
  74. _unsafeWindow.pvcepimg2pdf = null;
  75. } else _unsafeWindow.pvcepimg2pdf = img2pdf;
  76. registerId = GM_registerMenuCommand(disabled ? "Enable addon" : "Disable addon", () => {
  77. GM_unregisterMenuCommand(registerId);
  78. disabled = !disabled;
  79. GM_setValue("pvcep_pdf_disabled", disabled);
  80. registerMenuCommand();
  81. });
  82. }
  83. registerMenuCommand();
  84. })();