- // ==UserScript==
- // @name ExportPDF
- // @namespace Violentmonkey Scripts
- // @match *://www.doc88.com/*
- // @match http://localhost:8080/
- // @match https://www.docin.com/*
- // @match https://book.sciencereading.cn/shop/book/Booksimple/*
- // @grant none
- // @version 2.0
- // @author louiesun
- // @license GPL-3.0-or-later
- // @description 2024/2/25 21:45:23
- // ==/UserScript==
-
- /*
-
- // @require file:///D:/APPS/PDFexport/lib/blob-stream.js
- // @require file:///D:/APPS/PDFexport/lib/FileSaver.min.js
- // @require file:///D:/APPS/PDFexport/lib/pdfkit.standalone.js
- */
- //不能跑!! 测试请引用下方js can't run, please require the js above
- //笑死 完完全全是个图片
- /*
- * # 下载文库PDF
- 报废了。
- ## 技术背景
- 经过浏览器开发者模式发现,均采用`HTMLcanvas`渲染。
-
- 发现Github项目[Canvas2PDF](https://github.com/joshua-gould/canvas2pdf)。
-
- 同时,其`README.md`:
- > Canvas2PDF exports your HTML canvas as PDF using JavaScript. Note that this library generates actual PDF drawing calls to create a PDF with vector graphics, unlike some alternate libraries which rasterize your canvas and place it as an image in your PDF.
-
- 说明不是截屏。
-
- 那么这里就只需要重载canvasctx实现为`PDFcanvas`即可。
-
- ## 劫持经验分享
- API比较多,需要面对`native code`,如果不想重编译V8引擎就找到替代函数或对象并使用。
-
- 基本上需要改掉`document.createElement`,`element.innerHTML`,可能有其它的,遇到再说,就看有没有没有经过userjs“审查”的DOM元素创建。
-
- ## 另外
- 如果`svg`元素实现,直接导出矢量。
- 如果`div`套套,就导出div。
-
- 只有`canvas`是需要拦截的。
-
- ## 这将是一个折磨
- cao,doc88从来没有传输过矢量内容,就过来一张图片。寄了。只能OCR。
- 但是我劫持了canvas。
-
-
-
-
- > Written with [StackEdit+](https://stackedit.net/).
- */
-
- // https://github.com/devongovett/pdfkit/releases/download/v0.14.0/pdfkit.standalone.js
- // https://github.com/devongovett/blob-stream/releases/download/v0.1.3/blob-stream.js
- // https://github.com/eligrey/FileSaver.js/blob/master/dist/FileSaver.min.js can't be required
-
- /*
- *
- * A canvas to PDF converter. Uses a mock canvas context to build a PDF document.
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Author:
- * Joshua Gould
- *
- * Copyright (c) 2017 Joshua Gould
- */
-
- function hex(v) {
- return v < 0x10
- ? "0" + Math.max(0, v).toString(16)
- : Math.min(255, v).toString(16);
- }
-
- function hslToHex(h, s, l, a) {
- h = (h % 360) + (h < 0) * 360;
- s = isNaN(h) || isNaN(s) ? 0 : s;
- const m2 = l + (l < 0.5 ? l : 1 - l) * s;
- const m1 = 2 * l - m2;
- return rgbToHex(
- hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
- hsl2rgb(h, m1, m2),
- hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
- a,
- );
- }
-
- function hsl2rgb(h, m1, m2) {
- return (
- (h < 60
- ? m1 + ((m2 - m1) * h) / 60
- : h < 180
- ? m2
- : h < 240
- ? m1 + ((m2 - m1) * (240 - h)) / 60
- : m1) * 255
- );
- }
-
- const reI = "\\s*([+-]?\\d+)\\s*",
- reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
- reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
- reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
- reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
- reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
- reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
- reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
- reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
-
- const rgbToHex = function (r, g, b, a) {
- return { c: "#" + hex(r) + hex(g) + hex(b), a: a };
- };
-
- const fixColor = function (value) {
- let m;
- const format = (value + "").trim().toLowerCase();
- if ((m = reRgbInteger.exec(format))) {
- // rgb(255, 0, 0)
- return rgbToHex(m[1], m[2], m[3], 1);
- } else if ((m = reRgbPercent.exec(format))) {
- // // rgb(100%, 0%, 0%)
- return rgbToHex(
- (m[1] * 255) / 100,
- (m[2] * 255) / 100,
- (m[3] * 255) / 100,
- 1,
- );
- } else if ((m = reRgbaInteger.exec(format))) {
- // // rgba(255, 0, 0, 0.5)
- return rgbToHex(m[1], m[2], m[3], m[4]);
- } else if ((m = reRgbaPercent.exec(format))) {
- // // rgb(100%, 0%, 0%, .2)
- return rgbToHex(
- (m[1] * 255) / 100,
- (m[2] * 255) / 100,
- (m[3] * 255) / 100,
- m[4],
- );
- } else if ((m = reHslPercent.exec(format))) {
- // // hsl(120, 50%, 50%)
- return hslToHex(m[1], m[2] / 100, m[3] / 100);
- } else if ((m = reHslaPercent.exec(format))) {
- return hslToHex(m[1], m[2] / 100, m[3] / 100, m[4]); // hsla(120, 50%, 50%, 1)
- } else {
- return { c: value, a: 1 };
- }
- };
- /**
- *
- * @param stream Stream to write the PDF to.
- * @param options Options passed to PDFDocument constructor.
- * @constructor
- */
- const PdfContext = function (stream, options) {
- if (stream == null) {
- throw new Error("Stream must be provided.");
- }
-
- const doc = new PDFDocument(options);
- this.stream = doc.pipe(stream);
- let fontValue = "10px Helvetica";
- let textAlign = "left";
- let textBaseline = "alphabetic";
- let lineHeight = doc.currentLineHeight(false);
- let font = fontValue;
-
- const fontRegex =
- /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z]+?)\s*$/i;
- const defaultFontData = {
- style: "normal",
- size: 10,
- family: "Helvetica",
- weight: "normal",
- };
- const parseFont = function () {
- const fontPart = fontRegex.exec(font);
- if (fontPart === null) {
- return defaultFontData;
- }
- const data = {
- style: fontPart[1] || "normal",
- size: parseInt(fontPart[4]) || 10,
- family: fontPart[6] || "Helvetica",
- weight: fontPart[3] || "normal",
- };
- return data;
- };
-
- Object.defineProperty(this, "fillStyle", {
- get: function () {
- return doc.fillColor();
- },
- set: function (value) {
- const color = fixColor(value);
- doc.fillColor(color.c, color.a);
- },
- });
- Object.defineProperty(this, "strokeStyle", {
- get: function () {
- return doc.strokeColor();
- },
- set: function (value) {
- const color = fixColor(value);
- doc.strokeColor(color.c, color.a);
- },
- });
- Object.defineProperty(this, "lineWidth", {
- get: function () {
- return doc.lineWidth();
- },
- set: function (value) {
- doc.lineWidth(value);
- },
- });
-
- Object.defineProperty(this, "lineCap", {
- get: function () {
- return doc.lineCap();
- },
- set: function (value) {
- doc.lineCap(value);
- },
- });
- Object.defineProperty(this, "lineJoin", {
- get: function () {
- return doc.lineJoin();
- },
- set: function (value) {
- doc.lineJoin(value);
- },
- });
-
- Object.defineProperty(this, "globalAlpha", {
- get: function () {
- return doc.opacity();
- },
- set: function (value) {
- value >= 0.0 && value <= 1.0 && doc.opacity(value);
- },
- });
-
- Object.defineProperty(this, "font", {
- get: function () {
- return fontValue;
- },
- set: function (value) {
- fontValue = value;
- const parsedFont = parseFont(value);
- doc.fontSize(parsedFont.size);
- doc.font(parsedFont.family);
- lineHeight = doc.currentLineHeight(false);
- },
- });
-
- this.end = function () {
- doc.end();
- };
-
- this.save = function () {
- doc.save();
- };
-
- this.restore = function () {
- doc.restore();
- };
-
- this.scale = function (x, y) {
- doc.scale(x, y);
- };
-
- this.rotate = function (angle) {
- const degrees = (angle * 180) / Math.PI;
- doc.rotate(degrees);
- };
-
- this.translate = function (x, y) {
- doc.translate(x, y);
- };
-
- this.transform = function (a, b, c, d, e, f) {
- doc.transform(a, b, c, d, e, f);
- };
-
- this.beginPath = function () {
- // no-op
- };
-
- this.moveTo = function (x, y) {
- doc.moveTo(x, y);
- };
-
- this.closePath = function () {
- doc.closePath();
- };
-
- this.lineTo = function (x, y) {
- doc.lineTo(x, y);
- };
-
- this.stroke = function () {
- doc.stroke();
- };
-
- this.fill = function () {
- doc.fill();
- };
-
- this.rect = function (x, y, width, height) {
- doc.rect(x, y, width, height);
- };
-
- this.fillRect = function (x, y, width, height) {
- doc.rect(x, y, width, height);
- doc.fill();
- };
-
- this.strokeRect = function (x, y, width, height) {
- doc.rect(x, y, width, height);
- doc.stroke();
- };
-
- /**
- * "Clears" a canvas by just drawing a white rectangle in the current group.
- */
- this.clearRect = function (x, y, width, height) {
- const oldFill = doc.fillColor();
- doc.fillColor("white");
- doc.rect(x, y, width, height);
- doc.fill();
- doc.fillColor(oldFill);
- };
-
- this.arc = function (x, y, r, a0, a1, ccw) {
- const pi = Math.PI,
- tau = 2 * pi,
- epsilon = 1e-6,
- tauEpsilon = tau - epsilon;
- (x = +x), (y = +y), (r = +r);
- let dx = r * Math.cos(a0),
- dy = r * Math.sin(a0),
- x0 = x + dx,
- y0 = y + dy,
- cw = 1 ^ ccw,
- da = ccw ? a0 - a1 : a1 - a0;
-
- // Is the radius negative? Error.
- if (r < 0) {
- throw new Error("negative radius: " + r);
- }
- let cmd = "";
- // Is this path empty? Move to (x0,y0).
-
- cmd += "M" + x0 + "," + y0;
-
- // // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
- // else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
- // cmd += 'L' + x0 + ',' + y0;
- // }
-
- // Is this arc empty? We’re done.
- if (!r) {
- return;
- }
-
- // Does the angle go the wrong way? Flip the direction.
- if (da < 0) {
- da = (da % tau) + tau;
- }
-
- // Is this a complete circle? Draw two arcs to complete the circle.
- if (da > tauEpsilon) {
- cmd +=
- "A" +
- r +
- "," +
- r +
- ",0,1," +
- cw +
- "," +
- (x - dx) +
- "," +
- (y - dy) +
- "A" +
- r +
- "," +
- r +
- ",0,1," +
- cw +
- "," +
- x0 +
- "," +
- y0;
- }
-
- // Is this arc non-empty? Draw an arc!
- else if (da > epsilon) {
- cmd +=
- "A" +
- r +
- "," +
- r +
- ",0," +
- +(da >= pi) +
- "," +
- cw +
- "," +
- (x + r * Math.cos(a1)) +
- "," +
- (y + r * Math.sin(a1));
- }
- doc.path(cmd);
- };
-
- this.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {
- doc.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
- };
-
- this.quadraticCurveTo = function (cpx, cpy, x, y) {
- doc.quadraticCurveTo(cpx, cpy, x, y);
- };
- this.createLinearGradient = function (x1, y1, x2, y2) {
- const gradient = doc.linearGradient(x1, y1, x2, y2);
- gradient.addColorStop = function (offset, color) {
- const fixedColor = fixColor(color);
- gradient.stop(offset, fixedColor.c, fixedColor.a);
- };
- return gradient;
- };
-
- this.createRadialGradient = function (x0, y0, r0, x1, y1, r1) {
- const gradient = doc.radialGradient(x0, y0, r0, x1, y1, r1);
- gradient.addColorStop = function (offset, color) {
- const fixedColor = fixColor(color);
- gradient.stop(offset, fixedColor.c, fixedColor.a);
- };
- return gradient;
- };
-
- this.adjustTextX = function (text, x) {
- if (textAlign !== "start" || textAlign !== "left") {
- const width = doc.widthOfString(text);
- if (textAlign === "right" || textAlign === "end") {
- x -= width;
- } else if (textAlign === "center") {
- x -= width / 2;
- }
- }
- return x;
- };
-
- this.adjustTextY = function (text, y) {
- // baseline is top by default
- if (textBaseline === "bottom") {
- y -= lineHeight;
- } else if (textBaseline === "middle") {
- y -= lineHeight / 2;
- } else if (textBaseline === "alphabetic") {
- y -= lineHeight / 2 + 1;
- }
- return y;
- };
-
- this.fillText = function (text, x, y) {
- x = this.adjustTextX(text, x);
- y = this.adjustTextY(text, y);
- doc.text(text, x, y, {
- lineBreak: false,
- stroke: false,
- fill: true,
- });
- };
-
- this.strokeText = function (text, x, y) {
- x = this.adjustTextX(text, x);
- y = this.adjustTextY(text, y);
- doc.text(text, x, y, { lineBreak: false, stroke: true, fill: false });
- };
-
- this.measureText = function (text) {
- text = "" + text;
- const width = doc.widthOfString(text);
- return { width: width, height: lineHeight };
- };
-
- this.clip = function () {
- doc.clip();
- };
-
- this.drawImage = function (image) {
- const args = Array.prototype.slice.call(arguments);
- image = args[0];
- let dx,
- dy,
- dw,
- dh,
- sx = 0,
- sy = 0,
- sw,
- sh;
- if (args.length === 3) {
- dx = args[1];
- dy = args[2];
- sw = image.width;
- sh = image.height;
- dw = sw;
- dh = sh;
- } else if (args.length === 5) {
- dx = args[1];
- dy = args[2];
- dw = args[3];
- dh = args[4];
- sw = image.width;
- sh = image.height;
- } else if (args.length === 9) {
- sx = args[1];
- sy = args[2];
- sw = args[3];
- sh = args[4];
- dx = args[5];
- dy = args[6];
- dw = args[7];
- dh = args[8];
- } else {
- throw new Error(
- "Invalid number of arguments passed to drawImage: " + arguments.length,
- );
- }
-
- if (image.nodeName === "IMG") {
- const canvas = document.createElement("tcanvas");
- canvas.width = image.width;
- canvas.height = image.height;
- canvas.getContext("2d").drawImage(image, 0, 0);
- const dataURL = canvas.toDataURL("image/png");
- doc.image(dataURL, dx, dy, { width: dw, height: dh });
- } else {
- doc.image(image, dx, dy, { width: dw, height: dh });
- }
- };
-
- this.setTransform = function (a, b, c, d, e, f) {
- const ctm = doc._ctm;
- const height = doc.page.height;
- const [a1, b1, c1, d1, e1, f1] = ctm;
- const determinant = a1 * d1 - b1 * c1;
- const inverse = [
- d1 / determinant,
- -b1 / determinant,
- -c1 / determinant,
- a1 / determinant,
- (c1 * f1 - d1 * e1) / determinant,
- (b1 * e1 - a1 * f1) / determinant,
- ];
- doc.transform(
- inverse[0],
- inverse[1],
- inverse[2],
- inverse[3],
- inverse[4],
- inverse[5],
- );
- doc.translate(0, height);
- doc.scale(1, -1);
- doc.transform(a, b, c, d, e, f);
- };
-
- /**
- * Not yet implemented
- */
- this.createPattern = function (image, repetition) {
- console.log("createPattern not implemented");
- };
-
- this.setLineDash = function (dashArray) {
- console.log("setLineDash not implemented");
- };
-
- this.drawFocusIfNeeded = function () {
- console.log("drawFocusIfNeeded not implemented");
- };
-
- this.createImageData = function () {
- console.log("drawFocusRing not implemented");
- };
-
- this.getImageData = function () {
- console.log("getImageData not implemented");
- };
-
- this.putImageData = function () {
- console.log("putImageData not implemented");
- };
-
- this.globalCompositeOperation = function () {
- console.log("globalCompositeOperation not implemented");
- };
-
- this.arcTo = function (x1, y1, x2, y2, radius) {
- console.log("arcTo not implemented");
- };
- };
-
-
- const ProxyContext = function (HTMLctx) {
- if (HTMLctx == null) {
- throw new Error("Origin Canvas must be provided.");
- }
- let PDFctx=new PdfContext(blobStream());
-
- Object.defineProperty(this, "font", {
- get: function () {
- return HTMLctx.font;
- },
- set: function (value) {
- HTMLctx.font=value;
- PDFctx.font=value;
- },
- });
- Object.defineProperty(this, "textAlign", {
- get: function () {
- return HTMLctx.textAlign;
- },
- set: function (value) {
- HTMLctx.fontValue=value;
- PDFctx.fontValue=value;
- },
- });
- Object.defineProperty(this, "textBaseline", {
- get: function () {
- return HTMLctx.textBaseline;
- },
- set: function (value) {
- HTMLctx.fontValue=value;
- PDFctx.fontValue=value;
- },
- });
- Object.defineProperty(this, "fontRegex", {
- get: function () {
- return HTMLctx.fontRegex;
- },
- set: function (value) {
- HTMLctx.fontRegex=value;
- PDFctx.fontRegex=value;
- },
- });
- Object.defineProperty(this, "fillStyle", {
- get: function () {
- return HTMLctx.fillStyle;
- },
- set: function (value) {
- HTMLctx.fillStyle=value;
- PDFctx.fillStyle=value;
- },
- });
- Object.defineProperty(this, "strokeStyle", {
- get: function () {
- return HTMLctx.strokeStyle;
- },
- set: function (value) {
- HTMLctx.strokeStyle=value;
- PDFctx.strokeStyle=value;
- },
- });
- Object.defineProperty(this, "lineWidth", {
- get: function () {
- return HTMLctx.lineWidth;
- },
- set: function (value) {
- HTMLctx.lineWidth=value;
- PDFctx.lineWidth=value;
- },
- });
-
- Object.defineProperty(this, "lineCap", {
- get: function () {
- return HTMLctx.lineCap;
- },
- set: function (value) {
- HTMLctx.lineCap=value;
- PDFctx.lineCap=value;
- },
- });
- Object.defineProperty(this, "lineJoin", {
- get: function () {
- return HTMLctx.lineJoin;
- },
- set: function (value) {
- HTMLctx.lineJoin=value;
- PDFctx.lineJoin=value;
- },
- });
-
- Object.defineProperty(this, "globalAlpha", {
- get: function () {
- return HTMLctx.globalAlpha;
- },
- set: function (value) {
- HTMLctx.globalAlpha=value;
- PDFctx.globalAlpha=value;
- },
- });
-
-
- this.end = function (...arvs) {
- return PDFctx.end(...arvs);
- };
- this.save = function (...arvs) {
- PDFctx.save(...arvs);
- return HTMLctx.save(...arvs);
- };
- this.restore = function (...arvs) {
- PDFctx.restore(...arvs);
- return HTMLctx.restore(...arvs);
- };
- this.scale = function (...arvs) {
- PDFctx.scale(...arvs);
- return HTMLctx.scale(...arvs);
- };
- this.rotate = function (...arvs) {
- PDFctx.rotate(...arvs);
- return HTMLctx.rotate(...arvs);
- };
-
- this.translate = function (...arvs) {
- PDFctx.translate(...arvs);
- return HTMLctx.translate(...arvs);
- };
-
- this.transform = function (...arvs) {
- PDFctx.transform(...arvs);
- return HTMLctx.transform(...arvs);
- };
-
- this.beginPath = function (...arvs) {
- PDFctx.beginPath(...arvs);
- return HTMLctx.beginPath(...arvs);
- };
-
- this.moveTo = function (...arvs) {
- PDFctx.moveTo(...arvs);
- return HTMLctx.moveTo(...arvs);
- };
-
- this.closePath = function (...arvs) {
- PDFctx.closePath(...arvs);
- return HTMLctx.closePath(...arvs);
- };
-
- this.lineTo = function (...arvs) {
- PDFctx.lineTo(...arvs);
- return HTMLctx.lineTo(...arvs);
- };
-
- this.stroke = function (...arvs) {
- PDFctx.stroke(...arvs);
- return HTMLctx.stroke(...arvs);
- };
-
- this.fill = function (...arvs) {
- PDFctx.fill(...arvs);
- return HTMLctx.fill(...arvs);
- };
-
- this.rect = function (...arvs) {
- PDFctx.rect(...arvs);
- return HTMLctx.rect(...arvs);
- };
-
- this.fillRect = function (...arvs) {
- PDFctx.fillRect(...arvs);
- return HTMLctx.fillRect(...arvs);
- };
-
- this.strokeRect = function (...arvs) {
- PDFctx.strokeRect(...arvs);
- return HTMLctx.strokeRect(...arvs);
- };
-
- /**
- * "Clears" a canvas by just drawing a white rectangle in the current group.
- */
- this.clearRect = function (...arvs) {
- PDFctx.clearRect(...arvs);
- return HTMLctx.clearRect(...arvs);
- };
-
- this.arc = function (...arvs) {
- PDFctx.arc(...arvs);
- return HTMLctx.arc(...arvs);
- };
-
- this.bezierCurveTo = function (...arvs) {
- PDFctx.bezierCurveTo(...arvs);
- return HTMLctx.bezierCurveTo(...arvs);
- };
-
- this.quadraticCurveTo = function (...arvs) {
- PDFctx.quadraticCurveTo(...arvs);
- return HTMLctx.quadraticCurveTo(...arvs);
- };
- this.createLinearGradient = function (...arvs) {
- PDFctx.createLinearGradient(...arvs);
- return HTMLctx.createLinearGradient(...arvs);
- };
-
- this.createRadialGradient = function (...arvs) {
- PDFctx.createRadialGradient(...arvs);
- return HTML.createRadialGradient(...arvs);
- };
-
- this.adjustTextX = function (...arvs) {
- return PDFctx.adjustTextX(...arvs);
- };
-
- this.adjustTextY = function (...arvs) {
- return PDFctx.adjustTextY(...arvs);
- };
-
- this.fillText = function (...arvs) {
- PDFctx.fillText(...arvs);
- return HTMLctx.fillText(...arvs);
- };
-
- this.strokeText = function (...arvs) {
- PDFctx.strokeText(...arvs);
- return HTMLctx.strokeText(...arvs);
- };
-
- this.clip = function (...arvs) {
- PDFctx.clip(...arvs);
- return HTMLctx.clip(...arvs);
- };
-
- this.drawImage = function (...arvs) {
- PDFctx.drawImage(...arvs);
- return HTMLctx.drawImage(...arvs);
- };
-
- this.setTransform = function (...arvs) {
- PDFctx.setTransform(...arvs);
- return HTMLctx.setTransform(...arvs);
- };
-
- this.ExportPDF = function(...arvs)
- {
- PDFctx.stream.on('finish', function (...arvs) {
- var blob = PDFctx.stream.toBlob(...arvs);
- saveAs(...arvs);
- });
- PDFctx.end(...arvs);
- console.log(...arvs);
- //backgroud un completed https://segmentfault.com/a/1190000016819776
- }
-
- /**
- * Not yet implemented
- */
- this.createPattern = function (...arvs) {
- return HTMLctx.createImageData(...arvs);
- };
-
- this.setLineDash = function (...arvs) {
- return HTMLctx.createImageData(...arvs);
- };
-
- this.drawFocusIfNeeded = function (...arvs) {
- PDFctx.drawFocusIfNeeded(...arvs);
- return HTMLctx.drawFocusIfNeeded(...arvs);
- };
-
- this.createImageData = function (...arvs) {
- PDFctx.createImageData(...arvs);
- return HTMLctx.createImageData(...arvs);
- };
-
- this.getImageData = function (...arvs) {
- PDFctx.getImageData(...arvs);
- return HTMLctx.getImageData(...arvs);
- };
-
- this.putImageData = function (...arvs) {
- PDFctx.putImageData(...arvs);
- return HTMLctx.putImageData(...arvs);
- };
-
- this.globalCompositeOperation = function (...arvs) {
- PDFctx.globalCompositeOperation(...arvs);
- return HTMLctx.globalCompositeOperation(...arvs);
- };
-
- this.arcTo = function (...arvs) {
- PDFctx.globalCompositeOperation(...arvs);
- return HTMLctx.globalCompositeOperation(...arvs);
- };
- };
-
- var HTMLElememtNameList=['modernizr','link','meta','style','script','noscript','template','body','section','nav','article','aside','h1','h2','h3','h4','h5','h6','header','footer','address','main','p','hr','pre','blockquote','ol','ul','li','dl','dt','dd','figure','figcaption','div','a','em','strong','small','s','cite','q','dfn','abbr','data','time','code','var','samp','kbd','sub','i','b','u','mark','ruby','rt','rp','bdi','bdo','span','br','wbr','ins','del','img','iframe','embed','object','param','video','audio','source','track','canvas','map','area','svg','math','table','caption','colgroup','col','tbody','thead','tfoot','tr','td','th','form','fieldset','legend','label','input','button','select','datalist','optgroup','option','textarea','keygen','output','progress','meter','details','summary','menuitem','menu'];
- var HTMLElementList=new Array(HTMLElememtNameList.length);
-
- document.ElementList=HTMLElementList;
-
- function ElementInit()
- {
- for(let i=0; i<HTMLElememtNameList.length; i++)
- HTMLElementList[i]=document.createElement(HTMLElememtNameList[i]);
- }
- ElementInit();
-
- /*
- var PDFcanvasElement = Object.create(HTMLCanvasElement.prototype);
- PDFcanvasElement.createdCallback = function()
- {
-
- };
- var PDFcanvasImage = window.registerElement('pdf-canvas', { prototype: HTMLElementList, extends: 'canvas' });
- */
-
- // Create a class for the element
- /*class PDFcanvasElement extends HTMLCanvasElement {
- createdCallback() {
- this.PROXYcontext=new ProxyContext(this.getContext("2d"));
- this.getContext=function()
- {
- return this.PROXYcontext;
- };
- }
- }*/
- /*
- const { createElement: originalCreateElement } = document;
- document.createElement = function createElement(...args) {
- // function fetch() { [native code] }
- console.log("ele call intercepted:", ...args);
- return originalCreateElement(...args);
- };
- */
-
- //customElements.define("pdf-canvas", PDFcanvasElement, { extends: "canvas" });
-
- /*let MYcreateElement=deepClone(document.createElement);*/
-
- function SpecialCare(elem,tagName)
- {
- if(tagName=="canvas")
- {
- elem.PROXYcontext=new ProxyContext(elem.getContext("2d"));
- elem.getContext=function()
- {
- return this.PROXYcontext;
- };
- console.log(elem);
- }
- Object.defineProperty(elem, "innerHTML", {
- set: function (str) {
- var telem=HTMLElementList[HTMLElememtNameList.indexOf(tagName)].cloneNode();
- telem.innerHTML=str;
-
- //process the special cares.
- let child=telem.firstChild;
- while(child)
- {
- //console.log(child.nodeName);
- SpecialCare(child,child.nodeName.toLowerCase());
- child=child.nextSibling;
- }
-
- while (this.firstChild) {
- this.removeChild(elem.lastChild);
- }
- this.appendChild(telem);
- //console.log(str);
- },
- });
- }
-
- document.createElement = function (tagName, className, parent) {
- //console.log(tagName,className,parent);
- tagName=tagName.toLowerCase();
- var elem,agent=0;
-
- //check the element create by this user js
- if(tagName == "tcanvas")
- {
- agent=1,tagName="canvas";
- }
- else if(tagName == "tdiv")
- {
- agent=1,tagName="div";
- }
-
- //create
- if(HTMLElememtNameList.indexOf(tagName)>-1){
- elem=HTMLElementList[HTMLElememtNameList.indexOf(tagName)].cloneNode();
-
- }
- else
- {
- alert("PDFexporter Error! New element registered by the page. To be finished. ");
- console.log(tagName);
- elem=_documentcreateElement(tagName);
- }
-
- //spcial care
- if(agent==0)
- {
- SpecialCare(elem,tagName);
- }
-
- if (className) {
- elem.className = className || '';
- }
- if (parent) {
- parent.appendChild(elem);
- }
- //console.log(elem);
- return elem;
- }
- //
- // you may need https://github.com/lisonge/Disable-CSP
-
- //HTMLCanvasElement.prototype.createdCallback=(){};
-
-
-