PDF Tools

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

目前为 2015-03-05 提交的版本。查看 最新版本

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