dompdf.js 1.0.4 → 1.1.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 (38) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/README.md +168 -79
  3. package/dist/dom/element-container.d.ts +4 -2
  4. package/dist/dompdf.esm.js +607 -455
  5. package/dist/dompdf.esm.js.map +1 -1
  6. package/dist/dompdf.js +607 -455
  7. package/dist/dompdf.js.map +1 -1
  8. package/dist/index.d.ts +1 -3
  9. package/dist/lib/__tests__/index.js.map +1 -1
  10. package/dist/lib/css/property-descriptors/border-style.js.map +1 -1
  11. package/dist/lib/css/types/color.js.map +1 -1
  12. package/dist/lib/dom/element-container.js +3 -1
  13. package/dist/lib/dom/element-container.js.map +1 -1
  14. package/dist/lib/dom/node-parser.js +15 -7
  15. package/dist/lib/dom/node-parser.js.map +1 -1
  16. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
  17. package/dist/lib/index.js +107 -42
  18. package/dist/lib/index.js.map +1 -1
  19. package/dist/lib/render/canvas/foreignobject-renderer.js.map +1 -1
  20. package/dist/lib/render/canvas/pdf-renderer.js +268 -464
  21. package/dist/lib/render/canvas/pdf-renderer.js.map +1 -1
  22. package/dist/lib/render/page-format-map.js +54 -0
  23. package/dist/lib/render/page-format-map.js.map +1 -0
  24. package/dist/lib/render/paginate.js +172 -0
  25. package/dist/lib/render/paginate.js.map +1 -0
  26. package/dist/render/canvas/pdf-renderer.d.ts +41 -16
  27. package/dist/render/page-format-map.d.ts +4 -0
  28. package/dist/render/paginate.d.ts +3 -0
  29. package/dist/types/dom/element-container.d.ts +4 -2
  30. package/dist/types/index.d.ts +1 -3
  31. package/dist/types/render/canvas/pdf-renderer.d.ts +41 -16
  32. package/dist/types/render/page-format-map.d.ts +4 -0
  33. package/dist/types/render/paginate.d.ts +3 -0
  34. package/package.json +3 -2
  35. package/dist/lib/render/canvas/canvas-renderer2.js +0 -1415
  36. package/dist/lib/render/canvas/canvas-renderer2.js.map +0 -1
  37. package/dist/render/canvas/canvas-renderer2.d.ts +0 -81
  38. package/dist/types/render/canvas/canvas-renderer2.d.ts +0 -81
@@ -0,0 +1,5 @@
1
+ {
2
+ "[typescript]": {
3
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
4
+ }
5
+ }
package/README.md CHANGED
@@ -7,17 +7,14 @@
7
7
  [![NPM Downloads](https://img.shields.io/npm/dm/html2canvas.svg)](https://www.npmjs.org/package/html2canvas)
8
8
  [![NPM Version](https://img.shields.io/npm/v/html2canvas.svg)](https://www.npmjs.org/package/html2canvas) -->
9
9
 
10
- 该脚本允许您直接在用户浏览器上将网页或部分网页生成为可编辑、非图片式、可打印的 pdf。由于生成是基于 DOM 的,因此可能与实际表现不会 100% 一致。如果是复杂的pdf生成需求,不建议使用。
11
-
10
+ 该脚本允许您直接在用户浏览器上将网页或部分网页生成为可编辑、非图片式、可打印的矢量 pdf。支持分页,最多可以生成上数千页的 pdf 文件。由于生成是基于 DOM 的,因此可能与实际表现不会 100% 一致。如果是复杂的 pdf 生成需求,不建议使用。
12
11
 
13
12
  在线体验:[在线体验](https://dompdfjs.lisky.com.cn)
14
13
 
15
- pdf生成示例
14
+ ### pdf 生成示例
16
15
 
17
- ### pdf生成示例
18
16
  ![pdf生成示例](./examples/test.png)
19
17
 
20
-
21
18
  ### 它是如何工作的
22
19
 
23
20
  该脚本基于[html2canvas](https://github.com/niklasvh/html2canvas)和[jspdf](https://github.com/MrRio/jsPDF),与以往将 html 页面通过 html2canvas 渲染为图片,再通过 jspdf 将图片生成 pdf 文件不同,该脚本通过读取 DOM 和应用于元素的不同样式,改造了 html2canvas 的 canvas-renderer 文件,调用 jspdf 的方法生成 pdf 文件。
@@ -25,20 +22,19 @@ pdf生成示例
25
22
 
26
23
  1. 不需要服务器端的任何渲染,因为整个 pdf 是在**客户端浏览器**上创建的。
27
24
  2. 生成的是真正的 pdf 文件,而不是图片式的,这样生成的 pdf 质量更高,您也可以编辑和打印生成 pdf 文件。
28
- 3. 更小的 pdf 文件体积
25
+ 3. 更小的 pdf 文件体积。
26
+ 4. 不受 canvas 渲染高度限制,可以生成数千页的 pdf 文件。
29
27
 
30
28
  当然,它也有一些缺点:
31
29
 
32
30
  1. 由于是基于 DOM 的,所以可能与实际表现不会 100% 一致。
33
31
  2. 有的 css 属性还没有被支持,查看[支持的 css 属性](https://www.html2canvas.cn/html2canvas-features.html)。
34
- 3. 不适合在 nodejs 中使用。
35
- 4. 有的样式可能无法被正确渲染,比如:
36
- - text-shadow
37
32
 
38
33
  ### 已实现功能
39
34
 
40
35
  | 功能 | 状态 | 说明 |
41
36
  | -------- | ---- | --------------------------------------------------------------------------------------------------------- |
37
+ | 分页 | ✅ | 支持 PDF 分页渲染,可生成数千页的 PDF 文件 |
42
38
  | 文本渲染 | ✅ | 支持基础文本内容渲染,font-family,font-size,font-style,font-variant,color 等,支持文字描边,不支持文字阴影 |
43
39
  | 图片渲染 | ✅ | 支持网络图片,base64 图片,svg 图片 |
44
40
  | 边框 | ✅ | 支持 border-width,border-color,border-style,border-radius,暂时只实现了实线边框 |
@@ -47,41 +43,9 @@ pdf生成示例
47
43
  | svg | ✅ | 支持渲染 svg |
48
44
  | 阴影渲染 | ✅ | 使用 foreignObjectRendering,支持边框阴影渲染 |
49
45
  | 渐变渲染 | ✅ | 使用 foreignObjectRendering,支持背景渐变渲染 |
50
- | iframe | ❌ | 支持渲染 iframe |
51
-
52
- ### foreignObjectRendering 使用
53
-
54
- 在 dom 十分复杂,或者 pdf 无法绘制的情况(比如:复杂的表格,边框阴影,渐变等),可以考虑使用 foreignObjectRendering。
55
- 给要渲染的元素添加 foreignObjectRendering 属性,就可以通过 svg 的 foreignObject 将它渲染成一张背景图插入到 pdf 文件中。
56
-
57
- 但是,由于 foreignObject 元素的渲染依赖于浏览器的实现,因此在不同的浏览器中可能会有不同的表现。
58
- 所以,在使用 foreignObjectRendering 时,需要注意以下事项:
59
-
60
- 1. foreignObject 元素的渲染依赖于浏览器的实现,因此在不同的浏览器中可能会有不同的表现。
61
- 2. IE 浏览器完全不支持,推荐在 chrome 和 firefox,edge 中使用。
62
- 3. 生成的图片会导致 pdf 文件体积变大。
63
-
64
- 示例
46
+ | iframe | ❌ | 暂不支持渲染 iframe |
65
47
 
66
- ```html
67
- <div style="width: 100px;height: 100px;" foreignObjectRendering>
68
- <div
69
- style="width: 50px;height: 50px;border: 1px solid #000;box-shadow: 2px 2px 5px rgba(0,0,0,0.3);background: linear-gradient(45deg, #ff6b6b, #4ecdc4);"
70
- >
71
- 这是一个div元素
72
- </div>
73
- </div>
74
- ```
75
48
 
76
- ### 浏览器兼容性
77
-
78
- 该库应该可以在以下浏览器上正常工作(需要 `Promise` polyfill):
79
-
80
- - Firefox 3.5+
81
- - Google Chrome
82
- - Opera 12+
83
- - IE9+
84
- - Safari 6+
85
49
 
86
50
  ### 使用方法
87
51
 
@@ -91,61 +55,187 @@ dompdf 库使用 `Promise` 并期望它们在全局上下文中可用。如果
91
55
 
92
56
  npm install dompdf.js --save
93
57
 
94
- CDN引入:
58
+ CDN 引入:
59
+
95
60
  ```html
96
- <script src="https://cdn.jsdelivr.net/npm/dompdf.js@1.0.2/dist/dompdf.min.js"></script>
61
+ <script src="https://cdn.jsdelivr.net/npm/dompdf.js@latest/dist/dompdf.js"></script>
97
62
  ```
98
63
 
99
64
  #### 基础用法
100
65
 
101
66
  ```js
102
- import dompdf from 'dompdf.js';
67
+ import dompdf from "dompdf.js";
68
+
69
+ dompdf(document.querySelector("#capture"), options)
70
+ .then((blob) => {
71
+ const url = URL.createObjectURL(blob);
72
+ const a = document.createElement("a");
73
+ a.href = url;
74
+ a.download = "example.pdf";
75
+ document.body.appendChild(a);
76
+ a.click();
77
+ })
78
+ .catch((err) => {
79
+ console.error(err);
80
+ });
81
+ ```
82
+
83
+
84
+ #### PDF 分页渲染
85
+
86
+ 默认情况下,dompdf 会将整个文档渲染到单页中。
87
+
88
+ 您可以通过设置 `pagination` 选项为 `true` 来开启分页渲染。通过 pageConfig 字段自定义页眉页脚的尺寸,内容,字体颜色/大小,位置等信息。
89
+
90
+ ```js
91
+ import dompdf from "dompdf.js";
92
+
103
93
  dompdf(document.querySelector("#capture"), {
104
- useCORS: true //是否允许跨域
105
- })
106
- .then(function (blob) {
107
- const url = URL.createObjectURL(blob);
108
- const a = document.createElement('a');
109
- a.href = url;
110
- a.download = 'example.pdf';
111
- document.body.appendChild(a);
112
- a.click();
113
- })
114
- .catch(function (err) {
115
- console.log(err, 'err');
116
- });
94
+ pagination: true,
95
+ format: "a4",
96
+ pageConfig: {
97
+ header: {
98
+ content: "这是页眉",
99
+ height: 50,
100
+ contentColor: "#333333",
101
+ contentFontSize: 12,
102
+ contentPosition: "center",
103
+ padding: [0, 0, 0, 0],
104
+ },
105
+ footer: {
106
+ content: "第${currentPage}页/共${totalPages}页",
107
+ height: 50,
108
+ contentColor: "#333333",
109
+ contentFontSize: 12,
110
+ contentPosition: "center",
111
+ padding: [0, 0, 0, 0],
112
+ },
113
+ },
114
+ })
115
+ .then((blob) => {
116
+ const url = URL.createObjectURL(blob);
117
+ const a = document.createElement("a");
118
+ a.href = url;
119
+ a.download = "example.pdf";
120
+ document.body.appendChild(a);
121
+ a.click();
122
+ })
123
+ .catch((err) => {
124
+ console.error(err);
125
+ });
117
126
  ```
127
+ ##### 更精准的分页控制-`divisionDisable` 属性
128
+
129
+ 如果您不希望某个容器在分页时被拆分时,为该元素添加 `divisionDisable` 属性,跨页时它会整体移至下一页。
130
+
118
131
 
119
- #### 字体支持
132
+ #### options 参数
120
133
 
121
- 如果需要自定义字体,在[这里](https://rawgit.com/MrRio/jsPDF/master/fontconverter/fontconverter.html)将字体 tff 文件转化成 base64 格式的 js 文件,中文字体推荐使用[思源黑体](https://github.com/lmn1919/dompdf.js/blob/main/examples/SourceHanSansSC-Normal-Min-normal.js),体积较小。
134
+ | 参数名 | 必传 | 默认值 | 类型 | 说明 |
135
+ | ------------------ | ---- | ------------- | ------------------- | -------------------------------------------------------------- |
136
+ | `useCORS` | 否 | `false` | `boolean` | 允许跨域资源(需服务端 CORS 配置) |
137
+ | `backgroundColor` | 否 | 自动解析/白色 | `string \| null` | 覆盖页面背景色;传 `null` 生成透明背景 |
138
+ | `fontConfig` | 否 | - | `object` | 非英文字体配置,见下表 |
139
+ | `encryption` | 否 | 空配置 | `object` | PDF 加密配置,属性`userPassword` 用于给定权限列表下用户的密码;属性`ownerPassword` 需要设置userPassword和ownerPassword以进行正确的身份验证;属性`userPermissions` 用于指定用户权限,可选值为 `['print', 'modify', 'copy', 'annot-forms']` |
140
+ | `precision` | 否 | `16` | `number` | 元素位置的精度 |
141
+ | `compress` | 否 | `false` | `boolean` | 是否压缩PDF |
142
+ | `putOnlyUsedFonts` | 否 | `false` | `boolean` | 仅将实际使用的字体嵌入 PDF |
143
+ | `pagination` | 否 | `false` | `boolean` | 开启分页渲染 |
144
+ | `format` | 否 | `'a4'` | `string` | 页面规格,支持 `a0–a10`、`b0–b10`、`c0–c10`、`letter` 等 |
145
+ | `pageConfig` | 否 | 见下表 | `object` | 页眉页脚配置 |
146
+
147
+
148
+ ##### `pageConfig`字段:
149
+
150
+ | 参数名 | 默认值 | 类型 | 说明 |
151
+ | -------- | ------------------------ | ------ | -------- |
152
+ | `header` | 见下表 pageConfigOptions | object | 页眉设置 |
153
+ | `footer` | 见下表 pageConfigOptions | object | 页脚设置 |
154
+
155
+
156
+ ##### `pageConfigOptions` 字段:
157
+
158
+ | 参数名 | 默认值 | 类型 | 说明 |
159
+ | ----------------- | --------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------- |
160
+ | `content` | 页眉默认值为空,页脚默认值为`${currentPage}/${totalPages}` | `string` | 文本内容,支持 `${currentPage}`、`${totalPages}`,`${currentPage}`为当前页码,`${totalPages}`为总页码 |
161
+ | `height` | `50` | `number` | 区域高度(px) |
162
+ | `contentPosition` | `'center'` | `string \| [number, number]` | 文本位置枚举 `center`、`centerLeft` 、 `centerRight`、`centerTop`、 `centerBottom`、`leftTop`、 `leftBottom`、`rightTop`、`rightBottom`或坐标 `[x,y]` |
163
+ | `contentColor` | `'#333333'` | `string` | 文本颜色 |
164
+ | `contentFontSize` | `16` | `number` | 文本字号(px) |
165
+ | `padding` | `[0,24,0,24]` | `[number, number, number, number]` | 上/右/下/左内边距(px) |
166
+
167
+
168
+ ##### 字体配置(`fontConfig`)字段:
169
+
170
+ | 字段 | 必传 | 默认值 | 类型 | 说明 |
171
+ | ------------ | ---------------------- | ------ | -------- | ---------------------------------- |
172
+ | `fontFamily` | 是(启用自定义字体时) | `''` | `string` | 字体家族名(与注入的 `.ttf` 同名) |
173
+ | `fontBase64` | 是(启用自定义字体时) | `''` | `string` | `.ttf` 的 Base64 字符串内容 |
174
+
175
+ #### 乱码问题-字体导入支持
176
+
177
+ 由于 jspdf 只支持英文,所以其他语言会出现乱码的问题,需要导入对应的字体文件来解决,如果需要自定义字体,在[这里](https://rawgit.com/MrRio/jsPDF/master/fontconverter/fontconverter.html)将字体 tff 文件转化成 base64 格式的 js 文件,中文字体推荐使用[思源黑体](https://github.com/lmn1919/dompdf.js/blob/main/examples/SourceHanSansSC-Normal-Min-normal.js),体积较小。
122
178
  在代码中引入该文件即可。
123
179
 
124
- ````js
125
- <script type="text/javascript" src="./SourceHanSansSC-Normal-Min-normal.js"></script>
126
- dompdf(document.querySelector("#capture"), {
127
- useCORS: true, //是否允许跨域
180
+ ```js
181
+ <script type="text/javascript" src="./SourceHanSansSC-Normal-Min-normal.js"></script>
182
+ <script>
183
+ dompdf(document.querySelector('#capture'), {
184
+ useCORS: true,
128
185
  fontConfig: {
129
- fontFamily: 'SourceHanSansSC-Normal-Min',
130
- fontBase64: window.fontBase64,
131
- },
132
- })
186
+ fontFamily: 'SourceHanSansSC-Normal-Min',
187
+ fontBase64: window.fontBase64
188
+ }
189
+ })
133
190
  .then(function (blob) {
134
- const url = URL.createObjectURL(blob);
135
- const a = document.createElement('a');
136
- a.href = url;
137
- a.download = 'example.pdf';
138
- document.body.appendChild(a);
139
- a.click();
191
+ const url = URL.createObjectURL(blob);
192
+ const a = document.createElement('a');
193
+ a.href = url;
194
+ a.download = 'example.pdf';
195
+ document.body.appendChild(a);
196
+ a.click();
140
197
  })
141
198
  .catch(function (err) {
142
- console.log(err, 'err');
199
+ console.error(err);
143
200
  });
144
- ````
201
+ </script>
202
+ ```
145
203
 
146
- ### 构建
204
+ #### 绘制渐变色、阴影等复杂样式-foreignObjectRendering 使用
147
205
 
148
- <!-- 您可以在[这里](https://github.com/niklasvh/html2canvas/releases)下载已构建好的版本。 -->
206
+ dom 十分复杂,或者 pdf 无法绘制的情况(比如:复杂的表格,边框阴影,渐变等),可以考虑使用 foreignObjectRendering。
207
+ 给要渲染的元素添加 foreignObjectRendering 属性,就可以通过 svg 的 foreignObject 将它渲染成一张背景图插入到 pdf 文件中。
208
+
209
+ 但是,由于 foreignObject 元素的渲染依赖于浏览器的实现,因此在不同的浏览器中可能会有不同的表现。
210
+ 所以,在使用 foreignObjectRendering 时,需要注意以下事项:
211
+
212
+ 1. foreignObject 元素的渲染依赖于浏览器的实现,因此在不同的浏览器中可能会有不同的表现。
213
+ 2. IE 浏览器完全不支持,推荐在 chrome 和 firefox,edge 中使用。
214
+ 3. 生成的图片会导致 pdf 文件体积变大。
215
+
216
+ 示例
217
+
218
+ ```html
219
+ <div style="width: 100px;height: 100px;" foreignObjectRendering>
220
+ <div
221
+ style="width: 50px;height: 50px;border: 1px solid #000;box-shadow: 2px 2px 5px rgba(0,0,0,0.3);background: linear-gradient(45deg, #ff6b6b, #4ecdc4);"
222
+ >
223
+ 这是一个div元素
224
+ </div>
225
+ </div>
226
+ ```
227
+
228
+ ### 浏览器兼容性
229
+
230
+ 该库应该可以在以下浏览器上正常工作(需要 `Promise` polyfill):
231
+
232
+ - Firefox 3.5+
233
+ - Google Chrome
234
+ - Opera 12+
235
+ - IE9+
236
+ - Safari 6+
237
+
238
+ ### 构建
149
239
 
150
240
  克隆 git 仓库:
151
241
 
@@ -162,4 +252,3 @@ dompdf(document.querySelector("#capture"), {
162
252
  ## Star History
163
253
 
164
254
  [![Star History Chart](https://api.star-history.com/svg?repos=lmn1919/dompdf.js&type=Date)](https://www.star-history.com/#lmn1919/dompdf.js&Date)
165
-
@@ -1,7 +1,7 @@
1
+ import { Context } from '../core/context';
1
2
  import { CSSParsedDeclaration } from '../css/index';
2
- import { TextContainer } from './text-container';
3
3
  import { Bounds } from '../css/layout/bounds';
4
- import { Context } from '../core/context';
4
+ import { TextContainer } from './text-container';
5
5
  export declare const enum FLAGS {
6
6
  CREATES_STACKING_CONTEXT = 2,
7
7
  CREATES_REAL_STACKING_CONTEXT = 4,
@@ -17,5 +17,7 @@ export declare class ElementContainer {
17
17
  flags: number;
18
18
  foreignobjectrendering: boolean;
19
19
  parentforeignobjectrendering: boolean;
20
+ divisionDisable: boolean;
21
+ offset: number;
20
22
  constructor(context: Context, element: Element);
21
23
  }