page2pdf_server 1.1.0 → 1.1.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.
Files changed (39) hide show
  1. package/.babelrc +3 -3
  2. package/.eslintrc +32 -32
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +28 -28
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +15 -15
  5. package/.github/ISSUE_TEMPLATE/refactoring.md +15 -15
  6. package/.github/PULL_REQUEST_TEMPLATE.md +18 -18
  7. package/.github/stale.yml +17 -17
  8. package/.github/workflows/cd.yml +75 -75
  9. package/.github/workflows/ci.yml +36 -36
  10. package/.prettierrc +8 -8
  11. package/.vscode/settings.json +3 -3
  12. package/LICENSE +17 -17
  13. package/README.md +6 -1
  14. package/ecosystem.config.js +41 -41
  15. package/jest.config.js +35 -35
  16. package/nodemon.json +6 -6
  17. package/package.json +23 -15
  18. package/src/__tests__/UrltoPdf/generatePdf.test.d.ts +1 -0
  19. package/{__tests__ → src/__tests__}/UrltoPdf/generatePdf.test.ts +1 -1
  20. package/src/__tests__/UrltoPdf/pdfSplit.test.d.ts +1 -0
  21. package/{__tests__ → src/__tests__}/UrltoPdf/pdfSplit.test.ts +1 -1
  22. package/src/__tests__/helpers/index.d.ts +2 -0
  23. package/src/__tests__/home.test.d.ts +1 -0
  24. package/{__tests__ → src/__tests__}/home.test.ts +1 -1
  25. package/src/app.ts +1 -0
  26. package/src/components/home/controller.ts +7 -2
  27. package/src/components/home/pdfController.ts +8 -6
  28. package/src/components/home/splitController.ts +13 -7
  29. package/src/helpers/dataSanitizers.ts +3 -1
  30. package/src/helpers/loggers.ts +4 -2
  31. package/src/index.ts +2 -0
  32. package/src/types/request/config.ts +0 -95
  33. package/src/types.d.ts +97 -0
  34. package/src/utils/pdfgen.ts +3 -6
  35. package/tsconfig.json +44 -41
  36. package/tslint.json +22 -22
  37. package/.husky/pre-commit +0 -6
  38. package/.husky/pre-push +0 -4
  39. /package/{__tests__ → src/__tests__}/helpers/index.ts +0 -0
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,20 +1,26 @@
1
1
  {
2
2
  "name": "page2pdf_server",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "文书打印转换器",
5
5
  "private": false,
6
6
  "authors": "herzhang",
7
7
  "repository": "https://gitee.com/heerzhang/page2pdf-server",
8
8
  "license": "MIT",
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/types.d.ts",
9
11
  "scripts": {
10
12
  "yarn": "yarn",
11
13
  "yarn命令行": "yarn add nodemon -D",
12
14
  "注意2": "运行prettify来修复代码,免去到处是标记红色的,太严格了",
13
- "prettify": "prettier --write \"src/**/*.{ts,js,json}\" \"__tests__/**/*.{ts,js,json}\"",
15
+ "prettify": "prettier --write \"src/**/*.{ts,js,json}\" \"src/__tests__/**/*.{ts,js,json}\"",
14
16
  "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",
17
+ "build": "rimraf dist && tsc && rimraf dist/types && ncp src/types.d.ts dist/types",
18
+ "手动管理 .d.ts 文件的完整流程": "确保以下路径存源文件:src/types.d.ts 目标目录:dist/types/",
19
+ "build3": "rimraf dist && tsc --emitDeclarationOnly && dts-bundle --name 'types' --main dist/types/index.d.ts --out 'dist/types.d.ts'",
20
+ "build2": "rimraf dist && tsc --emitDeclarationOnly && ncp src/types.d.ts dist/types",
21
+ "build1": "cross-env NODE_ENV=production run-s prettify clean transpile",
22
+ "lint": "eslint 'src/**/*.{ts,js}' 'src/__tests__/**/*.{ts,js}'",
23
+ "lint:fix": "eslint --fix 'src/**/*.{ts,js}' 'src/__tests__/**/*.{ts,js}' --quiet",
18
24
  "有些隐藏错误": "需要运行watch才发现",
19
25
  "watch": "tsc --watch",
20
26
  "clean": "rimraf dist",
@@ -30,7 +36,7 @@
30
36
  "service:delete": "pm2 delete ecosystem.config.js",
31
37
  "service:logs": "pm2 logs",
32
38
  "hook主动运行": "操作系统缘故,将单引号改成双引号,加转义符,提交代码会自动执行;git提交给它勾掉吧,yarn会自动运行prepare",
33
- "prepare": "husky install"
39
+ "安装生产依赖在服务器上执行": "工程npm prune --production 然后目标机npm ci --only=production"
34
40
  },
35
41
  "keywords": [
36
42
  "dynamic page pdf generator",
@@ -43,10 +49,13 @@
43
49
  "server"
44
50
  ],
45
51
  "dependencies": {
46
- "chrome-remote-interface": "^0.32.2",
52
+ "@types/bcrypt": "^5.0.0",
53
+ "@types/cors": "^2.8.13",
54
+ "@types/express-pino-logger": "^4.0.3",
55
+ "@types/jsonwebtoken": "^9.0.2",
56
+ "chrome-remote-interface": "^0.33.3",
47
57
  "config": "^3.3.9",
48
58
  "connect-timeout": "^1.9.0",
49
- "@types/cors": "^2.8.13",
50
59
  "cors": "^2.8.5",
51
60
  "cross-env": "^7.0.3",
52
61
  "dotenv": "^16.3.1",
@@ -61,24 +70,22 @@
61
70
  "pdf-lib": "^1.17.1",
62
71
  "pino-http": "^8.3.3",
63
72
  "pino-pretty": "^10.0.0",
64
- "rimraf": "^5.0.1",
65
- "@types/node": "^20.3.1",
66
- "@types/jsonwebtoken": "^9.0.2",
67
- "@types/express": "^4.17.17",
68
- "@types/express-pino-logger": "^4.0.3",
69
- "@types/bcrypt": "^5.0.0",
73
+ "rimraf": "^6.0.1",
70
74
  "save-dev": "^0.0.1-security"
71
75
  },
72
76
  "devDependencies": {
73
77
  "@babel/preset-env": "^7.22.5",
74
78
  "@babel/preset-typescript": "^7.22.5",
75
79
  "@types/connect-timeout": "^0.0.37",
80
+ "@types/express": "^4.17.22",
76
81
  "@types/jest": "^29.5.2",
77
82
  "@types/lodash-es": "^4.17.7",
78
83
  "@types/morgan": "^1.9.4",
84
+ "@types/node": "^22.15.21",
79
85
  "@types/supertest": "^2.0.12",
80
86
  "@typescript-eslint/eslint-plugin": "^5.59.11",
81
87
  "@typescript-eslint/parser": "^5.59.11",
88
+ "dts-bundle": "^0.7.3",
82
89
  "eslint": "^8.43.0",
83
90
  "eslint-config-prettier": "^8.8.0",
84
91
  "eslint-plugin-import": "^2.27.5",
@@ -86,6 +93,7 @@
86
93
  "husky": "^8.0.3",
87
94
  "jest": "^29.5.0",
88
95
  "jest-watch-typeahead": "^2.2.2",
96
+ "ncp": "^2.0.0",
89
97
  "nodemon": "^3.0.1",
90
98
  "npm-run-all": "^4.1.5",
91
99
  "pm2": "^5.3.0",
@@ -94,7 +102,7 @@
94
102
  "ts-jest": "^29.1.0",
95
103
  "ts-node": "^10.9.1",
96
104
  "tsconfig-paths": "^4.2.0",
97
- "typescript": "^5.1.6"
105
+ "typescript": "^5.8.3"
98
106
  },
99
107
  "engines": {
100
108
  "node": ">= 20.0.0"
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { SuperAgentTest } from "supertest";
2
2
  import { OK } from "http-status/lib";
3
- import { initAgent } from "../helpers";
3
+ import { initAgent } from "../helpers/index";
4
4
 
5
5
  //prettify真叼: 每个地方都给您报出 红色
6
6
  const TIMEOUT = 260000; //设置超时,避免单步歇菜
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { SuperAgentTest } from "supertest";
2
2
  import { OK } from "http-status/lib";
3
- import { initAgent } from "../helpers";
3
+ import { initAgent } from "../helpers/index";
4
4
  // import CONFIG from "../../src/configEnv";
5
5
 
6
6
  //prettify真叼: 每个地方都给您报出 红色
@@ -0,0 +1,2 @@
1
+ import { SuperAgentTest } from "supertest";
2
+ export declare const initAgent: () => Promise<SuperAgentTest>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { SuperAgentTest } from "supertest";
2
2
  import HttpStatus, { OK, BAD_REQUEST } from "http-status/lib";
3
- import { initAgent } from "./helpers";
3
+ import { initAgent } from "./helpers/index";
4
4
  import CONFIG from "@/configEnv";
5
5
 
6
6
  //prettify真叼: 每个地方都给您报出 红色
package/src/app.ts CHANGED
@@ -30,6 +30,7 @@ export const createApp = (): express.Application => {
30
30
  app.use(expressPinoLogger());
31
31
  }
32
32
 
33
+ // @ts-ignore
33
34
  app.use(timeout(CONFIG.SERVER.TIMEOUT));
34
35
 
35
36
  // API Routes
@@ -1,7 +1,8 @@
1
1
  import { OK } from "http-status/lib";
2
- import { HomeServices } from "./services";
2
+ import { Request, Response, NextFunction } from "express";
3
3
  import { getAppInfoQuery } from "../../types/request/home";
4
4
  import { apiResponse } from "../../helpers/apiResponse";
5
+ import { HomeServices } from "./services";
5
6
 
6
7
  /**
7
8
  * 为何为了保证单步模式调试运行"test:watchAll": "cross-env NODE_ENV=development jest --watchAll --runInBand --detectOpenHandles",
@@ -13,7 +14,11 @@ export class HomeController {
13
14
  * @param {Req} req
14
15
  * @param {Res} res
15
16
  */
16
- static getAppInfo = async (req: Req, res: Res, next: NextFn) => {
17
+ static getAppInfo = async (
18
+ req: Request,
19
+ res: Response,
20
+ next: NextFunction,
21
+ ) => {
17
22
  try {
18
23
  const appInfoKey = req.query.key as getAppInfoQuery;
19
24
  const homeServices = new HomeServices();
@@ -1,12 +1,10 @@
1
1
  import { OK } from "http-status/lib";
2
- import {
3
- ConfigRoot,
4
- FileTransform,
5
- HeadFooter,
6
- } from "../../types/request/config";
2
+ import { NextFunction, Request, Response } from "express";
3
+ import { HeadFooter } from "../../types/request/config";
7
4
  import { apiResponse } from "../../helpers/apiResponse";
8
5
  import { RenderPDF } from "../../utils/pdfgen";
9
6
  import CONFIG from "../../configEnv";
7
+ import { ConfigRoot, FileTransform } from "../../types";
10
8
 
11
9
  export class PdfController {
12
10
  /** node.js对比前端App 太严格了,一点小毛病页不行啊。
@@ -16,7 +14,11 @@ export class PdfController {
16
14
  * 正常分解成两大步:task.files每一个文件生成,最后才是task.merge合并(包括页码生成)。
17
15
  * @param next
18
16
  */
19
- static postMakePdf = async (req: Req, res: Res, next: NextFn) => {
17
+ static postMakePdf = async (
18
+ req: Request,
19
+ res: Response,
20
+ next: NextFunction,
21
+ ) => {
20
22
  try {
21
23
  // const appInfoKey1 = req.query.key as getAppInfoQuery; 所有打印都走ConfigRoot配置包=task:可能有多个URL合并输出的。
22
24
  const task = req.body as ConfigRoot<FileTransform>;
@@ -1,15 +1,13 @@
1
1
  import fs from "fs";
2
2
  import { OK } from "http-status/lib";
3
- import {
4
- ConfigRoot,
5
- FileTransform,
6
- HeadFooter,
7
- } from "../../types/request/config";
3
+ import { NextFunction, Request, Response } from "express";
4
+ import { HeadFooter } from "../../types/request/config";
8
5
  import { apiResponse } from "../../helpers/apiResponse";
9
6
 
10
7
  import { RenderPDF } from "../../utils/pdfgen";
11
8
  import CONFIG from "../../configEnv";
12
9
  import { SplitConfig, SplitPdfFile } from "../../types/request/split";
10
+ import { ConfigRoot, FileTransform } from "../../types";
13
11
  // import CONFIG from "@/configEnv";
14
12
  // eslint-disable-next-line @typescript-eslint/no-var-requires
15
13
  const { PDFDocument } = require("pdf-lib");
@@ -27,7 +25,11 @@ export class SplitController {
27
25
  * @param next
28
26
  */
29
27
  //仅仅测试的
30
- static postMakePdf = async (req: Req, res: Res, next: NextFn) => {
28
+ static postMakePdf = async (
29
+ req: Request,
30
+ res: Response,
31
+ next: NextFunction,
32
+ ) => {
31
33
  try {
32
34
  // const appInfoKey1 = req.query.key as getAppInfoQuery;
33
35
  const task = req.body as ConfigRoot<FileTransform>;
@@ -76,7 +78,11 @@ export class SplitController {
76
78
  };
77
79
 
78
80
  /**拆分需要:支持pdf源文件的,抽取部分纸张页生成新文件*/
79
- static postSplitPdf = async (req: Req, res: Res, next: NextFn) => {
81
+ static postSplitPdf = async (
82
+ req: Request,
83
+ res: Response,
84
+ next: NextFunction,
85
+ ) => {
80
86
  try {
81
87
  //也可能?用CDP:printPDF()来进行部分打印的后保存,就等于拆分pdf;
82
88
  const task = req.body as SplitConfig;
@@ -1,12 +1,14 @@
1
1
  import { Result, ValidationChain, validationResult } from "express-validator";
2
+ // @ts-ignore
2
3
  import { Middleware as ValidatorMiddleware } from "express-validator/src/base";
4
+ import { NextFunction, Request, Response } from "express";
3
5
  import ValidationError from "./error/ValidationError";
4
6
 
5
7
  type MultiValidatorChain = ValidatorMiddleware & {
6
8
  run: (req: Request) => Promise<Result>;
7
9
  };
8
10
 
9
- const catchValidatorError = (req: Req, _: Res, next: NextFn): void => {
11
+ const catchValidatorError = (req: Request, _: Response, next: NextFunction): void => {
10
12
  const errors = validationResult(req);
11
13
  if (!errors.isEmpty()) {
12
14
  const validationErrors = errors
@@ -2,7 +2,7 @@ import httpStatus from "http-status/lib";
2
2
  import expressPino from "express-pino-logger";
3
3
  import { hidePassword } from "../utils/auth";
4
4
 
5
- const { OK, BAD_REQUEST, SERVER_ERROR } = httpStatus;
5
+ const { OK, BAD_REQUEST } = httpStatus;
6
6
 
7
7
  // More info: https://github.com/pinojs/express-pino-logger
8
8
  export const expressPinoLogger = () =>
@@ -28,10 +28,12 @@ export const expressPinoLogger = () =>
28
28
  customSuccessMessage(res) {
29
29
  const status = res.statusCode!;
30
30
  if (status >= 400 && status < 500) {
31
+ // @ts-ignore
31
32
  return `${status || BAD_REQUEST} : ${httpStatus[status || 400]}`;
32
33
  }
33
34
  if (status >= 500) {
34
- return `${status || SERVER_ERROR} : ${httpStatus[status || 500]}`;
35
+ // @ts-ignore
36
+ return `${status} : ${httpStatus[status || 500]}`;
35
37
  }
36
38
  return `${OK} : ${httpStatus[200].toUpperCase()}`;
37
39
  },
package/src/index.ts CHANGED
@@ -14,3 +14,5 @@ if (process.env.NODE_ENV !== "test") {
14
14
 
15
15
  //关键文档Chrome DevTools Protocol资料, https://chromedevtools.github.io/devtools-protocol/tot/Page
16
16
  export * from "./types/request/config";
17
+ export { FileTransform } from "./types";
18
+ export { ConfigRoot } from "./types";
@@ -1,98 +1,3 @@
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纯粹js网页动态布局的真实内容页数不一致的毛病。
90
- //开启的浏览器窗口宽度。默认最大化的。
91
- brwidth?: number;
92
- //第一阶段Url转pdf的浏览器执行窗口的targetId,不可配置。
93
- CDPtab?: string;
94
- }
95
-
96
1
  /*看 Page.printToPDF()文档说明的: 可以使用的注入参数:
97
2
  date: formatted print date
98
3
  title: document title
package/src/types.d.ts ADDED
@@ -0,0 +1,97 @@
1
+ import { HeadFooter, PartHeadFooter } from "@/types/request/config";
2
+
3
+ /**一次作业的模型配置;
4
+ * 若本对象为空{}的话:默认是按照修改时间的顺序简易模式地合并当前工作目录的所有pdf文件。
5
+ * 若某个URL不正常的,很可能无法触发页面加载完成,导致作业一致无法继续下去,大大超出预期执行时间。URL对应网页若不是一次性加载完成还会陆陆续续修改内容的就是这种情况造成死等长时间没结果。
6
+ * */
7
+ export interface ConfigRoot<T> {
8
+ //是否生成合并的pdf:正常情况下, 默认=true进行files输出pdf全部做合并的。 除非files[]也是空的情形。
9
+ //但若需对任一个URL叠加新页眉页脚的,merge就不能=false的。
10
+ merge?: boolean;
11
+ //重定义 合并的pdf文件名, 否则默认名。不需要加 .pdf结尾的
12
+ name: string;
13
+ //双面打印的合并输出pdf, 默认=true, 表示合并输出的pdf考虑到双面打印的页眉页脚的布局差异化情况了。
14
+ doubleSide?: boolean;
15
+ //统一一整份应该用的页眉页脚
16
+ //假如files[]里面有些url自己也定义了lay{localSumNo=false}的页眉页脚输出配置,只能忽略掉它们,页码总数不算他们的,页码连续编号也不算它们的占坑:最好都挪到最后面。
17
+ lay?: HeadFooter;
18
+ //每一个独立的pdf生成:
19
+ files: [T];
20
+
21
+ //共用一个浏览器窗口 默认=true
22
+ singleTab?: boolean;
23
+ //自动关闭浏览器窗口 默认=false
24
+ closeTab?: boolean;
25
+
26
+ //下面这5个参数不是前端配置发送过来的,而是lay{}对象预先进行转换后保存的汇总页眉页脚,只能内部使用,并非外部接口参数!Page.printToPDF需要的。
27
+ headerTemplate?: string;
28
+ footerTemplate?: string;
29
+ headerTemplateL?: string;
30
+ footerTemplateL?: string;
31
+ //第二阶段页眉页脚生成的浏览器执行窗口的targetId,不可配置。
32
+ CDPtab?: string;
33
+ }
34
+
35
+ // types.d.ts
36
+ /**等待输出的每个独立文件:URL,这些文件可能要合并。
37
+ * @前提条件 是:每个url独立文件生成的PDF,它的纸张大小必须保证同一个大小尺寸, size: 必须唯一,但是纸张方向在某些约束条件中可以横屏竖屏混合的。
38
+ * 物理打印机:纸张适配,横竖方向还好能自动调节,size 真实打印纸张尺寸就不好自动处理, 不一样的尺寸?最好拆解pdf。
39
+ * 标准纸张大小的:静态html内CSS定义横竖纸张方向混合的:用reverseRanges参数设置部分纸张反转纸张方向,pageRanges=''的前提下:配置比如'1-5, 8, 11-13'和landscape参数设置相反方向。
40
+ * */
41
+ export interface FileTransform {
42
+ //[必须配置的] 特殊的前缀是 http:// https:// 没有这俩个的都是本地工作目录的文件全名(含文件类型后缀 *.pdf *.*)。
43
+ //任意的本地文件类型,只要可以被Chrome装载并能够支持打印预览的都可以。http打头的网页必须确保已经登录了,也就是遗留cockies token,不能要求交互登录。本地文件不能要求输入口令。
44
+ //不支持*.xls *.doc文件;不支持的格式实际在浏览器拖拽窗口后会蜕变成了下载形式的。被加密的文件必须提前解密,网站登录需提前解决。
45
+ //【特殊问题】若URL网页动态化太离谱,周期性地不间断地更新页面,没法触发加载结束事件的,只能手动在浏览器查看打印另存pdf,然后把手动生成pdf合并进来。Tab切换会主动刷新的也不触发。
46
+ url: string;
47
+ //输出本地工作目录的文件名, 不需要加 .pdf结尾的 【注意】如果out为空表示url是pdf的没必要转换的要直接进入合并步骤。
48
+ //【特别】必须配置唯一性 的本地 工作目录的文件名,同名的被直接覆盖了。
49
+ out: string;
50
+
51
+ //是否汇总合并阶段省略本url,不合并进去,那就是单独独立的pdf输出了。默认=true是合并进去。 和是否打印页眉页脚或页眉统计页数没有绝对关系的。
52
+ merge?: boolean;
53
+
54
+ //默认取值都是=true; 第一阶段不会生成页眉页脚的,汇总第二阶段这个参数才会生效!
55
+ //这里配置displayHeaderFooter优先级最高。
56
+ //页眉页脚如何分开控制是否打印的: 可以把lay{head,foot}其中一个配置串给设置为null,null就代表不输出。例如head=null就不输出页眉,但是页脚照旧打印的。本url的配置优先于汇总pdf配置。
57
+ //若ConfigRoot<T>.merge=false那么必然导致FileTransform.merge强制=false,每个独立pdf页码独立的独立都从1开始编号吗还需要打印吗,页眉页脚需要打印吗?这个情况页眉页脚打印的默认值改成false;
58
+ displayHeaderFooter: boolean;
59
+
60
+ //【特别注意】frNo 可能和 headFrom 配置矛盾。
61
+ //本url打印:从第几页才开始页眉页脚的打印,#页码同样也是在这之后才可能计数和编号!。默认值headFrom=1:就是第一页就开始打印页眉页脚的。
62
+ //书本封面页情况的。这个参数有最高优先级。 【注意】和frNo设置相互影响, 没有页眉页脚就失去页码意义了。若真的违反了可能页码不能连续输出的,被隐藏了页码缘故。
63
+ headFrom?: number;
64
+ //本url打印后,从本URL输出的第几页开始才进行的页码序号的顺序输出的,前面几页不打印页码(但是页眉页脚要打印)。默认值=1全部都打页码。若frNo=0全部不打页码的。
65
+ //假如displayHeaderFooter=false也即页码无法显示出来的情况:请申明frNo=0; 不然默认是连续页码的,不打印的也有占用页码的隐藏的连续数字啊。
66
+ //注意若有配置 headFrom 的要协调好。
67
+ frNo?: number;
68
+
69
+ //是否对页码支持连续编号: Continuous numbering 是跟随汇总合并的页码 基数合计。【注意】本配置单个url范围,单个url不能混合本地页码和全局页面两种!
70
+ //统计页数是否本URL独立自己范围之内进行的汇总计数。比如书本目录有多页的可以独立统计页码序号以及总页数的。默认=false;
71
+ localSumNo?: boolean;
72
+ //本url对应的部分应该用的页眉页脚,覆盖掉合并pdf的相对应设置。页面上只能支持输出一次页眉页脚,不重叠做输出。
73
+ //若lay{localSumNo=false}只能固定支持本url自己内部的页码统计顺序编号,不考虑合并pdf总页数带来的影响的。 还是?预设其它部分的页数统计总数之后?再做偏移页码编写?
74
+ lay: PartHeadFooter;
75
+ //前端声明本url在第一阶段打印输出后,生成的pdf应该有几页。 count没有设置的救不会做异常检查的。不是第二阶段的计数:双面情况可能增加空白页
76
+ count?: number;
77
+ //双面打印的 默认=true, 表示独立分开输出的pdf文件的:考虑到双面打印的页眉页脚的布局差异化情况了。
78
+ //合并输出merge=true的情况:该参数无效,要看汇总配置的哪一个 # ConfigRoot<T>{ doubleSide: }字段。
79
+ doubleSide: boolean;
80
+ //双面打印的情形:必须确保本URL的第一个页是正好右手边(书本翻页的奇数号页码)开始的位置页。正常第一个URL首页面就是双面打印的右手边位置页;默认值=false不必确保.
81
+ rightHand: boolean;
82
+
83
+ //页码是罗马数字;论文目录需要的;默认=false阿拉伯数字。"I","II","III","IV","V","VI","VII","VIII","IX" "X"XI"XII"表盘符号
84
+ //roman只能针对本URL启用;数字转换范围最大支持1到12,超过了便改阿拉伯数字,且只针对pageNumber有效, totalPages不会采用。
85
+ roman?: boolean;
86
+
87
+ //下面这5个参数不是前端配置发送过来的,而是lay{}对象预先进行转换后保存的汇总页眉页脚,只能内部使用,并非外部接口参数!Page.printToPDF需要的。
88
+ headerTemplate?: string;
89
+ footerTemplate?: string;
90
+ headerTemplateL?: string;
91
+ footerTemplateL?: string;
92
+ //这针对:可能由于动态布局导致的浏览器打印预览和实际URL纯粹js网页动态布局的真实内容页数不一致的毛病。
93
+ //开启的浏览器窗口宽度。默认最大化的。
94
+ brwidth?: number;
95
+ //第一阶段Url转pdf的浏览器执行窗口的targetId,不可配置。
96
+ CDPtab?: string;
97
+ }
@@ -6,12 +6,9 @@ import _ from "lodash";
6
6
  // @ts-ignore
7
7
  import config from "config";
8
8
  import CONFIG from "../configEnv";
9
- import {
10
- ConfigRoot,
11
- FileTransform,
12
- MyPaperSize,
13
- } from "../types/request/config";
9
+ import { MyPaperSize } from "../types/request/config";
14
10
  import { filePathToUrl } from "../utils/url";
11
+ import { ConfigRoot, FileTransform } from "../types";
15
12
 
16
13
  //自定义纸张系列的:
17
14
  const paperSZs = config.get("size") as MyPaperSize[];
@@ -164,7 +161,7 @@ export class RenderPDF {
164
161
  url: url,
165
162
  //frameId: targetId, 不能加上: 本地pdf情形实际会有webview/iframe,实际会看到pdf之外的浏览控件框框的。
166
163
  });
167
- if (errorText) throw new Error(errorText); //若是访问失败应该抛异常的!
164
+ if (errorText) throw new Error(errorText + " URL=" + url); //若是访问失败应该抛异常的!
168
165
  frameId;
169
166
  await Emulation.setVirtualTimePolicy({
170
167
  policy: "pauseIfNetworkFetchesPending",