page2pdf_server 1.0.0 → 1.0.2

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.
@@ -1,41 +1,41 @@
1
- module.exports = {
2
- apps: [
3
- {
4
- name: '<app-name>',
5
- script: 'dist/src/index.js',
6
- // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/
7
- exec_mode: 'cluster',
8
- instances: 2,
9
- kill_timeout: 5000,
10
- autorestart: true,
11
- max_restarts: 10,
12
- watch: true,
13
- watch_options: {
14
- followSymlinks: false,
15
- },
16
- max_memory_restart: '1G',
17
- env: {
18
- NODE_ENV: 'development',
19
- },
20
- env_production: {
21
- NODE_ENV: 'production',
22
- port: 8080,
23
- },
24
- merge_logs: true,
25
- log_date_format: 'YYYY-MM-DDTHH:mm:ss.sssZ',
26
- },
27
- ],
28
- // https://pm2.keymetrics.io/docs/usage/deployment/
29
- deploy: {
30
- production: {
31
- key: process.env.EC2_PEM_PATH,
32
- host: process.env.EC2_HOST,
33
- user: 'ubuntu',
34
- ref: 'origin/main',
35
- repo: 'git@github.com:<username>/<repo-name>.git',
36
- path: '/home/ubuntu',
37
- 'post-deploy':
38
- 'yarn && yarn clean && yarn build && pm2 startOrRestart ecosystem.config.js --env production && pm2 set pm2:autodump true && pm2 save',
39
- },
40
- },
41
- };
1
+ module.exports = {
2
+ apps: [
3
+ {
4
+ name: '<app-name>',
5
+ script: 'dist/src/index.js',
6
+ // Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/
7
+ exec_mode: 'cluster',
8
+ instances: 2,
9
+ kill_timeout: 5000,
10
+ autorestart: true,
11
+ max_restarts: 10,
12
+ watch: true,
13
+ watch_options: {
14
+ followSymlinks: false,
15
+ },
16
+ max_memory_restart: '1G',
17
+ env: {
18
+ NODE_ENV: 'development',
19
+ },
20
+ env_production: {
21
+ NODE_ENV: 'production',
22
+ port: 8080,
23
+ },
24
+ merge_logs: true,
25
+ log_date_format: 'YYYY-MM-DDTHH:mm:ss.sssZ',
26
+ },
27
+ ],
28
+ // https://pm2.keymetrics.io/docs/usage/deployment/
29
+ deploy: {
30
+ production: {
31
+ key: process.env.EC2_PEM_PATH,
32
+ host: process.env.EC2_HOST,
33
+ user: 'ubuntu',
34
+ ref: 'origin/main',
35
+ repo: 'git@github.com:<username>/<repo-name>.git',
36
+ path: '/home/ubuntu',
37
+ 'post-deploy':
38
+ 'yarn && yarn clean && yarn build && pm2 startOrRestart ecosystem.config.js --env production && pm2 set pm2:autodump true && pm2 save',
39
+ },
40
+ },
41
+ };
package/jest.config.js CHANGED
@@ -1,35 +1,35 @@
1
- const { defaults: tsjPreset } = require("ts-jest/presets");
2
-
3
- module.exports = {
4
- preset: "ts-jest",
5
- moduleFileExtensions: ["ts", "js", "json"],
6
- transform: {
7
- "^.+\\.(ts|tsx)$": [
8
- "ts-jest",
9
- {
10
- tsconfig: "tsconfig.json",
11
- diagnostics: false,
12
- },
13
- ],
14
- ...tsjPreset.transform,
15
- },
16
- testPathIgnorePatterns: ["dist"],
17
- testMatch: ["**/__tests__/**/*.test.(ts|js)"],
18
- testEnvironment: "node",
19
- moduleNameMapper: {
20
- "@/(.*)": "<rootDir>/src/$1",
21
- },
22
- watchPlugins: [
23
- "jest-watch-typeahead/filename",
24
- "jest-watch-typeahead/testname",
25
- ],
26
- coverageThreshold: {
27
- global: {
28
- branches: 1,
29
- functions: 1,
30
- lines: 1,
31
- statements: 1,
32
- },
33
- },
34
- coverageReporters: ["json", "lcov", "text", "clover"],
35
- };
1
+ const { defaults: tsjPreset } = require("ts-jest/presets");
2
+
3
+ module.exports = {
4
+ preset: "ts-jest",
5
+ moduleFileExtensions: ["ts", "js", "json"],
6
+ transform: {
7
+ "^.+\\.(ts|tsx)$": [
8
+ "ts-jest",
9
+ {
10
+ tsconfig: "tsconfig.json",
11
+ diagnostics: false,
12
+ },
13
+ ],
14
+ ...tsjPreset.transform,
15
+ },
16
+ testPathIgnorePatterns: ["dist"],
17
+ testMatch: ["**/__tests__/**/*.test.(ts|js)"],
18
+ testEnvironment: "node",
19
+ moduleNameMapper: {
20
+ "@/(.*)": "<rootDir>/src/$1",
21
+ },
22
+ watchPlugins: [
23
+ "jest-watch-typeahead/filename",
24
+ "jest-watch-typeahead/testname",
25
+ ],
26
+ coverageThreshold: {
27
+ global: {
28
+ branches: 1,
29
+ functions: 1,
30
+ lines: 1,
31
+ statements: 1,
32
+ },
33
+ },
34
+ coverageReporters: ["json", "lcov", "text", "clover"],
35
+ };
package/nodemon.json CHANGED
@@ -1,6 +1,6 @@
1
- {
2
- "watch": ["src/**/*.ts", ".env"],
3
- "ext": "ts,js,.env",
4
- "verbose": false,
5
- "exec": "ts-node -r tsconfig-paths/register --files src/index.ts"
6
- }
1
+ {
2
+ "watch": ["src/**/*.ts", ".env"],
3
+ "ext": "ts,js,.env",
4
+ "verbose": false,
5
+ "exec": "ts-node -r tsconfig-paths/register --files src/index.ts"
6
+ }
package/package.json CHANGED
@@ -1,105 +1,104 @@
1
- {
2
- "name": "page2pdf_server",
3
- "version": "1.0.0",
4
- "description": "文书打印转换器",
5
- "private": false,
6
- "authors": "herzhang",
7
- "repository": "https://gitee.com/heerzhang/page2pdf-server",
8
- "license": "MIT",
9
- "scripts": {
10
- "yarn": "yarn",
11
- "yarn命令行": "yarn add nodemon -D",
12
- "注意2": "运行prettify来修复代码,免去到处是标记红色的,太严格了",
13
- "prettify": "prettier --write \"src/**/*.{ts,js,json}\" \"__tests__/**/*.{ts,js,json}\"",
14
- "start": "NODE_ENV=development run-s prettify lint & nodemon",
15
- "build": "cross-env NODE_ENV=production run-s prettify clean transpile",
16
- "lint": "eslint 'src/**/*.{ts,js}' '__tests__/**/*.{ts,js}'",
17
- "lint:fix": "eslint --fix 'src/**/*.{ts,js}' '__tests__/**/*.{ts,js}' --quiet",
18
- "有些隐藏错误": "需要运行watch才发现",
19
- "watch": "tsc --watch",
20
- "clean": "rimraf dist",
21
- "test": "cross-env NODE_ENV=test jest --coverage --runInBand --detectOpenHandles",
22
- "单步调试": "不必运行test,直接到__test__目录文件直接挑选修改测试项并调试",
23
- "test:watchAll": "cross-env NODE_ENV=test jest --watchAll --runInBand --detectOpenHandles",
24
- "transpile": "tsc",
25
- "service:start": "pm2 start ecosystem.config.js",
26
- "service:reload": "pm2 reload ecosystem.config.js",
27
- "service:startup": "pm2 startup",
28
- "service:stop": "pm2 stop ecosystem.config.js",
29
- "service:list": "pm2 list ecosystem.config.js",
30
- "service:delete": "pm2 delete ecosystem.config.js",
31
- "service:logs": "pm2 logs",
32
- "hook主动运行": "操作系统缘故,将单引号改成双引号,加转义符,提交代码会自动执行;git提交给它勾掉吧,yarn会自动运行prepare",
33
- "prepare": "husky install"
34
- },
35
- "keywords": [
36
- "dynamic page pdf generator",
37
- "html to pdf",
38
- "app url to pdf",
39
- "pdf generation",
40
- "node.js",
41
- "express",
42
- "print",
43
- "server"
44
- ],
45
- "dependencies": {
46
- "bcrypt": "^5.1.0",
47
- "chrome-remote-interface": "^0.32.2",
48
- "config": "^3.3.9",
49
- "connect-timeout": "^1.9.0",
50
- "cors": "^2.8.5",
51
- "cross-env": "^7.0.3",
52
- "dotenv": "^16.3.1",
53
- "express": "^4.18.2",
54
- "express-pino-logger": "^7.0.0",
55
- "express-validator": "^7.0.1",
56
- "helmet": "^7.0.0",
57
- "http-status": "^1.6.2",
58
- "jsonwebtoken": "^9.0.0",
59
- "lodash-es": "^4.17.21",
60
- "morgan": "^1.10.0",
61
- "pdf-lib": "^1.17.1",
62
- "pino-http": "^8.3.3",
63
- "pino-pretty": "^10.0.0",
64
- "rimraf": "^5.0.1",
65
- "save-dev": "^0.0.1-security"
66
- },
67
- "devDependencies": {
68
- "@babel/preset-env": "^7.22.5",
69
- "@babel/preset-typescript": "^7.22.5",
70
- "@types/bcrypt": "^5.0.0",
71
- "@types/connect-timeout": "^0.0.37",
72
- "@types/cors": "^2.8.13",
73
- "@types/express": "^4.17.17",
74
- "@types/express-pino-logger": "^4.0.3",
75
- "@types/jest": "^29.5.2",
76
- "@types/jsonwebtoken": "^9.0.2",
77
- "@types/lodash-es": "^4.17.7",
78
- "@types/module-alias": "^2.0.1",
79
- "@types/morgan": "^1.9.4",
80
- "@types/node": "^20.3.1",
81
- "@types/supertest": "^2.0.12",
82
- "@typescript-eslint/eslint-plugin": "^5.59.11",
83
- "@typescript-eslint/parser": "^5.59.11",
84
- "eslint": "^8.43.0",
85
- "eslint-config-prettier": "^8.8.0",
86
- "eslint-plugin-import": "^2.27.5",
87
- "eslint-plugin-prettier": "^4.2.1",
88
- "husky": "^8.0.3",
89
- "jest": "^29.5.0",
90
- "jest-watch-typeahead": "^2.2.2",
91
- "module-alias": "^2.2.3",
92
- "nodemon": "^3.0.1",
93
- "npm-run-all": "^4.1.5",
94
- "pm2": "^5.3.0",
95
- "prettier": "^2.8.8",
96
- "supertest": "^6.3.3",
97
- "ts-jest": "^29.1.0",
98
- "ts-node": "^10.9.1",
99
- "tsconfig-paths": "^4.2.0",
100
- "typescript": "^5.1.6"
101
- },
102
- "engines": {
103
- "node": ">= 18.0.0"
104
- }
105
- }
1
+ {
2
+ "name": "page2pdf_server",
3
+ "version": "1.0.2",
4
+ "description": "文书打印转换器",
5
+ "private": false,
6
+ "authors": "herzhang",
7
+ "repository": "https://gitee.com/heerzhang/page2pdf-server",
8
+ "license": "MIT",
9
+ "scripts": {
10
+ "yarn": "yarn",
11
+ "yarn命令行": "yarn add nodemon -D",
12
+ "注意2": "运行prettify来修复代码,免去到处是标记红色的,太严格了",
13
+ "prettify": "prettier --write \"src/**/*.{ts,js,json}\" \"__tests__/**/*.{ts,js,json}\"",
14
+ "start": "NODE_ENV=development run-s prettify lint & nodemon",
15
+ "build": "cross-env NODE_ENV=production run-s prettify clean transpile",
16
+ "lint": "eslint 'src/**/*.{ts,js}' '__tests__/**/*.{ts,js}'",
17
+ "lint:fix": "eslint --fix 'src/**/*.{ts,js}' '__tests__/**/*.{ts,js}' --quiet",
18
+ "有些隐藏错误": "需要运行watch才发现",
19
+ "watch": "tsc --watch",
20
+ "clean": "rimraf dist",
21
+ "test": "cross-env NODE_ENV=test jest --coverage --runInBand --detectOpenHandles",
22
+ "单步调试": "不必运行test,直接到__test__目录文件直接挑选修改测试项并调试",
23
+ "test:watchAll": "cross-env NODE_ENV=test jest --watchAll --runInBand --detectOpenHandles",
24
+ "transpile": "tsc",
25
+ "service:start": "pm2 start ecosystem.config.js",
26
+ "service:reload": "pm2 reload ecosystem.config.js",
27
+ "service:startup": "pm2 startup",
28
+ "service:stop": "pm2 stop ecosystem.config.js",
29
+ "service:list": "pm2 list ecosystem.config.js",
30
+ "service:delete": "pm2 delete ecosystem.config.js",
31
+ "service:logs": "pm2 logs",
32
+ "hook主动运行": "操作系统缘故,将单引号改成双引号,加转义符,提交代码会自动执行;git提交给它勾掉吧,yarn会自动运行prepare",
33
+ "prepare": "husky install"
34
+ },
35
+ "keywords": [
36
+ "dynamic page pdf generator",
37
+ "html to pdf",
38
+ "app url to pdf",
39
+ "pdf generation",
40
+ "node.js",
41
+ "express",
42
+ "print",
43
+ "server"
44
+ ],
45
+ "dependencies": {
46
+ "chrome-remote-interface": "^0.32.2",
47
+ "config": "^3.3.9",
48
+ "connect-timeout": "^1.9.0",
49
+ "cors": "^2.8.5",
50
+ "cross-env": "^7.0.3",
51
+ "dotenv": "^16.3.1",
52
+ "express": "^4.18.2",
53
+ "express-pino-logger": "^7.0.0",
54
+ "express-validator": "^7.0.1",
55
+ "helmet": "^7.0.0",
56
+ "http-status": "^1.6.2",
57
+ "jsonwebtoken": "^9.0.0",
58
+ "lodash-es": "^4.17.21",
59
+ "morgan": "^1.10.0",
60
+ "pdf-lib": "^1.17.1",
61
+ "pino-http": "^8.3.3",
62
+ "pino-pretty": "^10.0.0",
63
+ "rimraf": "^5.0.1",
64
+ "save-dev": "^0.0.1-security"
65
+ },
66
+ "devDependencies": {
67
+ "@babel/preset-env": "^7.22.5",
68
+ "@babel/preset-typescript": "^7.22.5",
69
+ "@types/bcrypt": "^5.0.0",
70
+ "@types/connect-timeout": "^0.0.37",
71
+ "@types/cors": "^2.8.13",
72
+ "@types/express": "^4.17.17",
73
+ "@types/express-pino-logger": "^4.0.3",
74
+ "@types/jest": "^29.5.2",
75
+ "@types/jsonwebtoken": "^9.0.2",
76
+ "@types/lodash-es": "^4.17.7",
77
+ "@types/module-alias": "^2.0.1",
78
+ "@types/morgan": "^1.9.4",
79
+ "@types/node": "^20.3.1",
80
+ "@types/supertest": "^2.0.12",
81
+ "@typescript-eslint/eslint-plugin": "^5.59.11",
82
+ "@typescript-eslint/parser": "^5.59.11",
83
+ "eslint": "^8.43.0",
84
+ "eslint-config-prettier": "^8.8.0",
85
+ "eslint-plugin-import": "^2.27.5",
86
+ "eslint-plugin-prettier": "^4.2.1",
87
+ "husky": "^8.0.3",
88
+ "jest": "^29.5.0",
89
+ "jest-watch-typeahead": "^2.2.2",
90
+ "module-alias": "^2.2.3",
91
+ "nodemon": "^3.0.1",
92
+ "npm-run-all": "^4.1.5",
93
+ "pm2": "^5.3.0",
94
+ "prettier": "^2.8.8",
95
+ "supertest": "^6.3.3",
96
+ "ts-jest": "^29.1.0",
97
+ "ts-node": "^10.9.1",
98
+ "tsconfig-paths": "^4.2.0",
99
+ "typescript": "^5.1.6"
100
+ },
101
+ "engines": {
102
+ "node": ">= 18.0.0"
103
+ }
104
+ }
package/src/app.ts CHANGED
@@ -39,3 +39,5 @@ export const createApp = (): express.Application => {
39
39
 
40
40
  return app;
41
41
  };
42
+
43
+ //【CDP文档】 https://chromedevtools.github.io/devtools-protocol/tot/Target/
@@ -1,5 +1,5 @@
1
1
  import { OK } from "http-status/lib";
2
- import { ConfigRoot, FileTransform, HeadFooter } from "@/types/request/home";
2
+ import { ConfigRoot, FileTransform, HeadFooter } from "@/types/request/config";
3
3
  import { apiResponse } from "@/helpers/apiResponse";
4
4
  import { RenderPDF } from "@/utils/pdfgen";
5
5
  import CONFIG from "@/configEnv";
@@ -1,6 +1,6 @@
1
1
  import fs from "fs";
2
2
  import { OK } from "http-status/lib";
3
- import { ConfigRoot, FileTransform, HeadFooter } from "@/types/request/home";
3
+ import { ConfigRoot, FileTransform, HeadFooter } from "@/types/request/config";
4
4
  import { apiResponse } from "@/helpers/apiResponse";
5
5
 
6
6
  import { RenderPDF } from "@/utils/pdfgen";
@@ -0,0 +1,160 @@
1
+ /**一次作业的模型配置;
2
+ * 若本对象为空{}的话:默认是按照修改时间的顺序简易模式地合并当前工作目录的所有pdf文件。
3
+ * 若某个URL不正常的,很可能无法触发页面加载完成,导致作业一致无法继续下去,大大超出预期执行时间。URL对应网页若不是一次性加载完成还会陆陆续续修改内容的就是这种情况造成死等长时间没结果。
4
+ * */
5
+ export interface ConfigRoot<T> {
6
+ //是否生成合并的pdf:正常情况下, 默认=true进行files输出pdf全部做合并的。 除非files[]也是空的情形。
7
+ //但若需对任一个URL叠加新页眉页脚的,merge就不能=false的。
8
+ merge?: boolean;
9
+ //重定义 合并的pdf文件名, 否则默认名。不需要加 .pdf结尾的
10
+ name: string;
11
+ //双面打印的合并输出pdf, 默认=true, 表示合并输出的pdf考虑到双面打印的页眉页脚的布局差异化情况了。
12
+ doubleSide?: boolean;
13
+ //统一一整份应该用的页眉页脚
14
+ //假如files[]里面有些url自己也定义了lay{localSumNo=false}的页眉页脚输出配置,只能忽略掉它们,页码总数不算他们的,页码连续编号也不算它们的占坑:最好都挪到最后面。
15
+ lay?: HeadFooter;
16
+ //每一个独立的pdf生成:
17
+ files: [T];
18
+
19
+ //共用一个浏览器窗口 默认=true
20
+ singleTab?: boolean;
21
+ //自动关闭浏览器窗口 默认=false
22
+ closeTab?: boolean;
23
+
24
+ //下面这5个参数不是前端配置发送过来的,而是lay{}对象预先进行转换后保存的汇总页眉页脚,只能内部使用,并非外部接口参数!Page.printToPDF需要的。
25
+ headerTemplate?: string;
26
+ footerTemplate?: string;
27
+ headerTemplateL?: string;
28
+ footerTemplateL?: string;
29
+ //第二阶段页眉页脚生成的浏览器执行窗口的targetId,不可配置。
30
+ CDPtab?: string;
31
+ }
32
+
33
+ /**等待输出的每个独立文件:URL,这些文件可能要合并。
34
+ * @前提条件 是:每个url独立文件生成的PDF,它的纸张大小必须保证同一个大小尺寸, size: 必须唯一,但是纸张方向在某些约束条件中可以横屏竖屏混合的。
35
+ * 物理打印机:纸张适配,横竖方向还好能自动调节,size 真实打印纸张尺寸就不好自动处理, 不一样的尺寸?最好拆解pdf。
36
+ * 标准纸张大小的:静态html内CSS定义横竖纸张方向混合的:用reverseRanges参数设置部分纸张反转纸张方向,pageRanges=''的前提下:配置比如'1-5, 8, 11-13'和landscape参数设置相反方向。
37
+ * */
38
+ export interface FileTransform {
39
+ //[必须配置的] 特殊的前缀是 http:// https:// 没有这俩个的都是本地工作目录的文件全名(含文件类型后缀 *.pdf *.*)。
40
+ //任意的本地文件类型,只要可以被Chrome装载并能够支持打印预览的都可以。http打头的网页必须确保已经登录了,也就是遗留cockies token,不能要求交互登录。本地文件不能要求输入口令。
41
+ //不支持*.xls *.doc文件;不支持的格式实际在浏览器拖拽窗口后会蜕变成了下载形式的。被加密的文件必须提前解密,网站登录需提前解决。
42
+ //【特殊问题】若URL网页动态化太离谱,周期性地不间断地更新页面,没法触发加载结束事件的,只能手动在浏览器查看打印另存pdf,然后把手动生成pdf合并进来。Tab切换会主动刷新的也不触发。
43
+ url: string;
44
+ //输出本地工作目录的文件名, 不需要加 .pdf结尾的 【注意】如果out为空表示url是pdf的没必要转换的要直接进入合并步骤。
45
+ //【特别】必须配置唯一性 的本地 工作目录的文件名,同名的被直接覆盖了。
46
+ out: string;
47
+
48
+ //是否汇总合并阶段省略本url,不合并进去,那就是单独独立的pdf输出了。默认=true是合并进去。 和是否打印页眉页脚或页眉统计页数没有绝对关系的。
49
+ merge?: boolean;
50
+
51
+ //默认取值都是=true; 第一阶段不会生成页眉页脚的,汇总第二阶段这个参数才会生效!
52
+ //这里配置displayHeaderFooter优先级最高。
53
+ //页眉页脚如何分开控制是否打印的: 可以把lay{head,foot}其中一个配置串给设置为null,null就代表不输出。例如head=null就不输出页眉,但是页脚照旧打印的。本url的配置优先于汇总pdf配置。
54
+ //若ConfigRoot<T>.merge=false那么必然导致FileTransform.merge强制=false,每个独立pdf页码独立的独立都从1开始编号吗还需要打印吗,页眉页脚需要打印吗?这个情况页眉页脚打印的默认值改成false;
55
+ displayHeaderFooter: boolean;
56
+
57
+ //【特别注意】frNo 可能和 headFrom 配置矛盾。
58
+ //本url打印:从第几页才开始页眉页脚的打印,#页码同样也是在这之后才可能计数和编号!。默认值headFrom=1:就是第一页就开始打印页眉页脚的。
59
+ //书本封面页情况的。这个参数有最高优先级。 【注意】和frNo设置相互影响, 没有页眉页脚就失去页码意义了。若真的违反了可能页码不能连续输出的,被隐藏了页码缘故。
60
+ headFrom?: number;
61
+ //本url打印后,从本URL输出的第几页开始才进行的页码序号的顺序输出的,前面几页不打印页码(但是页眉页脚要打印)。默认值=1全部都打页码。若frNo=0全部不打页码的。
62
+ //假如displayHeaderFooter=false也即页码无法显示出来的情况:请申明frNo=0; 不然默认是连续页码的,不打印的也有占用页码的隐藏的连续数字啊。
63
+ //注意若有配置 headFrom 的要协调好。
64
+ frNo?: number;
65
+
66
+ //是否对页码支持连续编号: Continuous numbering 是跟随汇总合并的页码 基数合计。【注意】本配置单个url范围,单个url不能混合本地页码和全局页面两种!
67
+ //统计页数是否本URL独立自己范围之内进行的汇总计数。比如书本目录有多页的可以独立统计页码序号以及总页数的。默认=false;
68
+ localSumNo?: boolean;
69
+ //本url对应的部分应该用的页眉页脚,覆盖掉合并pdf的相对应设置。页面上只能支持输出一次页眉页脚,不重叠做输出。
70
+ //若lay{localSumNo=false}只能固定支持本url自己内部的页码统计顺序编号,不考虑合并pdf总页数带来的影响的。 还是?预设其它部分的页数统计总数之后?再做偏移页码编写?
71
+ lay: PartHeadFooter;
72
+ //前端声明本url在第一阶段打印输出后,生成的pdf应该有几页。 count没有设置的救不会做异常检查的。不是第二阶段的计数:双面情况可能增加空白页
73
+ count?: number;
74
+ //双面打印的 默认=true, 表示独立分开输出的pdf文件的:考虑到双面打印的页眉页脚的布局差异化情况了。
75
+ //合并输出merge=true的情况:该参数无效,要看汇总配置的哪一个 # ConfigRoot<T>{ doubleSide: }字段。
76
+ doubleSide: boolean;
77
+ //双面打印的情形:必须确保本URL的第一个页是正好右手边(书本翻页的奇数号页码)开始的位置页。正常第一个URL首页面就是双面打印的右手边位置页;默认值=false不必确保.
78
+ rightHand: boolean;
79
+
80
+ //页码是罗马数字;论文目录需要的;默认=false阿拉伯数字。"I","II","III","IV","V","VI","VII","VIII","IX" "X"XI"XII"表盘符号
81
+ //roman只能针对本URL启用;数字转换范围最大支持1到12,超过了便改阿拉伯数字,且只针对pageNumber有效, totalPages不会采用。
82
+ roman?: boolean;
83
+
84
+ //下面这5个参数不是前端配置发送过来的,而是lay{}对象预先进行转换后保存的汇总页眉页脚,只能内部使用,并非外部接口参数!Page.printToPDF需要的。
85
+ headerTemplate?: string;
86
+ footerTemplate?: string;
87
+ headerTemplateL?: string;
88
+ footerTemplateL?: string;
89
+ //第一阶段Url转pdf的浏览器执行窗口的targetId,不可配置。
90
+ CDPtab?: string;
91
+ }
92
+
93
+ /*看 Page.printToPDF()文档说明的: 可以使用的注入参数:
94
+ date: formatted print date
95
+ title: document title
96
+ url: document location
97
+ pageNumber: current page number
98
+ totalPages: total pages in the document
99
+ For example, <span class=title></span> would generate span containing the title.
100
+ */
101
+
102
+ /**页眉页脚声明;前提条件是页眉页脚htm描述里面:不应该把-NOT_DISPLAY- ${pageNumber} ${totalPages}这三个保留字字符串当作普通文字输出的。
103
+ * 前端发送数据包时刻,页眉页脚的脚本需要在 HTML转JSON 工具网站 进行转换处理后的;网站地址 https://uutool.cn/html2json/ 转换htm模板后是数组[string]
104
+ * 实际上也就进行拆分多行字符串拼接数组,还有把html语法中的 ""引号 进行转义 style="position: 变成 style=\\\"position: 处置的。
105
+ * */
106
+ export interface HeadFooter {
107
+ //每一个URL独立设置的 页眉 的 : 若是配置值=null 表示不要打印本页眉: 针对本url。
108
+ //双面打印:右手边位置的,或单面打印使用
109
+ head?: string | string[] | null;
110
+ //每一个页 页脚的
111
+ //每一个URL独立设置的 页脚的 : 若是配置值=null 表示不要打印本页脚的, 针对本url。
112
+ //双面打印:右手边位置的,或单面打印使用
113
+ foot?: string | string[] | null; //实际前端发过来却是[string]的也可以啊。
114
+ /**可注入3个参数"特殊标记字符串"如下: 服务端依据参数来对注入的html进行修改的。
115
+ * ${pageNumber}
116
+ * ${totalPages}
117
+ * -NOT_DISPLAY-
118
+ * 这三个分别代表 页码 总页数 以及页码<div style=""></div>中的可替代占位位置。-NOT_DISPLAY-在后端要直接替代成display:none;的CSS标记字符串!其它2个替换成数字号码。
119
+ * */
120
+ //双面打印:左手边位置的
121
+ headL?: string | string[] | null;
122
+ //双面打印:左手边位置的
123
+ footL?: string | string[] | null;
124
+ }
125
+
126
+ /**实际在第二步骤也即汇总阶段:页眉页脚的生成底下的参数size,landscape,reverseRanges,marginLeft,marginRight几个都不会涉及到了。
127
+ * */
128
+ export interface PartHeadFooter extends HeadFooter {
129
+ //纸张大小: 纸张大小尺寸+布局方向是自定义系列的:
130
+ //a5 a4 a3 b5 b4 jis-b5 jis-b4 letter legal ledger auto 等常见的名字, 默认是 "a4 portrait"
131
+ //中国:默认值改成是 a4 portrait
132
+ size: string;
133
+ //W3C标准纸张大小,横着的吗; 但是非标准尺寸的#自定义的没有这个选择参数的!。 默认是 "portrait"
134
+ landscape: boolean;
135
+ //背景, 默认 =false
136
+ printBackground: boolean;
137
+
138
+ //底下的这四个参数默认都=1cm (~0.4 inches); 若要做配置的必须是英寸为单位的数字, 【单位 注意】
139
+ marginTop?: number;
140
+ marginBottom?: number;
141
+ //就算纸张是横屏的:Chrome生成页眉页脚的位置实际也没牵涉到marginLeft,marginRight;
142
+ marginLeft?: number;
143
+ marginRight?: number;
144
+ //默认全部打印的,#可自定义部分页面输出的。 Paper ranges to print, one based, e.g., '1-5, 8, 11-13'.
145
+ pageRanges?: string;
146
+ }
147
+
148
+ /**配置自定义地非标准纸张尺寸, 横竖纸张要独立配置。
149
+ * */
150
+ export interface MyPaperSize {
151
+ //自定义的尺寸名称 ,前端发送数据包时用这个名字 替换通常的 a4 a5 a3等,纸张横的竖的要定义两个标签。
152
+ name: string;
153
+ //W3C @page size{}语境中配的描述串。 如下:"4in 6in", 前面4英寸宽度的纸张。
154
+ //{"name":"D8", "css": "4in 6in","w": 4,"h": 6},
155
+ css: string;
156
+ //纸张 4 英寸宽度 "w": 4,
157
+ w: number;
158
+ //纸张高度: 英寸单位的,必须和css参数确保一致性。
159
+ h: number;
160
+ }