Greasy Fork is available in English.

Picviewer CE+ PDF addon

Batch Download as PDF instead of ZIP

Instalar este script¿?
Script recomendado por el autor

Puede que también te guste SearchJumper.

Instalar este script
  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-29
  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. try {
  57. let dataUrl = await blobToDataURL(blob);
  58. const imgProps = pdf.getImageProperties(dataUrl);
  59. const imgWidth = pdf.internal.pageSize.getWidth();
  60. const pageHeight = pdf.internal.pageSize.getHeight();
  61. const imgHeight = imgProps.height * imgWidth / imgProps.width;
  62. let heightLeft = imgHeight;
  63. let position = 0;
  64.  
  65. pdf.addImage(dataUrl, blob.type, 0, position, imgWidth, imgHeight);
  66. heightLeft -= pageHeight;
  67.  
  68. while (heightLeft >= 0) {
  69. position -= pageHeight;
  70. pdf.addPage();
  71. pdf.addImage(dataUrl, blob.type, 0, position, imgWidth, imgHeight);
  72. heightLeft -= pageHeight;
  73. }
  74.  
  75. progress({percent: (key + 1) / fileLength * 100, currentFile: fileName});
  76. } catch(e) {
  77. console.log(e);
  78. }
  79. if (key + 1 < fileLength) {
  80. pdf.addPage();
  81. }
  82. }
  83. pdf.save(pdfName);
  84. };
  85. }
  86.  
  87. const _unsafeWindow = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
  88. let disabled = !!GM_getValue("pvcep_pdf_disabled"), registerId;
  89. function registerMenuCommand() {
  90. if (disabled) {
  91. _unsafeWindow.pvcepimg2pdf = null;
  92. } else _unsafeWindow.pvcepimg2pdf = img2pdf;
  93. registerId = GM_registerMenuCommand(disabled ? "❌ Disabled" : "✅ Enabled", () => {
  94. GM_unregisterMenuCommand(registerId);
  95. disabled = !disabled;
  96. GM_setValue("pvcep_pdf_disabled", disabled);
  97. registerMenuCommand();
  98. });
  99. }
  100. registerMenuCommand();
  101. })();