PDF Tools

An userscript that enhances the pdf.js window in Firefox.

当前为 2024-02-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name PDF Tools
  3. // @id PDF_Tools@https://github.com/jerone/UserScripts
  4. // @description An userscript that enhances the pdf.js window in Firefox.
  5. // @version 1.0
  6. // @namespace https://github.com/jerone/UserScripts
  7. // @author jerone
  8. // @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
  9. // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
  10. // @supportURL https://github.com/jerone/UserScripts/issues
  11. // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VCYMHWQ7ZMBKW
  12. // @include *.pdf
  13. // @include *.pdf?*
  14. // @include *.pdf#*
  15. // @run-at document-end
  16. // ==/UserScript==
  17.  
  18. (function() {
  19.  
  20. //console.log(PDFJS.version); // "1.0.277"
  21.  
  22. var mimetype = "png";
  23.  
  24. var SecondaryToolbar = {
  25. opened: false,
  26. initialize: function secondaryToolbarInitialize() {
  27. this.toolbar = document.createElement("div");
  28. this.toolbar.classList.add("secondaryToolbar", "doorHangerRight", "hidden");
  29. this.toolbar.style.right = "180px";
  30. document.getElementById("mainContainer").appendChild(this.toolbar);
  31.  
  32. this.buttonContainer = document.createElement("div");
  33. this.buttonContainer.classList.add("secondaryToolbarButtonContainer");
  34. this.toolbar.appendChild(this.buttonContainer);
  35.  
  36. this.attachEvents();
  37. },
  38.  
  39. attachEvents: function() {
  40. /// https://github.com/mozilla/pdf.js/blob/2f5c6d6c3a75f9f44826c776dd356e2f786f35de/web/viewer.js#L2248
  41. window.addEventListener("click", function click(evt) {
  42. if (SecondaryToolbar.opened && unsafeWindow.PDFView.container.contains(evt.target)) {
  43. SecondaryToolbar.close();
  44. }
  45. }, false);
  46. /// https://github.com/mozilla/pdf.js/blob/2f5c6d6c3a75f9f44826c776dd356e2f786f35de/web/viewer.js#L2381
  47. window.addEventListener("keydown", function keydown(evt) {
  48. if (SecondaryToolbar.opened && evt.keyCode === 27) { // esc;
  49. SecondaryToolbar.close();
  50. }
  51. });
  52. },
  53.  
  54. render: function() {
  55. console.log(unsafeWindow.PDFView.pages);
  56. console.log(unsafeWindow.PDFView.pages[0].draw);
  57.  
  58. var pages = unsafeWindow.PDFView.pages;
  59.  
  60. for (var i = 0, ii = pages.length; i < ii; i++) {
  61. var page = pages[i];
  62. console.log(page, page.draw);
  63. var img = document.createElement("a");
  64. img.classList.add("secondaryToolbarButton", "download");
  65. img.dataset.pageIndex = i;
  66. img.setAttribute("download", "page" + page.id + "." + mimetype);
  67. img.setAttribute("title", "Download 'page" + page.id + "." + mimetype + "'");
  68. img.style.display = "inline-block";
  69. img.style.boxSizing = "border-box";
  70. img.appendChild(document.createTextNode("Page " + page.id));
  71. img.addEventListener("click", function() {
  72. var page = pages[this.dataset.pageIndex];
  73. if (!page.canvas) { page.draw(); }
  74. this.href = page.canvas.toDataURL("image/" + mimetype);
  75. //window.open( page.canvas.toDataURL("image/" + mimetype));
  76. });
  77. //this.buttonContainer.appendChild(img);
  78.  
  79. console.log(page.canvas, img, arguments);
  80.  
  81. //if (!page.canvas) { page.draw(); }
  82. var img2 = document.createElement("img");
  83. //img2.style.width = "16px";
  84. img2.style.height = "16px";
  85. img2.style.border = "1px solid red";
  86. //img2.src = page.canvas.toDataURL("image/" + mimetype);
  87. img2.src = page.canvas && page.canvas.toDataURL("image/" + mimetype) || "";
  88. this.buttonContainer.appendChild(img2);
  89.  
  90. }
  91.  
  92. /*
  93. unsafeWindow.PDFView.pages.forEach(function(page) {
  94. console.log(page, page.draw);
  95. if (page.draw) page.draw();
  96.  
  97. var img = document.createElement("button");
  98. img.classList.add("secondaryToolbarButton", "download");
  99. img.dataset.canvasURL = page.canvas.toDataURL("image/" + mimetype);
  100. img.setAttribute("download", page.canvas.id + "." + mimetype);
  101. img.setAttribute("title", "Download " + page.canvas.id + "." + mimetype);
  102. img.style.display = "inline-block";
  103. img.appendChild(document.createTextNode(page.canvas.id));
  104. img.addEventListener("click", function() {
  105. this.href = this.dataset.canvasURL;
  106. });
  107. this.buttonContainer.appendChild(img);
  108. console.log(page.canvas, img, arguments);
  109. });
  110. /*
  111. var canvases = document.querySelectorAll("canvas:not(.thumbnailImage)");
  112. console.log("test", canvases);
  113. Array.prototype.forEach.call(canvases, function(canvas) {
  114. var img = document.createElement("button");
  115. img.classList.add("secondaryToolbarButton", "download");
  116. img.dataset.canvasURL = canvas.toDataURL("image/" + mimetype);
  117. img.setAttribute("download", canvas.id + "." + mimetype);
  118. img.setAttribute("title", "Download " + canvas.id + "." + mimetype);
  119. img.style.display = "inline-block";
  120. img.appendChild(document.createTextNode(canvas.id));
  121. img.addEventListener("click", function() {
  122. this.href = this.dataset.canvasURL;
  123. });
  124. this.buttonContainer.appendChild(img);
  125. console.log(canvas, img, arguments);
  126. });*/
  127. },
  128.  
  129. empty: function() {
  130. while (this.buttonContainer.hasChildNodes()) {
  131. this.buttonContainer.removeChild(this.buttonContainer.lastChild);
  132. }
  133. },
  134.  
  135. open: function secondaryToolbarOpen() {
  136. if (this.opened) {
  137. return;
  138. }
  139. this.opened = true;
  140. this.toolbar.classList.remove('hidden');
  141. this.render();
  142. },
  143.  
  144. close: function secondaryToolbarClose(target) {
  145. if (!this.opened) {
  146. return;
  147. } else if (target && !this.toolbar.contains(target)) {
  148. return;
  149. }
  150. this.opened = false;
  151. this.toolbar.classList.add('hidden');
  152. this.empty();
  153. },
  154.  
  155. toggle: function secondaryToolbarToggle() {
  156. if (this.opened) {
  157. this.close();
  158. } else {
  159. this.open();
  160. }
  161. }
  162. };
  163.  
  164. SecondaryToolbar.initialize();
  165.  
  166. var toolbar = document.getElementById("toolbarViewerRight");
  167. var btn = document.createElement("button");
  168. btn.classList.add("toolbarButton", "zoomIn");
  169. toolbar.insertBefore(btn, toolbar.firstChild);
  170. btn.addEventListener("click", function() {
  171. SecondaryToolbar.toggle();
  172. });
  173.  
  174. })();