@hidemikimura/receipt-html-to-pdf 0.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.
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/receipt-html-to-pdf.min.js +39 -0
- package/dist/receipt-html-to-pdf.min.js.map +7 -0
- package/examples/lit.js +52 -0
- package/examples/react.jsx +56 -0
- package/examples/vanilla.html +55 -0
- package/package.json +82 -0
- package/src/font/cid.js +187 -0
- package/src/font/parse.js +336 -0
- package/src/font/registry.js +168 -0
- package/src/font/subset.js +211 -0
- package/src/index.js +239 -0
- package/src/page.js +429 -0
- package/src/paginate.js +119 -0
- package/src/pdf/compress.js +30 -0
- package/src/pdf/content.js +192 -0
- package/src/pdf/image.js +33 -0
- package/src/pdf/writer.js +253 -0
- package/src/renderer.js +328 -0
- package/src/units.js +127 -0
- package/src/walker/image.js +264 -0
- package/src/walker/text.js +199 -0
- package/src/walker/walk.js +670 -0
- package/types/font/cid.d.ts +40 -0
- package/types/font/parse.d.ts +113 -0
- package/types/font/registry.d.ts +63 -0
- package/types/font/subset.d.ts +26 -0
- package/types/index.d.ts +198 -0
- package/types/page.d.ts +64 -0
- package/types/paginate.d.ts +59 -0
- package/types/pdf/compress.d.ts +13 -0
- package/types/pdf/content.d.ts +65 -0
- package/types/pdf/image.d.ts +9 -0
- package/types/pdf/writer.d.ts +125 -0
- package/types/renderer.d.ts +55 -0
- package/types/units.d.ts +53 -0
- package/types/walker/image.d.ts +72 -0
- package/types/walker/text.d.ts +38 -0
- package/types/walker/walk.d.ts +150 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** @param {number} n */
|
|
2
|
+
export function hex4(n: number): string;
|
|
3
|
+
/**
|
|
4
|
+
* PDF に埋め込む 1 フォント分の使用状況。
|
|
5
|
+
* 走査中に addGlyph でグリフを集め、最後に embed で PDF オブジェクトを生成する。
|
|
6
|
+
*/
|
|
7
|
+
export class EmbeddedFont {
|
|
8
|
+
/**
|
|
9
|
+
* @param {import('./parse.js').ParsedFont} font
|
|
10
|
+
* @param {string} resourceName ページリソース名(F1 など)
|
|
11
|
+
*/
|
|
12
|
+
constructor(font: import("./parse.js").ParsedFont, resourceName: string);
|
|
13
|
+
font: import("./parse.js").ParsedFont;
|
|
14
|
+
resourceName: string;
|
|
15
|
+
/** @type {Map<number, number>} 旧 GID → 代表コードポイント(ToUnicode 用) */
|
|
16
|
+
usedGids: Map<number, number>;
|
|
17
|
+
/** @type {import('./subset.js').SubsetResult|null} */
|
|
18
|
+
subset: import("./subset.js").SubsetResult | null;
|
|
19
|
+
/**
|
|
20
|
+
* @param {number} gid 旧 GID
|
|
21
|
+
* @param {number} codePoint
|
|
22
|
+
*/
|
|
23
|
+
addGlyph(gid: number, codePoint: number): void;
|
|
24
|
+
/**
|
|
25
|
+
* 旧 GID を PDF 上の CID(サブセット後 GID)へ変換する。embed 後にのみ有効。
|
|
26
|
+
* @param {number} gid
|
|
27
|
+
* @returns {number}
|
|
28
|
+
*/
|
|
29
|
+
cid(gid: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* サブセット化を確定させる。以後 cid() が使える。
|
|
32
|
+
*/
|
|
33
|
+
finalize(): import("./subset.js").SubsetResult;
|
|
34
|
+
/**
|
|
35
|
+
* PDF オブジェクト群を書き込み、Type0 フォント辞書への参照を返す。
|
|
36
|
+
* @param {import('../pdf/writer.js').PdfWriter} writer
|
|
37
|
+
* @returns {Promise<import('../pdf/writer.js').Ref>}
|
|
38
|
+
*/
|
|
39
|
+
embed(writer: import("../pdf/writer.js").PdfWriter): Promise<import("../pdf/writer.js").Ref>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrueType (sfnt / glyf アウトライン) フォントの最小パーサー。
|
|
3
|
+
* サブセット化と PDF 埋め込みに必要なテーブルだけを読む。
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {object} ParsedFont
|
|
7
|
+
* @property {Uint8Array} data
|
|
8
|
+
* @property {Map<string, {offset: number, length: number}>} tables
|
|
9
|
+
* @property {number} unitsPerEm
|
|
10
|
+
* @property {number} indexToLocFormat
|
|
11
|
+
* @property {[number, number, number, number]} bbox xMin yMin xMax yMax (font units)
|
|
12
|
+
* @property {number} ascender hhea
|
|
13
|
+
* @property {number} descender hhea(負値)
|
|
14
|
+
* @property {number} lineGap
|
|
15
|
+
* @property {number} numGlyphs
|
|
16
|
+
* @property {Uint16Array} advances グリフごとの advance width (font units)
|
|
17
|
+
* @property {Uint32Array} loca numGlyphs + 1 要素
|
|
18
|
+
* @property {Map<number, number>} cmap コードポイント → GID
|
|
19
|
+
* @property {number} capHeight OS/2 sCapHeight(なければ ascender * 0.7)
|
|
20
|
+
* @property {number} italicAngle
|
|
21
|
+
* @property {boolean} useTypoMetrics OS/2 fsSelection bit 7
|
|
22
|
+
* @property {number} typoAscender
|
|
23
|
+
* @property {number} typoDescender
|
|
24
|
+
* @property {number} winAscent
|
|
25
|
+
* @property {number} winDescent
|
|
26
|
+
* @property {string} postScriptName
|
|
27
|
+
* @property {boolean} bold
|
|
28
|
+
* @property {boolean} italic
|
|
29
|
+
* @property {boolean} variable fvar テーブルを持つ可変フォントか
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* @param {ArrayBuffer|Uint8Array} buffer
|
|
33
|
+
* @returns {ParsedFont}
|
|
34
|
+
*/
|
|
35
|
+
export function parseFont(buffer: ArrayBuffer | Uint8Array): ParsedFont;
|
|
36
|
+
/**
|
|
37
|
+
* グリフの生バイト列を返す(空グリフは長さ 0)。
|
|
38
|
+
* @param {ParsedFont} font
|
|
39
|
+
* @param {number} gid
|
|
40
|
+
* @returns {Uint8Array}
|
|
41
|
+
*/
|
|
42
|
+
export function glyphData(font: ParsedFont, gid: number): Uint8Array;
|
|
43
|
+
/**
|
|
44
|
+
* 複合グリフが参照するコンポーネント GID を返す(単純グリフなら空)。
|
|
45
|
+
* @param {Uint8Array} g
|
|
46
|
+
* @returns {number[]}
|
|
47
|
+
*/
|
|
48
|
+
export function componentGids(g: Uint8Array): number[];
|
|
49
|
+
/**
|
|
50
|
+
* ブラウザが行ボックス計算に使うアセント/ディセントに近い値(font units)を返す。
|
|
51
|
+
* Chrome/Firefox は OS/2 USE_TYPO_METRICS が立っていれば typo、そうでなければ hhea を使う。
|
|
52
|
+
* @param {ParsedFont} font
|
|
53
|
+
* @returns {{ascent: number, descent: number}} descent は正値
|
|
54
|
+
*/
|
|
55
|
+
export function browserMetrics(font: ParsedFont): {
|
|
56
|
+
ascent: number;
|
|
57
|
+
descent: number;
|
|
58
|
+
};
|
|
59
|
+
export type ParsedFont = {
|
|
60
|
+
data: Uint8Array;
|
|
61
|
+
tables: Map<string, {
|
|
62
|
+
offset: number;
|
|
63
|
+
length: number;
|
|
64
|
+
}>;
|
|
65
|
+
unitsPerEm: number;
|
|
66
|
+
indexToLocFormat: number;
|
|
67
|
+
/**
|
|
68
|
+
* xMin yMin xMax yMax (font units)
|
|
69
|
+
*/
|
|
70
|
+
bbox: [number, number, number, number];
|
|
71
|
+
/**
|
|
72
|
+
* hhea
|
|
73
|
+
*/
|
|
74
|
+
ascender: number;
|
|
75
|
+
/**
|
|
76
|
+
* hhea(負値)
|
|
77
|
+
*/
|
|
78
|
+
descender: number;
|
|
79
|
+
lineGap: number;
|
|
80
|
+
numGlyphs: number;
|
|
81
|
+
/**
|
|
82
|
+
* グリフごとの advance width (font units)
|
|
83
|
+
*/
|
|
84
|
+
advances: Uint16Array;
|
|
85
|
+
/**
|
|
86
|
+
* numGlyphs + 1 要素
|
|
87
|
+
*/
|
|
88
|
+
loca: Uint32Array;
|
|
89
|
+
/**
|
|
90
|
+
* コードポイント → GID
|
|
91
|
+
*/
|
|
92
|
+
cmap: Map<number, number>;
|
|
93
|
+
/**
|
|
94
|
+
* OS/2 sCapHeight(なければ ascender * 0.7)
|
|
95
|
+
*/
|
|
96
|
+
capHeight: number;
|
|
97
|
+
italicAngle: number;
|
|
98
|
+
/**
|
|
99
|
+
* OS/2 fsSelection bit 7
|
|
100
|
+
*/
|
|
101
|
+
useTypoMetrics: boolean;
|
|
102
|
+
typoAscender: number;
|
|
103
|
+
typoDescender: number;
|
|
104
|
+
winAscent: number;
|
|
105
|
+
winDescent: number;
|
|
106
|
+
postScriptName: string;
|
|
107
|
+
bold: boolean;
|
|
108
|
+
italic: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* fvar テーブルを持つ可変フォントか
|
|
111
|
+
*/
|
|
112
|
+
variable: boolean;
|
|
113
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {string} family
|
|
3
|
+
* @returns {string}
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeFamily(family: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* getComputedStyle().fontFamily('"BIZ UDPGothic", sans-serif')をリストに分割する。
|
|
8
|
+
* @param {string} value
|
|
9
|
+
* @returns {string[]}
|
|
10
|
+
*/
|
|
11
|
+
export function splitFamilies(value: string): string[];
|
|
12
|
+
/**
|
|
13
|
+
* getComputedStyle().fontWeight('400' / '700' / 'bold')を数値にする。
|
|
14
|
+
* @param {string} value
|
|
15
|
+
* @returns {number}
|
|
16
|
+
*/
|
|
17
|
+
export function parseWeight(value: string): number;
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {object} RegisteredFont
|
|
20
|
+
* @property {string} family 正規化済み(小文字・引用符なし)
|
|
21
|
+
* @property {string} displayFamily
|
|
22
|
+
* @property {number} weight
|
|
23
|
+
* @property {'normal'|'italic'} style
|
|
24
|
+
* @property {import('./parse.js').ParsedFont} parsed
|
|
25
|
+
*/
|
|
26
|
+
export class FontRegistry {
|
|
27
|
+
/** @type {RegisteredFont[]} */
|
|
28
|
+
fonts: RegisteredFont[];
|
|
29
|
+
/**
|
|
30
|
+
* @param {import('../index.js').FontSource} source
|
|
31
|
+
* @returns {Promise<RegisteredFont>}
|
|
32
|
+
*/
|
|
33
|
+
register(source: import("../index.js").FontSource): Promise<RegisteredFont>;
|
|
34
|
+
/** @param {string} family */
|
|
35
|
+
hasFamily(family: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* CSS の指定に最も近い登録フォントを返す。
|
|
38
|
+
* @param {string[]} families font-family リスト(優先順)
|
|
39
|
+
* @param {number} weight
|
|
40
|
+
* @param {'normal'|'italic'} style
|
|
41
|
+
* @param {number} [codePoint] 指定するとこの文字のグリフを持つフォントに限定する
|
|
42
|
+
* @returns {RegisteredFont|null}
|
|
43
|
+
*/
|
|
44
|
+
match(families: string[], weight: number, style: "normal" | "italic", codePoint?: number): RegisteredFont | null;
|
|
45
|
+
/**
|
|
46
|
+
* 登録済みの全ファミリーの中から、指定文字のグリフを持つものを探す(最終フォールバック)。
|
|
47
|
+
* @param {number} codePoint
|
|
48
|
+
* @param {number} weight
|
|
49
|
+
* @param {'normal'|'italic'} style
|
|
50
|
+
* @returns {RegisteredFont|null}
|
|
51
|
+
*/
|
|
52
|
+
anyWithGlyph(codePoint: number, weight: number, style: "normal" | "italic"): RegisteredFont | null;
|
|
53
|
+
}
|
|
54
|
+
export type RegisteredFont = {
|
|
55
|
+
/**
|
|
56
|
+
* 正規化済み(小文字・引用符なし)
|
|
57
|
+
*/
|
|
58
|
+
family: string;
|
|
59
|
+
displayFamily: string;
|
|
60
|
+
weight: number;
|
|
61
|
+
style: "normal" | "italic";
|
|
62
|
+
parsed: import("./parse.js").ParsedFont;
|
|
63
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} SubsetResult
|
|
3
|
+
* @property {Uint8Array} data サブセット化されたフォントファイル
|
|
4
|
+
* @property {Map<number, number>} gidMap 旧 GID → 新 GID
|
|
5
|
+
* @property {number[]} oldGids 新 GID 順に並んだ旧 GID
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @param {import('./parse.js').ParsedFont} font
|
|
9
|
+
* @param {Iterable<number>} usedGids
|
|
10
|
+
* @returns {SubsetResult}
|
|
11
|
+
*/
|
|
12
|
+
export function subsetFont(font: import("./parse.js").ParsedFont, usedGids: Iterable<number>): SubsetResult;
|
|
13
|
+
export type SubsetResult = {
|
|
14
|
+
/**
|
|
15
|
+
* サブセット化されたフォントファイル
|
|
16
|
+
*/
|
|
17
|
+
data: Uint8Array;
|
|
18
|
+
/**
|
|
19
|
+
* 旧 GID → 新 GID
|
|
20
|
+
*/
|
|
21
|
+
gidMap: Map<number, number>;
|
|
22
|
+
/**
|
|
23
|
+
* 新 GID 順に並んだ旧 GID
|
|
24
|
+
*/
|
|
25
|
+
oldGids: number[];
|
|
26
|
+
};
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* フォントを登録する。同じ family/weight/style を再登録した場合は上書きする。
|
|
3
|
+
* パース結果はモジュール内にキャッシュされ、以降の htmlToPdf 呼び出しで再利用される。
|
|
4
|
+
*
|
|
5
|
+
* @param {FontSource} font
|
|
6
|
+
* @returns {Promise<void>}
|
|
7
|
+
*/
|
|
8
|
+
export function registerFont(font: FontSource): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* 登録済みフォントの一覧(デバッグ用)。
|
|
11
|
+
* @returns {{family: string, weight: number, style: string, glyphs: number}[]}
|
|
12
|
+
*/
|
|
13
|
+
export function listFonts(): {
|
|
14
|
+
family: string;
|
|
15
|
+
weight: number;
|
|
16
|
+
style: string;
|
|
17
|
+
glyphs: number;
|
|
18
|
+
}[];
|
|
19
|
+
/**
|
|
20
|
+
* HTML を PDF に変換する。
|
|
21
|
+
*
|
|
22
|
+
* @param {ConvertInput} input
|
|
23
|
+
* @param {ConvertOptions} [options]
|
|
24
|
+
* @returns {Promise<Blob|Uint8Array|string>} options.output に応じた PDF
|
|
25
|
+
*/
|
|
26
|
+
export function htmlToPdf(input: ConvertInput, options?: ConvertOptions): Promise<Blob | Uint8Array | string>;
|
|
27
|
+
/**
|
|
28
|
+
* 生成した PDF をブラウザでダウンロードさせる補助関数。
|
|
29
|
+
*
|
|
30
|
+
* @param {Blob|Uint8Array} pdf
|
|
31
|
+
* @param {string} filename
|
|
32
|
+
* @returns {void}
|
|
33
|
+
*/
|
|
34
|
+
export function downloadPdf(pdf: Blob | Uint8Array, filename: string): void;
|
|
35
|
+
export { expandPrintMediaCss } from "./renderer.js";
|
|
36
|
+
/**
|
|
37
|
+
* 登録するフォントの定義。
|
|
38
|
+
* `src` は TrueType アウトライン(glyf)を持つ静的 TTF のみ対応。
|
|
39
|
+
*
|
|
40
|
+
* @typedef {object} FontSource
|
|
41
|
+
* @property {string} family CSS の font-family と一致させる名前
|
|
42
|
+
* @property {number} [weight=400] 100〜900
|
|
43
|
+
* @property {'normal'|'italic'} [style='normal']
|
|
44
|
+
* @property {string|ArrayBuffer|Uint8Array} src URL または フォントファイルのバイト列
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* 用紙サイズ。既定名か、幅・高さを CSS 長さ('80mm' など)で指定する。
|
|
48
|
+
*
|
|
49
|
+
* @typedef {'A3'|'A4'|'A5'|'B4'|'B5'|'Letter'|'Legal'|{width: string, height: string}} PageSize
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* @typedef {object} PageOptions
|
|
53
|
+
* @property {PageSize} [size='A4']
|
|
54
|
+
* @property {'portrait'|'landscape'} [orientation='portrait']
|
|
55
|
+
* @property {string|{top: string, right: string, bottom: string, left: string}} [margin='15mm']
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* @typedef {object} PdfMetadata
|
|
59
|
+
* @property {string} [title]
|
|
60
|
+
* @property {string} [author]
|
|
61
|
+
* @property {string} [subject]
|
|
62
|
+
* @property {string} [keywords]
|
|
63
|
+
* @property {string} [creator]
|
|
64
|
+
* @property {Date} [creationDate]
|
|
65
|
+
*/
|
|
66
|
+
/**
|
|
67
|
+
* 変換中に発生した非致命的な問題。例外にはせず onWarning に流す。
|
|
68
|
+
*
|
|
69
|
+
* @typedef {object} ConversionWarning
|
|
70
|
+
* @property {'unsupported-css'|'missing-font'|'missing-glyph'|'image-failed'|'other'} code
|
|
71
|
+
* @property {string} message
|
|
72
|
+
* @property {Element} [element]
|
|
73
|
+
* @property {string} [property] unsupported-css のときの CSS プロパティ名
|
|
74
|
+
* @property {string} [text] missing-glyph のときの該当文字
|
|
75
|
+
*/
|
|
76
|
+
/**
|
|
77
|
+
* @typedef {object} ConvertOptions
|
|
78
|
+
* @property {PageOptions} [page]
|
|
79
|
+
* @property {string[]} [fontFallback] 未登録ファミリーが要求されたときに試す family の順序
|
|
80
|
+
* @property {'inherit'|'none'|string[]} [stylesheets='inherit'] 親文書のスタイルを継承するか、URL/CSS テキストを明示するか
|
|
81
|
+
* @property {boolean} [mediaPrint=false] `@media print` ルールを通常ルールとして適用する
|
|
82
|
+
* @property {boolean} [compress=true] CompressionStream が使えれば FlateDecode を適用する
|
|
83
|
+
* @property {PdfMetadata} [metadata]
|
|
84
|
+
* @property {string|null} [header=null] 各ページ上部の HTML テンプレート。{{pageNumber}} {{totalPages}} を置換する
|
|
85
|
+
* @property {string|null} [footer=null] 各ページ下部の HTML テンプレート。同上
|
|
86
|
+
* @property {'font'|'measure'|'auto'} [textMeasure='auto'] グリフ位置の決め方(現在は常に実測)
|
|
87
|
+
* @property {'blob'|'uint8array'|'dataurl'} [output='blob']
|
|
88
|
+
* @property {string} [baseUrl] 相対 URL(フォント・画像)の基準。既定は現在の文書
|
|
89
|
+
* @property {(warning: ConversionWarning) => void} [onWarning]
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* 変換の入力。DOM 要素、または HTML 文字列。
|
|
93
|
+
* @typedef {Element|string} ConvertInput
|
|
94
|
+
*/
|
|
95
|
+
/** ライブラリのバージョン(package.json と同期) */
|
|
96
|
+
export const version: "0.1.0";
|
|
97
|
+
/**
|
|
98
|
+
* 登録するフォントの定義。
|
|
99
|
+
* `src` は TrueType アウトライン(glyf)を持つ静的 TTF のみ対応。
|
|
100
|
+
*/
|
|
101
|
+
export type FontSource = {
|
|
102
|
+
/**
|
|
103
|
+
* CSS の font-family と一致させる名前
|
|
104
|
+
*/
|
|
105
|
+
family: string;
|
|
106
|
+
/**
|
|
107
|
+
* 100〜900
|
|
108
|
+
*/
|
|
109
|
+
weight?: number | undefined;
|
|
110
|
+
style?: "normal" | "italic" | undefined;
|
|
111
|
+
/**
|
|
112
|
+
* URL または フォントファイルのバイト列
|
|
113
|
+
*/
|
|
114
|
+
src: string | ArrayBuffer | Uint8Array;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* 用紙サイズ。既定名か、幅・高さを CSS 長さ('80mm' など)で指定する。
|
|
118
|
+
*/
|
|
119
|
+
export type PageSize = "A3" | "A4" | "A5" | "B4" | "B5" | "Letter" | "Legal" | {
|
|
120
|
+
width: string;
|
|
121
|
+
height: string;
|
|
122
|
+
};
|
|
123
|
+
export type PageOptions = {
|
|
124
|
+
size?: PageSize | undefined;
|
|
125
|
+
orientation?: "portrait" | "landscape" | undefined;
|
|
126
|
+
margin?: string | {
|
|
127
|
+
top: string;
|
|
128
|
+
right: string;
|
|
129
|
+
bottom: string;
|
|
130
|
+
left: string;
|
|
131
|
+
} | undefined;
|
|
132
|
+
};
|
|
133
|
+
export type PdfMetadata = {
|
|
134
|
+
title?: string | undefined;
|
|
135
|
+
author?: string | undefined;
|
|
136
|
+
subject?: string | undefined;
|
|
137
|
+
keywords?: string | undefined;
|
|
138
|
+
creator?: string | undefined;
|
|
139
|
+
creationDate?: Date | undefined;
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* 変換中に発生した非致命的な問題。例外にはせず onWarning に流す。
|
|
143
|
+
*/
|
|
144
|
+
export type ConversionWarning = {
|
|
145
|
+
code: "unsupported-css" | "missing-font" | "missing-glyph" | "image-failed" | "other";
|
|
146
|
+
message: string;
|
|
147
|
+
element?: Element | undefined;
|
|
148
|
+
/**
|
|
149
|
+
* unsupported-css のときの CSS プロパティ名
|
|
150
|
+
*/
|
|
151
|
+
property?: string | undefined;
|
|
152
|
+
/**
|
|
153
|
+
* missing-glyph のときの該当文字
|
|
154
|
+
*/
|
|
155
|
+
text?: string | undefined;
|
|
156
|
+
};
|
|
157
|
+
export type ConvertOptions = {
|
|
158
|
+
page?: PageOptions | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* 未登録ファミリーが要求されたときに試す family の順序
|
|
161
|
+
*/
|
|
162
|
+
fontFallback?: string[] | undefined;
|
|
163
|
+
/**
|
|
164
|
+
* 親文書のスタイルを継承するか、URL/CSS テキストを明示するか
|
|
165
|
+
*/
|
|
166
|
+
stylesheets?: string[] | "inherit" | "none" | undefined;
|
|
167
|
+
/**
|
|
168
|
+
* `@media print` ルールを通常ルールとして適用する
|
|
169
|
+
*/
|
|
170
|
+
mediaPrint?: boolean | undefined;
|
|
171
|
+
/**
|
|
172
|
+
* CompressionStream が使えれば FlateDecode を適用する
|
|
173
|
+
*/
|
|
174
|
+
compress?: boolean | undefined;
|
|
175
|
+
metadata?: PdfMetadata | undefined;
|
|
176
|
+
/**
|
|
177
|
+
* 各ページ上部の HTML テンプレート。{{pageNumber}} {{totalPages}} を置換する
|
|
178
|
+
*/
|
|
179
|
+
header?: string | null | undefined;
|
|
180
|
+
/**
|
|
181
|
+
* 各ページ下部の HTML テンプレート。同上
|
|
182
|
+
*/
|
|
183
|
+
footer?: string | null | undefined;
|
|
184
|
+
/**
|
|
185
|
+
* グリフ位置の決め方(現在は常に実測)
|
|
186
|
+
*/
|
|
187
|
+
textMeasure?: "font" | "measure" | "auto" | undefined;
|
|
188
|
+
output?: "blob" | "uint8array" | "dataurl" | undefined;
|
|
189
|
+
/**
|
|
190
|
+
* 相対 URL(フォント・画像)の基準。既定は現在の文書
|
|
191
|
+
*/
|
|
192
|
+
baseUrl?: string | undefined;
|
|
193
|
+
onWarning?: ((warning: ConversionWarning) => void) | undefined;
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* 変換の入力。DOM 要素、または HTML 文字列。
|
|
197
|
+
*/
|
|
198
|
+
export type ConvertInput = Element | string;
|
package/types/page.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} PageGeometry
|
|
3
|
+
* @property {number} width pt
|
|
4
|
+
* @property {number} height pt
|
|
5
|
+
* @property {number} top pt 上余白
|
|
6
|
+
* @property {number} right pt
|
|
7
|
+
* @property {number} bottom pt 下余白
|
|
8
|
+
* @property {number} left pt
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {object} PageDecoration ヘッダー/フッター(ページごとに描画済みの走査結果)
|
|
12
|
+
* @property {number} heightPx
|
|
13
|
+
* @property {(pageNumber: number, totalPages: number) => Promise<import('./walker/walk.js').WalkResult>} render
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* @param {import('./index.js').PageOptions|undefined} page
|
|
17
|
+
* @returns {PageGeometry}
|
|
18
|
+
*/
|
|
19
|
+
export function resolvePage(page?: import("./index.js").PageOptions | undefined): PageGeometry;
|
|
20
|
+
/**
|
|
21
|
+
* @param {import('./walker/walk.js').WalkResult} body
|
|
22
|
+
* @param {PageGeometry} geo
|
|
23
|
+
* @param {{compress: boolean, metadata?: import('./index.js').PdfMetadata, header?: PageDecoration|null, footer?: PageDecoration|null}} opts
|
|
24
|
+
* @returns {Promise<Uint8Array>}
|
|
25
|
+
*/
|
|
26
|
+
export function buildPdf(body: import("./walker/walk.js").WalkResult, geo: PageGeometry, opts: {
|
|
27
|
+
compress: boolean;
|
|
28
|
+
metadata?: import("./index.js").PdfMetadata;
|
|
29
|
+
header?: PageDecoration | null;
|
|
30
|
+
footer?: PageDecoration | null;
|
|
31
|
+
}): Promise<Uint8Array>;
|
|
32
|
+
export type PageGeometry = {
|
|
33
|
+
/**
|
|
34
|
+
* pt
|
|
35
|
+
*/
|
|
36
|
+
width: number;
|
|
37
|
+
/**
|
|
38
|
+
* pt
|
|
39
|
+
*/
|
|
40
|
+
height: number;
|
|
41
|
+
/**
|
|
42
|
+
* pt 上余白
|
|
43
|
+
*/
|
|
44
|
+
top: number;
|
|
45
|
+
/**
|
|
46
|
+
* pt
|
|
47
|
+
*/
|
|
48
|
+
right: number;
|
|
49
|
+
/**
|
|
50
|
+
* pt 下余白
|
|
51
|
+
*/
|
|
52
|
+
bottom: number;
|
|
53
|
+
/**
|
|
54
|
+
* pt
|
|
55
|
+
*/
|
|
56
|
+
left: number;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* ヘッダー/フッター(ページごとに描画済みの走査結果)
|
|
60
|
+
*/
|
|
61
|
+
export type PageDecoration = {
|
|
62
|
+
heightPx: number;
|
|
63
|
+
render: (pageNumber: number, totalPages: number) => Promise<import("./walker/walk.js").WalkResult>;
|
|
64
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paginator — 走査結果(アトム・強制改ページ・テーブル)から各ページの縦範囲を決める。
|
|
3
|
+
*
|
|
4
|
+
* 方針: 命令は動かさず、ページごとに「この y 範囲を描く」と決めるだけにする。
|
|
5
|
+
* 境界は、アトム(テキスト行・表の行・画像・break-inside: avoid)を跨がない位置まで上へ戻す。
|
|
6
|
+
* テーブルが次ページへ続くときは thead を各ページ先頭で繰り返し、その高さ分だけ本文を下げる。
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {object} RepeatedHead
|
|
10
|
+
* @property {import('./walker/walk.js').TableInfo} table
|
|
11
|
+
* @property {number} shift このページで thead を描く位置(ページ先頭からの px オフセット)
|
|
12
|
+
*
|
|
13
|
+
* @typedef {object} PageRange
|
|
14
|
+
* @property {number} start 本文の描き始め y(ドキュメント px)
|
|
15
|
+
* @property {number} end 本文の描き終わり y(この値未満を描く)
|
|
16
|
+
* @property {RepeatedHead[]} heads ページ先頭で繰り返す thead
|
|
17
|
+
* @property {number} headShift 繰り返し thead の合計高さ(本文はこの分だけ下がる)
|
|
18
|
+
* @property {RepeatedHead[]} feet ページ末尾で繰り返す tfoot(表が次ページへ続くとき)
|
|
19
|
+
* @property {number} footShift 繰り返し tfoot の合計高さ(本文領域はこの分だけ縮む)
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* @param {import('./walker/walk.js').WalkResult} walk
|
|
23
|
+
* @param {number} pageHeightPx 本文領域の高さ(px)
|
|
24
|
+
* @returns {PageRange[]}
|
|
25
|
+
*/
|
|
26
|
+
export function paginate(walk: import("./walker/walk.js").WalkResult, pageHeightPx: number): PageRange[];
|
|
27
|
+
export type RepeatedHead = {
|
|
28
|
+
table: import("./walker/walk.js").TableInfo;
|
|
29
|
+
/**
|
|
30
|
+
* このページで thead を描く位置(ページ先頭からの px オフセット)
|
|
31
|
+
*/
|
|
32
|
+
shift: number;
|
|
33
|
+
};
|
|
34
|
+
export type PageRange = {
|
|
35
|
+
/**
|
|
36
|
+
* 本文の描き始め y(ドキュメント px)
|
|
37
|
+
*/
|
|
38
|
+
start: number;
|
|
39
|
+
/**
|
|
40
|
+
* 本文の描き終わり y(この値未満を描く)
|
|
41
|
+
*/
|
|
42
|
+
end: number;
|
|
43
|
+
/**
|
|
44
|
+
* ページ先頭で繰り返す thead
|
|
45
|
+
*/
|
|
46
|
+
heads: RepeatedHead[];
|
|
47
|
+
/**
|
|
48
|
+
* 繰り返し thead の合計高さ(本文はこの分だけ下がる)
|
|
49
|
+
*/
|
|
50
|
+
headShift: number;
|
|
51
|
+
/**
|
|
52
|
+
* ページ末尾で繰り返す tfoot(表が次ページへ続くとき)
|
|
53
|
+
*/
|
|
54
|
+
feet: RepeatedHead[];
|
|
55
|
+
/**
|
|
56
|
+
* 繰り返し tfoot の合計高さ(本文領域はこの分だけ縮む)
|
|
57
|
+
*/
|
|
58
|
+
footShift: number;
|
|
59
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web 標準 CompressionStream による zlib (FlateDecode) 圧縮。
|
|
3
|
+
* 未対応環境では null を返し、呼び出し側は無圧縮で出力する。
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @returns {boolean}
|
|
7
|
+
*/
|
|
8
|
+
export function canCompress(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* @param {Uint8Array} bytes
|
|
11
|
+
* @returns {Promise<Uint8Array|null>} zlib 形式(PDF の FlateDecode が期待する形式)
|
|
12
|
+
*/
|
|
13
|
+
export function deflate(bytes: Uint8Array): Promise<Uint8Array | null>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export class ContentStream {
|
|
2
|
+
/** @type {string[]} */
|
|
3
|
+
ops: string[];
|
|
4
|
+
depth: number;
|
|
5
|
+
save(): this;
|
|
6
|
+
restore(): this;
|
|
7
|
+
/** @param {number} a @param {number} b @param {number} c @param {number} d @param {number} e @param {number} f */
|
|
8
|
+
transform(a: number, b: number, c: number, d: number, e: number, f: number): this;
|
|
9
|
+
/** @param {string} gsName ExtGState リソース名 */
|
|
10
|
+
setGState(gsName: string): this;
|
|
11
|
+
/** @param {number} r @param {number} g @param {number} b */
|
|
12
|
+
fillColor(r: number, g: number, b: number): this;
|
|
13
|
+
/** @param {number} r @param {number} g @param {number} b */
|
|
14
|
+
strokeColor(r: number, g: number, b: number): this;
|
|
15
|
+
/** @param {number} w */
|
|
16
|
+
lineWidth(w: number): this;
|
|
17
|
+
/** @param {number[]} pattern @param {number} [phase] */
|
|
18
|
+
dash(pattern: number[], phase?: number): this;
|
|
19
|
+
/** @param {0|1|2} cap */
|
|
20
|
+
lineCap(cap: 0 | 1 | 2): this;
|
|
21
|
+
/** @param {number} x @param {number} y @param {number} w @param {number} h */
|
|
22
|
+
rect(x: number, y: number, w: number, h: number): this;
|
|
23
|
+
/** @param {number} x @param {number} y */
|
|
24
|
+
moveTo(x: number, y: number): this;
|
|
25
|
+
/** @param {number} x @param {number} y */
|
|
26
|
+
lineTo(x: number, y: number): this;
|
|
27
|
+
/**
|
|
28
|
+
* 3 次ベジェ曲線
|
|
29
|
+
* @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2 @param {number} x3 @param {number} y3
|
|
30
|
+
*/
|
|
31
|
+
curveTo(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): this;
|
|
32
|
+
closePath(): this;
|
|
33
|
+
/**
|
|
34
|
+
* 角丸矩形のパスを追加する(PDF 座標: y 上向き、(x, y) は左下)。
|
|
35
|
+
* @param {number} x @param {number} y @param {number} w @param {number} h
|
|
36
|
+
* @param {[number, number, number, number]} r [左上, 右上, 右下, 左下] の半径(pt)。CSS の順序
|
|
37
|
+
*/
|
|
38
|
+
roundedRect(x: number, y: number, w: number, h: number, r: [number, number, number, number]): this;
|
|
39
|
+
/**
|
|
40
|
+
* 画像 XObject を (x, y) を左下として w×h で描く。
|
|
41
|
+
* @param {string} name @param {number} x @param {number} y @param {number} w @param {number} h
|
|
42
|
+
*/
|
|
43
|
+
image(name: string, x: number, y: number, w: number, h: number): this;
|
|
44
|
+
fill(): this;
|
|
45
|
+
stroke(): this;
|
|
46
|
+
/** 現在のパスでクリップして新しいパスを開始する */
|
|
47
|
+
clip(): this;
|
|
48
|
+
/** @param {number} x @param {number} y @param {number} w @param {number} h */
|
|
49
|
+
fillRect(x: number, y: number, w: number, h: number): this;
|
|
50
|
+
/**
|
|
51
|
+
* テキストを描画する。
|
|
52
|
+
* @param {string} fontName リソース名(F1 など)
|
|
53
|
+
* @param {number} size フォントサイズ (pt)
|
|
54
|
+
* @param {number} x ベースライン始点 x (pt)
|
|
55
|
+
* @param {number} y ベースライン y (pt)
|
|
56
|
+
* @param {Array<string|number>} tj TJ 配列。文字列は 16 進 CID 列(<...> なし)、数値は 1/1000 単位の位置調整
|
|
57
|
+
* @param {{charSpacing?: number, rise?: number}} [opts]
|
|
58
|
+
*/
|
|
59
|
+
text(fontName: string, size: number, x: number, y: number, tj: Array<string | number>, opts?: {
|
|
60
|
+
charSpacing?: number;
|
|
61
|
+
rise?: number;
|
|
62
|
+
}): this;
|
|
63
|
+
/** @returns {Uint8Array} */
|
|
64
|
+
toBytes(): Uint8Array;
|
|
65
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* デコード済み画像を PDF の Image XObject として書き出す。
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* @param {import('../pdf/writer.js').PdfWriter} writer
|
|
6
|
+
* @param {import('../walker/image.js').DecodedImage} img
|
|
7
|
+
* @returns {Promise<import('../pdf/writer.js').Ref>}
|
|
8
|
+
*/
|
|
9
|
+
export function embedImage(writer: import("../pdf/writer.js").PdfWriter, img: import("../walker/image.js").DecodedImage): Promise<import("../pdf/writer.js").Ref>;
|