dompdf.js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +566 -0
  2. package/LICENSE +22 -0
  3. package/README.md +155 -0
  4. package/README_CN.md +305 -0
  5. package/dist/__tests__/index.d.ts +1 -0
  6. package/dist/core/__mocks__/cache-storage.d.ts +2 -0
  7. package/dist/core/__mocks__/context.d.ts +9 -0
  8. package/dist/core/__mocks__/features.d.ts +8 -0
  9. package/dist/core/__mocks__/logger.d.ts +9 -0
  10. package/dist/core/__tests__/cache-storage.d.ts +1 -0
  11. package/dist/core/__tests__/logger.d.ts +1 -0
  12. package/dist/core/bitwise.d.ts +1 -0
  13. package/dist/core/cache-storage.d.ts +26 -0
  14. package/dist/core/context.d.ts +15 -0
  15. package/dist/core/debugger.d.ts +8 -0
  16. package/dist/core/features.d.ts +12 -0
  17. package/dist/core/logger.d.ts +18 -0
  18. package/dist/core/util.d.ts +1 -0
  19. package/dist/css/IPropertyDescriptor.d.ts +36 -0
  20. package/dist/css/ITypeDescriptor.d.ts +6 -0
  21. package/dist/css/index.d.ts +132 -0
  22. package/dist/css/layout/__mocks__/bounds.d.ts +2 -0
  23. package/dist/css/layout/bounds.d.ts +14 -0
  24. package/dist/css/layout/text.d.ts +10 -0
  25. package/dist/css/property-descriptors/__tests__/background-tests.d.ts +1 -0
  26. package/dist/css/property-descriptors/__tests__/font-family.d.ts +1 -0
  27. package/dist/css/property-descriptors/__tests__/paint-order.d.ts +1 -0
  28. package/dist/css/property-descriptors/__tests__/text-shadow.d.ts +1 -0
  29. package/dist/css/property-descriptors/__tests__/transform-tests.d.ts +1 -0
  30. package/dist/css/property-descriptors/background-clip.d.ts +8 -0
  31. package/dist/css/property-descriptors/background-color.d.ts +2 -0
  32. package/dist/css/property-descriptors/background-image.d.ts +3 -0
  33. package/dist/css/property-descriptors/background-origin.d.ts +8 -0
  34. package/dist/css/property-descriptors/background-position.d.ts +5 -0
  35. package/dist/css/property-descriptors/background-repeat.d.ts +9 -0
  36. package/dist/css/property-descriptors/background-size.d.ts +11 -0
  37. package/dist/css/property-descriptors/border-color.d.ts +5 -0
  38. package/dist/css/property-descriptors/border-radius.d.ts +7 -0
  39. package/dist/css/property-descriptors/border-style.d.ts +12 -0
  40. package/dist/css/property-descriptors/border-width.d.ts +5 -0
  41. package/dist/css/property-descriptors/box-shadow.d.ts +14 -0
  42. package/dist/css/property-descriptors/color.d.ts +2 -0
  43. package/dist/css/property-descriptors/content.d.ts +4 -0
  44. package/dist/css/property-descriptors/counter-increment.d.ts +7 -0
  45. package/dist/css/property-descriptors/counter-reset.d.ts +7 -0
  46. package/dist/css/property-descriptors/direction.d.ts +6 -0
  47. package/dist/css/property-descriptors/display.d.ts +35 -0
  48. package/dist/css/property-descriptors/duration.d.ts +2 -0
  49. package/dist/css/property-descriptors/float.d.ts +9 -0
  50. package/dist/css/property-descriptors/font-family.d.ts +4 -0
  51. package/dist/css/property-descriptors/font-size.d.ts +2 -0
  52. package/dist/css/property-descriptors/font-style.d.ts +7 -0
  53. package/dist/css/property-descriptors/font-variant.d.ts +2 -0
  54. package/dist/css/property-descriptors/font-weight.d.ts +2 -0
  55. package/dist/css/property-descriptors/letter-spacing.d.ts +2 -0
  56. package/dist/css/property-descriptors/line-break.d.ts +6 -0
  57. package/dist/css/property-descriptors/line-height.d.ts +4 -0
  58. package/dist/css/property-descriptors/list-style-image.d.ts +3 -0
  59. package/dist/css/property-descriptors/list-style-position.d.ts +6 -0
  60. package/dist/css/property-descriptors/list-style-type.d.ts +58 -0
  61. package/dist/css/property-descriptors/margin.d.ts +5 -0
  62. package/dist/css/property-descriptors/opacity.d.ts +2 -0
  63. package/dist/css/property-descriptors/overflow-wrap.d.ts +6 -0
  64. package/dist/css/property-descriptors/overflow.d.ts +9 -0
  65. package/dist/css/property-descriptors/padding.d.ts +5 -0
  66. package/dist/css/property-descriptors/paint-order.d.ts +8 -0
  67. package/dist/css/property-descriptors/position.d.ts +9 -0
  68. package/dist/css/property-descriptors/quotes.d.ts +8 -0
  69. package/dist/css/property-descriptors/text-align.d.ts +7 -0
  70. package/dist/css/property-descriptors/text-decoration-color.d.ts +2 -0
  71. package/dist/css/property-descriptors/text-decoration-line.d.ts +10 -0
  72. package/dist/css/property-descriptors/text-shadow.d.ts +12 -0
  73. package/dist/css/property-descriptors/text-transform.d.ts +8 -0
  74. package/dist/css/property-descriptors/transform-origin.d.ts +4 -0
  75. package/dist/css/property-descriptors/transform.d.ts +4 -0
  76. package/dist/css/property-descriptors/visibility.d.ts +7 -0
  77. package/dist/css/property-descriptors/webkit-text-stroke-color.d.ts +2 -0
  78. package/dist/css/property-descriptors/webkit-text-stroke-width.d.ts +2 -0
  79. package/dist/css/property-descriptors/word-break.d.ts +7 -0
  80. package/dist/css/property-descriptors/z-index.d.ts +7 -0
  81. package/dist/css/syntax/__tests__/tokernizer-tests.d.ts +1 -0
  82. package/dist/css/syntax/parser.d.ts +34 -0
  83. package/dist/css/syntax/tokenizer.d.ts +94 -0
  84. package/dist/css/types/__tests__/color-tests.d.ts +1 -0
  85. package/dist/css/types/__tests__/image-tests.d.ts +1 -0
  86. package/dist/css/types/angle.d.ts +7 -0
  87. package/dist/css/types/color.d.ts +11 -0
  88. package/dist/css/types/functions/-prefix-linear-gradient.d.ts +4 -0
  89. package/dist/css/types/functions/-prefix-radial-gradient.d.ts +4 -0
  90. package/dist/css/types/functions/-webkit-gradient.d.ts +4 -0
  91. package/dist/css/types/functions/__tests__/radial-gradient.d.ts +1 -0
  92. package/dist/css/types/functions/counter.d.ts +10 -0
  93. package/dist/css/types/functions/gradient.d.ts +7 -0
  94. package/dist/css/types/functions/linear-gradient.d.ts +4 -0
  95. package/dist/css/types/functions/radial-gradient.d.ts +12 -0
  96. package/dist/css/types/image.d.ts +54 -0
  97. package/dist/css/types/index.d.ts +1 -0
  98. package/dist/css/types/length-percentage.d.ts +11 -0
  99. package/dist/css/types/length.d.ts +4 -0
  100. package/dist/css/types/time.d.ts +2 -0
  101. package/dist/dom/__mocks__/document-cloner.d.ts +6 -0
  102. package/dist/dom/document-cloner.d.ts +45 -0
  103. package/dist/dom/element-container.d.ts +21 -0
  104. package/dist/dom/elements/li-element-container.d.ts +6 -0
  105. package/dist/dom/elements/ol-element-container.d.ts +7 -0
  106. package/dist/dom/elements/select-element-container.d.ts +6 -0
  107. package/dist/dom/elements/textarea-element-container.d.ts +6 -0
  108. package/dist/dom/node-parser.d.ts +23 -0
  109. package/dist/dom/replaced-elements/canvas-element-container.d.ts +8 -0
  110. package/dist/dom/replaced-elements/iframe-element-container.d.ts +11 -0
  111. package/dist/dom/replaced-elements/image-element-container.d.ts +8 -0
  112. package/dist/dom/replaced-elements/index.d.ts +4 -0
  113. package/dist/dom/replaced-elements/input-element-container.d.ts +12 -0
  114. package/dist/dom/replaced-elements/svg-element-container.d.ts +8 -0
  115. package/dist/dom/text-container.d.ts +8 -0
  116. package/dist/dompdf.esm.js +33182 -0
  117. package/dist/dompdf.esm.js.map +1 -0
  118. package/dist/dompdf.js +33190 -0
  119. package/dist/dompdf.js.map +1 -0
  120. package/dist/index.d.ts +18 -0
  121. package/dist/invariant.d.ts +1 -0
  122. package/dist/render/background.d.ts +16 -0
  123. package/dist/render/bezier-curve.d.ts +14 -0
  124. package/dist/render/border.d.ts +6 -0
  125. package/dist/render/bound-curves.d.ts +32 -0
  126. package/dist/render/box-sizing.d.ts +4 -0
  127. package/dist/render/canvas/canvas-renderer2.d.ts +81 -0
  128. package/dist/render/canvas/foreignobject-renderer.d.ts +11 -0
  129. package/dist/render/canvas/pdf-renderer.d.ts +82 -0
  130. package/dist/render/effects.d.ts +38 -0
  131. package/dist/render/font-metrics.d.ts +11 -0
  132. package/dist/render/path.d.ts +13 -0
  133. package/dist/render/renderer.d.ts +7 -0
  134. package/dist/render/stacking-context.d.ts +24 -0
  135. package/dist/render/vector.d.ts +9 -0
  136. package/html2pdf-userscript.js +936 -0
  137. package/package.json +134 -0
  138. package/tsconfig.json +23 -0
  139. package/userscript.js +372 -0
  140. package/webpack.base.js +31 -0
  141. package/webpack.dev.js +21 -0
package/package.json ADDED
@@ -0,0 +1,134 @@
1
+ {
2
+ "title": "dompdf.js",
3
+ "name": "dompdf.js",
4
+ "description": "HTML to PDF",
5
+ "main": "dist/dompdf.js",
6
+ "module": "dist/dompdf.esm.js",
7
+ "typings": "dist/types/index.d.ts",
8
+ "browser": "dist/dompdf.js",
9
+ "version": "1.0.0",
10
+ "author": {
11
+ "name": "lfc",
12
+ "email": "lfc191910@gmail.com",
13
+ "url": "https://hertzen.com"
14
+ },
15
+ "engines": {
16
+ "node": ">=8.0.0"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git@github.com:lmn1919/dompdf.js.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/lmn1919/dompdf.js/issues"
24
+ },
25
+ "devDependencies": {
26
+ "@babel/cli": "^7.4.3",
27
+ "@babel/core": "^7.4.3",
28
+ "@babel/preset-env": "^7.4.3",
29
+ "@babel/preset-flow": "^7.0.0",
30
+ "@rollup/plugin-commonjs": "^19.0.0",
31
+ "@rollup/plugin-json": "^4.1.0",
32
+ "@rollup/plugin-node-resolve": "^13.0.0",
33
+ "@rollup/plugin-typescript": "^8.2.1",
34
+ "@types/chai": "^4.1.7",
35
+ "@types/express": "^4.17.13",
36
+ "@types/glob": "^7.1.1",
37
+ "@types/jest": "^26.0.24",
38
+ "@types/jest-image-snapshot": "^4.3.1",
39
+ "@types/karma": "^6.3.0",
40
+ "@types/mocha": "^8.2.3",
41
+ "@types/node": "^16.3.1",
42
+ "@types/platform": "^1.3.4",
43
+ "@types/promise-polyfill": "^6.0.3",
44
+ "@typescript-eslint/eslint-plugin": "^4.28.2",
45
+ "@typescript-eslint/parser": "^4.28.2",
46
+ "@webpack-cli/serve": "^2.0.1",
47
+ "appium-ios-simulator": "^3.10.0",
48
+ "babel-eslint": "^10.0.1",
49
+ "babel-loader": "^8.0.5",
50
+ "babel-plugin-add-module-exports": "^1.0.2",
51
+ "babel-plugin-dev-expression": "^0.2.1",
52
+ "base64-arraybuffer": "1.0.1",
53
+ "body-parser": "^1.19.0",
54
+ "chai": "4.1.1",
55
+ "chromeless": "^1.5.2",
56
+ "cors": "^2.8.5",
57
+ "es6-promise": "^4.2.8",
58
+ "eslint": "^7.30.0",
59
+ "eslint-config-prettier": "^8.3.0",
60
+ "eslint-plugin-prettier": "3.4.0",
61
+ "express": "^4.17.1",
62
+ "filenamify-url": "1.0.0",
63
+ "glob": "7.1.3",
64
+ "html2canvas-proxy": "1.0.1",
65
+ "jest": "^27.0.6",
66
+ "jest-image-snapshot": "^4.5.1",
67
+ "jquery": "^3.5.1",
68
+ "js-polyfills": "^0.1.42",
69
+ "karma": "^6.3.2",
70
+ "karma-chrome-launcher": "^3.1.0",
71
+ "karma-edge-launcher": "^0.4.2",
72
+ "karma-firefox-launcher": "^2.1.0",
73
+ "karma-ie-launcher": "^1.0.0",
74
+ "karma-junit-reporter": "^2.0.1",
75
+ "karma-mocha": "^2.0.1",
76
+ "karma-safarinative-launcher": "^1.1.0",
77
+ "karma-sauce-launcher": "^2.0.2",
78
+ "mkdirp": "^3.0.1",
79
+ "mocha": "^9.0.2",
80
+ "node-simctl": "^5.3.0",
81
+ "platform": "^1.3.6",
82
+ "prettier": "^2.3.2",
83
+ "replace-in-file": "^3.0.0",
84
+ "rimraf": "^3.0.2",
85
+ "rollup": "^2.53.1",
86
+ "rollup-plugin-livereload": "^2.0.5",
87
+ "rollup-plugin-serve": "^2.0.2",
88
+ "rollup-plugin-sourcemaps": "^0.6.3",
89
+ "serve-index": "^1.9.1",
90
+ "slash": "1.0.0",
91
+ "standard-version": "^8.0.2",
92
+ "ts-jest": "^27.0.3",
93
+ "ts-loader": "^8.3.0",
94
+ "ts-node": "^10.1.0",
95
+ "tslib": "^2.3.0",
96
+ "typescript": "^4.3.5",
97
+ "uglify-js": "^3.13.10",
98
+ "uglifyjs-webpack-plugin": "^2.2.0",
99
+ "webpack": "^5.75.0",
100
+ "webpack-cli": "^5.0.1",
101
+ "webpack-dev-server": "^4.11.1",
102
+ "yargs": "^17.0.1"
103
+ },
104
+ "scripts": {
105
+ "prebuild": "rimraf dist/ && rimraf build/ && mkdirp dist && mkdirp build",
106
+ "build": "tsc --module commonjs && rollup -c rollup.config.ts && npm run build:create-reftest-list && npm run build:testrunner && npm run build:minify",
107
+ "build:testrunner": "rollup -c tests/rollup.config.ts",
108
+ "build:minify": "uglifyjs --compress --comments /^!/ -o dist/html2canvas.min.js --mangle -- dist/html2canvas.js",
109
+ "build:reftest-result-list": "ts-node scripts/create-reftest-result-list.ts",
110
+ "build:create-reftest-list": "ts-node scripts/create-reftest-list.ts tests/reftests/ignore.txt build/reftests.ts",
111
+ "build:reftest-preview": "webpack --config www/webpack.config.js",
112
+ "release": "standard-version",
113
+ "format": "prettier --write \"{src,www/src,tests,scripts}/**/*.ts\"",
114
+ "lint": "eslint src/**/*.ts --max-warnings 0",
115
+ "test": "npm run lint && npm run unittest && npm run karma",
116
+ "unittest": "jest",
117
+ "reftests-diff": "mkdirp tmp/snapshots && jest --roots=tests --testMatch=**/reftest-diff.ts",
118
+ "karma": "ts-node tests/karma",
119
+ "watch": "npx rollup -c rollup.config.ts -w",
120
+ "watch:unittest": "mocha --require ts-node/register --watch-extensions ts -w src/**/__tests__/*.ts",
121
+ "start": "ts-node tests/server --port=8080 --cors=8081",
122
+ "dev": "webpack serve --config webpack.dev.js --open"
123
+ },
124
+ "homepage": "https://html2canvas.hertzen.com",
125
+ "license": "MIT",
126
+ "dependencies": {
127
+ "@zumer/snapdom": "^1.8.0",
128
+ "css-line-break": "^2.1.0",
129
+ "fontkit": "^2.0.4",
130
+ "jspdf": "^2.5.2",
131
+ "svg2pdf.js": "^2.5.0",
132
+ "text-segmentation": "^1.0.3"
133
+ }
134
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "noImplicitAny": true,
4
+ "noImplicitThis": true,
5
+ "noUnusedLocals": true,
6
+ "noUnusedParameters": true,
7
+ "strictNullChecks": true,
8
+ "strictPropertyInitialization": true,
9
+ "types": ["node", "jest"],
10
+ "target": "es5",
11
+ "lib": ["es2015", "dom"],
12
+ "sourceMap": true,
13
+ "outDir": "dist/lib",
14
+ "declaration": true,
15
+ "declarationDir": "dist/types",
16
+ "resolveJsonModule": true,
17
+ "moduleResolution": "node"
18
+ },
19
+ "include": [
20
+ "src"
21
+ ],
22
+
23
+ }
package/userscript.js ADDED
@@ -0,0 +1,372 @@
1
+ // ==UserScript==
2
+ // @name HTML2PDF 网页元素转PDF
3
+ // @namespace http://tampermonkey.net/
4
+ // @version 1.0
5
+ // @description 在任意网站添加按钮,选择页面元素并生成PDF
6
+ // @author You
7
+ // @match *://*/*
8
+ // @grant none
9
+ // @require file:///D:/project-code/html2pdf/dist/html2pdf.js
10
+ // @require file:///D:/project-code/html2pdf/examples/SourceHanSansSC-Normal-Min-normal.js
11
+ // ==/UserScript==
12
+
13
+ (function () {
14
+ 'use strict';
15
+
16
+ // 全局变量
17
+ let isSelecting = false;
18
+ let selectedElement = null;
19
+ let overlay = null;
20
+ let controlPanel = null;
21
+
22
+ // 创建控制面板
23
+ function createControlPanel() {
24
+ const panel = document.createElement('div');
25
+ panel.id = 'html2pdf-control-panel';
26
+ panel.style.cssText = `
27
+ position: fixed;
28
+ top: 20px;
29
+ right: 20px;
30
+ z-index: 10000;
31
+ background: #fff;
32
+ border: 2px solid #007cba;
33
+ border-radius: 8px;
34
+ padding: 15px;
35
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
36
+ font-family: Arial, sans-serif;
37
+ min-width: 200px;
38
+ `;
39
+
40
+ panel.innerHTML = `
41
+ <div style="margin-bottom: 10px; font-weight: bold; color: #333;">HTML2PDF 工具</div>
42
+ <button id="select-element-btn" style="
43
+ width: 100%;
44
+ padding: 8px 12px;
45
+ margin-bottom: 8px;
46
+ background: #007cba;
47
+ color: white;
48
+ border: none;
49
+ border-radius: 4px;
50
+ cursor: pointer;
51
+ font-size: 14px;
52
+ ">选择元素</button>
53
+ <button id="generate-pdf-btn" style="
54
+ width: 100%;
55
+ padding: 8px 12px;
56
+ margin-bottom: 8px;
57
+ background: #28a745;
58
+ color: white;
59
+ border: none;
60
+ border-radius: 4px;
61
+ cursor: pointer;
62
+ font-size: 14px;
63
+ opacity: 0.5;
64
+ margin-left:0
65
+ " disabled>生成PDF</button>
66
+ <button id="close-panel-btn" style="
67
+ width: 100%;
68
+ padding: 6px 12px;
69
+ background: #dc3545;
70
+ color: white;
71
+ border: none;
72
+ border-radius: 4px;
73
+ cursor: pointer;
74
+ font-size: 12px;
75
+ margin - left: 0
76
+ ">关闭</button>
77
+ <div id="selected-info" style="
78
+ margin-top: 10px;
79
+ padding: 8px;
80
+ background: #f8f9fa;
81
+ border-radius: 4px;
82
+ font-size: 12px;
83
+ color: #666;
84
+ display: none;
85
+ "></div>
86
+ `;
87
+
88
+ document.body.appendChild(panel);
89
+ return panel;
90
+ }
91
+
92
+ // 创建选择覆盖层
93
+ function createOverlay() {
94
+ const overlay = document.createElement('div');
95
+ overlay.id = 'html2pdf-overlay';
96
+ overlay.style.cssText = `
97
+ position: fixed;
98
+ top: 0;
99
+ left: 0;
100
+ width: 100%;
101
+ height: 100%;
102
+ background: rgba(0, 123, 186, 0.1);
103
+ z-index: 9999;
104
+ cursor: crosshair;
105
+ pointer-events: none;
106
+ `;
107
+ document.body.appendChild(overlay);
108
+ return overlay;
109
+ }
110
+
111
+ // 高亮元素
112
+ function highlightElement(element) {
113
+ // 移除之前的高亮
114
+ const prevHighlight = document.querySelector('.html2pdf-highlight');
115
+ if (prevHighlight) {
116
+ prevHighlight.classList.remove('html2pdf-highlight');
117
+ }
118
+
119
+ // 添加高亮样式
120
+ if (element && element !== document.body) {
121
+ element.classList.add('html2pdf-highlight');
122
+
123
+ // 添加高亮CSS
124
+ if (!document.querySelector('#html2pdf-highlight-style')) {
125
+ const style = document.createElement('style');
126
+ style.id = 'html2pdf-highlight-style';
127
+ style.textContent = `
128
+ .html2pdf-highlight {
129
+ outline: 3px solid #007cba !important;
130
+ outline-offset: 2px !important;
131
+
132
+ }
133
+ `;
134
+ document.head.appendChild(style);
135
+ }
136
+ }
137
+ }
138
+
139
+ // 开始选择模式
140
+ function startSelection() {
141
+ isSelecting = true;
142
+ overlay = createOverlay();
143
+ document.body.style.cursor = 'crosshair';
144
+
145
+ // 更新按钮状态
146
+ const selectBtn = document.getElementById('select-element-btn');
147
+ selectBtn.textContent = '取消选择';
148
+ selectBtn.style.background = '#dc3545';
149
+
150
+ // 添加事件监听
151
+ document.addEventListener('mouseover', onMouseOver);
152
+ document.addEventListener('click', onElementClick);
153
+ document.addEventListener('keydown', onKeyDown);
154
+ }
155
+
156
+ // 停止选择模式
157
+ function stopSelection() {
158
+ isSelecting = false;
159
+ document.body.style.cursor = '';
160
+
161
+ if (overlay) {
162
+ overlay.remove();
163
+ overlay = null;
164
+ }
165
+
166
+ // 更新按钮状态
167
+ const selectBtn = document.getElementById('select-element-btn');
168
+ selectBtn.textContent = '选择元素';
169
+ selectBtn.style.background = '#007cba';
170
+
171
+ // 移除事件监听
172
+ document.removeEventListener('mouseover', onMouseOver);
173
+ document.removeEventListener('click', onElementClick);
174
+ document.removeEventListener('keydown', onKeyDown);
175
+ }
176
+
177
+ // 鼠标悬停事件
178
+ function onMouseOver(e) {
179
+ if (!isSelecting) return;
180
+ e.preventDefault();
181
+
182
+ const element = e.target;
183
+ if (element !== controlPanel && !controlPanel.contains(element)) {
184
+ highlightElement(element);
185
+ }
186
+ }
187
+
188
+ // 元素点击事件
189
+ function onElementClick(e) {
190
+ if (!isSelecting) return;
191
+ e.preventDefault();
192
+ e.stopPropagation();
193
+
194
+ const element = e.target;
195
+ if (element !== controlPanel && !controlPanel.contains(element)) {
196
+ selectedElement = element;
197
+ stopSelection();
198
+ updateSelectedInfo(element);
199
+ enablePdfGeneration();
200
+ }
201
+ }
202
+
203
+ // 键盘事件(ESC取消选择)
204
+ function onKeyDown(e) {
205
+ if (e.key === 'Escape' && isSelecting) {
206
+ stopSelection();
207
+ }
208
+ }
209
+
210
+ // 更新选中元素信息
211
+ function updateSelectedInfo(element) {
212
+ const info = document.getElementById('selected-info');
213
+ const tagName = element.tagName.toLowerCase();
214
+ const className = element.className ? `.${element.className.split(' ').join('.')}` : '';
215
+ const id = element.id ? `#${element.id}` : '';
216
+
217
+ info.innerHTML = `
218
+ <strong>已选择元素:</strong><br>
219
+ 标签: ${tagName}${id}${className}<br>
220
+ 尺寸: ${element.offsetWidth} × ${element.offsetHeight}px
221
+ `;
222
+ info.style.display = 'block';
223
+ }
224
+
225
+ // 启用PDF生成按钮
226
+ function enablePdfGeneration() {
227
+ const pdfBtn = document.getElementById('generate-pdf-btn');
228
+ pdfBtn.disabled = false;
229
+ pdfBtn.style.opacity = '1';
230
+ }
231
+
232
+ // 生成PDF
233
+ async function generatePDF() {
234
+ if (!selectedElement) {
235
+ alert('请先选择要转换的元素');
236
+ return;
237
+ }
238
+
239
+ try {
240
+ // 显示加载状态
241
+ const pdfBtn = document.getElementById('generate-pdf-btn');
242
+ const originalText = pdfBtn.textContent;
243
+ pdfBtn.textContent = '生成中...';
244
+ pdfBtn.disabled = true;
245
+
246
+ // 使用html2canvas截图
247
+ html2pdf(selectedElement, {
248
+ useCORS: true,
249
+ scale: 1,
250
+ fontConfig: {
251
+ fontFamily: 'SourceHanSansCN-Medium',
252
+ fontBase64: window.fontBase64, //
253
+ fontUrl: '',
254
+ fontWeight: 400,
255
+ fontStyle: 'normal'
256
+ },
257
+ }).then(function (canvas) {
258
+ const link = document.createElement('a');
259
+ link.download = 'output.png';
260
+ link.href = canvas.toDataURL('image/png');
261
+ link.click();
262
+ // 恢复按钮状态
263
+ pdfBtn.textContent = originalText;
264
+ pdfBtn.disabled = false;
265
+
266
+ alert('PDF生成成功!');
267
+ }).catch(function (err) {
268
+ console.log('creacterr', err);
269
+
270
+ });;
271
+
272
+
273
+
274
+
275
+
276
+ } catch (error) {
277
+ console.error('PDF生成失败:', error);
278
+ alert('PDF生成失败,请检查控制台错误信息');
279
+
280
+ // 恢复按钮状态
281
+ const pdfBtn = document.getElementById('generate-pdf-btn');
282
+ pdfBtn.textContent = '生成PDF';
283
+ pdfBtn.disabled = false;
284
+ }
285
+ }
286
+
287
+ // 关闭面板
288
+ function closePanel() {
289
+ if (isSelecting) {
290
+ stopSelection();
291
+ }
292
+
293
+ // 移除高亮
294
+ const highlight = document.querySelector('.html2pdf-highlight');
295
+ if (highlight) {
296
+ highlight.classList.remove('html2pdf-highlight');
297
+ }
298
+
299
+ // 移除样式
300
+ const style = document.querySelector('#html2pdf-highlight-style');
301
+ if (style) {
302
+ style.remove();
303
+ }
304
+
305
+ // 移除面板
306
+ if (controlPanel) {
307
+ controlPanel.remove();
308
+ controlPanel = null;
309
+ }
310
+
311
+ selectedElement = null;
312
+ }
313
+
314
+ // 初始化
315
+ function init() {
316
+ // 等待页面加载完成
317
+ if (document.readyState === 'loading') {
318
+ document.addEventListener('DOMContentLoaded', init);
319
+ return;
320
+ }
321
+
322
+ // 创建控制面板
323
+ controlPanel = createControlPanel();
324
+
325
+ // 绑定事件
326
+ document.getElementById('select-element-btn').addEventListener('click', () => {
327
+ if (isSelecting) {
328
+ stopSelection();
329
+ } else {
330
+ startSelection();
331
+ }
332
+ });
333
+
334
+ document.getElementById('generate-pdf-btn').addEventListener('click', generatePDF);
335
+ document.getElementById('close-panel-btn').addEventListener('click', closePanel);
336
+
337
+ // 让面板可拖拽
338
+ let isDragging = false;
339
+ let dragOffset = {
340
+ x: 0,
341
+ y: 0
342
+ };
343
+
344
+ controlPanel.addEventListener('mousedown', (e) => {
345
+ if (e.target.tagName !== 'BUTTON') {
346
+ isDragging = true;
347
+ dragOffset.x = e.clientX - controlPanel.offsetLeft;
348
+ dragOffset.y = e.clientY - controlPanel.offsetTop;
349
+ controlPanel.style.cursor = 'move';
350
+ }
351
+ });
352
+
353
+ document.addEventListener('mousemove', (e) => {
354
+ if (isDragging) {
355
+ controlPanel.style.left = (e.clientX - dragOffset.x) + 'px';
356
+ controlPanel.style.top = (e.clientY - dragOffset.y) + 'px';
357
+ controlPanel.style.right = 'auto';
358
+ }
359
+ });
360
+
361
+ document.addEventListener('mouseup', () => {
362
+ isDragging = false;
363
+ controlPanel.style.cursor = '';
364
+ });
365
+
366
+ console.log('HTML2PDF 用户脚本已加载');
367
+ }
368
+
369
+ // 启动脚本
370
+ init();
371
+
372
+ })();
@@ -0,0 +1,31 @@
1
+ const path = require('path');
2
+
3
+ const rootDir = process.cwd();
4
+
5
+ module.exports = {
6
+ entry: path.resolve(rootDir, 'src/index.ts'),
7
+ output: {
8
+ path: path.resolve(rootDir, 'dist'),
9
+ filename: 'bundle.[contenthash:8].js',
10
+ },
11
+ module: {
12
+ rules: [
13
+ {
14
+ test: /\.(jsx|js)$/,
15
+ use: 'babel-loader',
16
+ include: path.resolve(rootDir, 'src'),
17
+ exclude: /node_modules/,
18
+ },
19
+ { test: /\.tsx?$/, use: ["ts-loader"], exclude: /node_modules/ }
20
+ ]
21
+ },
22
+ plugins: [
23
+ // new HtmlWebpackPlugin({
24
+ // template: path.resolve(rootDir, 'public/test.ejs'),
25
+ // inject: 'body',
26
+ // scriptLoading: 'blocking',
27
+ // }),
28
+ // new CleanWebpackPlugin(),
29
+ // new ClassToStyleWebpackPlugin({outFileName:"buildInfo"})
30
+ ],
31
+ }
package/webpack.dev.js ADDED
@@ -0,0 +1,21 @@
1
+ const { merge } = require('webpack-merge');
2
+ const baseConfig = require('./webpack.base');
3
+
4
+ module.exports = merge(baseConfig, {
5
+ mode: 'development',
6
+ devtool: 'eval-cheap-module-source-map',
7
+ devServer: {
8
+ port: '4000', // 默认是 8080
9
+ hot: true,
10
+ // stats: 'errors-only', // 终端仅打印 error
11
+ compress: true, // 是否启用 gzip 压缩
12
+ proxy: {
13
+ '/api': {
14
+ target: 'http://0.0.0.0:80',
15
+ pathRewrite: {
16
+ '/api': '',
17
+ },
18
+ },
19
+ },
20
+ },
21
+ });