@shuji-bonji/pdf-writer-mcp 0.4.0 → 0.5.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 +62 -0
- package/README.ja.md +17 -2
- package/README.md +17 -2
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +9 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/annotation.d.ts +1 -1
- package/dist/services/annotation.js +1 -1
- package/dist/services/annotation.js.map +1 -1
- package/dist/services/builder.js +32 -4
- package/dist/services/builder.js.map +1 -1
- package/dist/services/editor.js +2 -2
- package/dist/services/editor.js.map +1 -1
- package/dist/services/font-manager.d.ts +1 -1
- package/dist/services/font-manager.js +1 -1
- package/dist/services/font-manager.js.map +1 -1
- package/dist/services/layout.d.ts +17 -1
- package/dist/services/layout.js +46 -13
- package/dist/services/layout.js.map +1 -1
- package/dist/services/outline.d.ts +1 -1
- package/dist/services/outline.js +1 -1
- package/dist/services/outline.js.map +1 -1
- package/dist/services/output.js +2 -2
- package/dist/services/output.js.map +1 -1
- package/dist/services/renderers/markdown.d.ts +1 -1
- package/dist/services/renderers/markdown.js +58 -15
- package/dist/services/renderers/markdown.js.map +1 -1
- package/dist/services/renderers/table.d.ts +1 -1
- package/dist/services/renderers/table.js +30 -16
- package/dist/services/renderers/table.js.map +1 -1
- package/dist/services/renderers/text.d.ts +1 -1
- package/dist/services/renderers/text.js +4 -1
- package/dist/services/renderers/text.js.map +1 -1
- package/dist/services/struct-tree.d.ts +79 -0
- package/dist/services/struct-tree.js +222 -0
- package/dist/services/struct-tree.js.map +1 -0
- package/dist/services/xmp.d.ts +42 -0
- package/dist/services/xmp.js +133 -0
- package/dist/services/xmp.js.map +1 -0
- package/dist/tools/definitions.d.ts +24 -0
- package/dist/tools/definitions.js +12 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.js +7 -6
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/utils/lang.d.ts +18 -0
- package/dist/utils/lang.js +30 -0
- package/dist/utils/lang.js.map +1 -0
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.js +22 -5
- package/dist/utils/validation.js.map +1 -1
- package/package.json +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,68 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.5.0] - 2026-07-16
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Tagged PDF / PDF/UA-1 (ISO 14289)** via `tagged: true` on the create tools.
|
|
10
|
+
Output is **verified compliant by veraPDF** (`--flavour ua1`, 106/106 rules) for
|
|
11
|
+
text, Markdown, and table documents.
|
|
12
|
+
|
|
13
|
+
Opt-in by design: existing behaviour is unchanged unless you ask for tagging.
|
|
14
|
+
PDF/UA mandates a document title, so `tagged: true` requires `title`.
|
|
15
|
+
|
|
16
|
+
- Structure tree (`StructTreeRoot`, `StructElem`, `ParentTree`) built from
|
|
17
|
+
pdf-lib's low-level object model — it has no logical-structure API.
|
|
18
|
+
- Every drawn line is wrapped in `/Tag <</MCID n>> BDC … EMC`, and decorations
|
|
19
|
+
(rules, cell borders, code backgrounds) become `/Artifact BMC … EMC` (7.1-3).
|
|
20
|
+
- Markdown maps to structure: headings → `H1`–`H6`, lists → `L`/`LI`/`LBody`,
|
|
21
|
+
tables → `Table`/`TR`/`TH`/`TD`, quotes → `BlockQuote`, code → `Code`.
|
|
22
|
+
- Heading levels are normalised so they start at H1 and never skip (7.4.2).
|
|
23
|
+
A Markdown `# → ###` jump becomes `H1 → H2`; visual sizes are untouched.
|
|
24
|
+
- Table headers carry `/A << /O /Table /Scope /Column >>` (7.5-1).
|
|
25
|
+
- XMP is generated in-house (pdf-lib has no XMP API) with the `pdfuaid`
|
|
26
|
+
declaration **and** the PDF/A extension schema description — veraPDF rejects
|
|
27
|
+
the declaration without it (5-1).
|
|
28
|
+
- `/Lang`, `/ViewerPreferences /DisplayDocTitle`, `/MarkInfo /Marked`.
|
|
29
|
+
|
|
30
|
+
- **`lang` option** (BCP 47). When omitted under `tagged: true` the language is
|
|
31
|
+
inferred from the text and reported via `warnings`. Inference is conservative:
|
|
32
|
+
kana → `ja`, Hangul → `ko`, Han without kana → `ja` *with a warning that it
|
|
33
|
+
could be Chinese*. A wrong `/Lang` makes screen readers mispronounce text, so
|
|
34
|
+
the guess is always surfaced rather than silently applied.
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- **Bullets in unordered lists rendered as `.notdef`** (blank boxes) — a
|
|
39
|
+
regression from 0.3.0. Font subsetting is driven by the *input* text, but the
|
|
40
|
+
Markdown renderer adds characters of its own: `- item` contains no bullet, yet
|
|
41
|
+
`•` is drawn. Those glyphs were missing from the subset. Renderer-generated
|
|
42
|
+
characters are now always subset in (`RENDERER_GENERATED_CHARS`).
|
|
43
|
+
|
|
44
|
+
Text extraction was unaffected, which is why no existing test caught it;
|
|
45
|
+
veraPDF's 7.21.8-1 (no `.notdef` references) is what surfaced it.
|
|
46
|
+
|
|
47
|
+
- XMP metadata is written as UTF-8 bytes. `context.stream(string)` writes one
|
|
48
|
+
byte per character, which mangled Japanese titles.
|
|
49
|
+
|
|
50
|
+
## [Unreleased]
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- **biome adopted** for linting and formatting, matching the rest of the family
|
|
55
|
+
(same `biome.json`, same scripts). `npm run check` now runs in CI and in the
|
|
56
|
+
publish workflow. Existing sources were reformatted; the suite is clean.
|
|
57
|
+
- The version is pinned to an exact `2.5.4` rather than a caret range. Biome's
|
|
58
|
+
formatting output changes between minor releases, so a range lets a local
|
|
59
|
+
`npm install` drift ahead of CI and produce spurious diffs.
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
|
|
63
|
+
- `handleCreateTablePdf` duplicated the Latin-1 check as a regex containing
|
|
64
|
+
control characters; it now reuses the existing `hasNonLatin1` helper.
|
|
65
|
+
- `src/config.ts` imports `node:module` rather than the bare `module` specifier.
|
|
66
|
+
|
|
5
67
|
## [0.4.0] - 2026-07-16
|
|
6
68
|
|
|
7
69
|
### Added
|
package/README.ja.md
CHANGED
|
@@ -20,7 +20,21 @@
|
|
|
20
20
|
| `create_markdown_pdf` | Markdown — 見出し / 段落 / 箇条書き・番号リスト / コードブロック / 引用 / 水平線 / 表 |
|
|
21
21
|
| `create_table_pdf` | 罫線付き表 — 列幅の自動算出、セル内折り返し、改ページ時のヘッダ再描画 |
|
|
22
22
|
|
|
23
|
-
共通オプション: `outputPath` / `returnBase64` / `fontPath` / `fontSize` / `pageSize`(A4/A3/A5/LETTER/LEGAL)/ `margin` / `title` / `author` / `onMissingGlyph`。
|
|
23
|
+
共通オプション: `outputPath` / `returnBase64` / `fontPath` / `fontSize` / `pageSize`(A4/A3/A5/LETTER/LEGAL)/ `margin` / `title` / `author` / `onMissingGlyph` / `tagged` / `lang`。
|
|
24
|
+
|
|
25
|
+
### タグ付き PDF / PDF/UA(v0.5.0)
|
|
26
|
+
|
|
27
|
+
`tagged: true` を指定すると、**PDF/UA-1(ISO 14289)準拠のタグ付き PDF**(アクセシブルな PDF)を生成します。veraPDF(`--flavour ua1`)で 106/106 規則の準拠を確認済みです。
|
|
28
|
+
|
|
29
|
+
```jsonc
|
|
30
|
+
{ "markdown": "# 見出し\n\n本文。", "title": "レポート", "tagged": true, "lang": "ja" }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Markdown は構造木に対応付けられます。見出し → `H1`〜`H6`、リスト → `L`/`LI`/`LBody`、表 → `Table`/`TR`/`TH`/`TD`(ヘッダには `/Scope`)、引用 → `BlockQuote`、コード → `Code`。水平線・罫線・コード背景は Artifact になります。見出しレベルは「H1 始まり・飛ばさない」よう正規化されるため、Markdown の `# → ###` は構造上 `H1 → H2` になります(見た目のサイズは元のままです)。
|
|
34
|
+
|
|
35
|
+
PDF/UA はタイトルを要求するため、`tagged: true` では `title` が必須です。`lang`(BCP 47)は省略すると本文から推定し、`warnings` で報告します。**誤った `/Lang` はスクリーンリーダの誤読を招く**ため、分かっている場合は明示してください。
|
|
36
|
+
|
|
37
|
+
> タグ付けは opt-in です(既定の出力は変わりません)。機械検証は「読み順や代替テキストが**適切か**」までは判定できず、存在の有無しか見られません。人手の確認は依然として必要です。
|
|
24
38
|
|
|
25
39
|
### 編集
|
|
26
40
|
|
|
@@ -128,8 +142,9 @@ TEST_FONT_PATH=/path/to/NotoSansJP-Regular.otf npm test
|
|
|
128
142
|
|
|
129
143
|
- [x] 編集系 Tier A 第1波 — メタデータ・ページ操作(v0.2.0)
|
|
130
144
|
- [x] 編集系 Tier A 第2波 — しおり・注釈(v0.4.0)
|
|
145
|
+
- [x] タグ付き PDF / PDF/UA-1 — veraPDF で準拠を確認(v0.5.0)
|
|
131
146
|
- [ ] 編集系 Tier B — フォーム記入 / フラット化、透かし、添付ファイル、ページ番号スタンプ
|
|
132
|
-
- [ ]
|
|
147
|
+
- [ ] 画像の代替テキスト(`Figure` + `/Alt`)、タグ付き出力での注釈の `Annot` タグ内包
|
|
133
148
|
- [ ] `.ttc` からのフェイス自動抽出
|
|
134
149
|
- [ ] 見出し用と本文用のフォント分け(太字フェイス埋め込み)
|
|
135
150
|
- [ ] 画像埋め込み、ヘッダー / フッター
|
package/README.md
CHANGED
|
@@ -20,7 +20,21 @@ Part of the PDF family alongside [pdf-reader-mcp](https://github.com/shuji-bonji
|
|
|
20
20
|
| `create_markdown_pdf` | Markdown — headings, paragraphs, bullet/ordered lists, code blocks, quotes, rules, tables |
|
|
21
21
|
| `create_table_pdf` | Ruled tables — automatic column widths, cell wrapping, headers repeated across page breaks |
|
|
22
22
|
|
|
23
|
-
Shared options: `outputPath`, `returnBase64`, `fontPath`, `fontSize`, `pageSize` (A4/A3/A5/LETTER/LEGAL), `margin`, `title`, `author`, `onMissingGlyph`.
|
|
23
|
+
Shared options: `outputPath`, `returnBase64`, `fontPath`, `fontSize`, `pageSize` (A4/A3/A5/LETTER/LEGAL), `margin`, `title`, `author`, `onMissingGlyph`, `tagged`, `lang`.
|
|
24
|
+
|
|
25
|
+
### Tagged PDF / PDF/UA (v0.5.0)
|
|
26
|
+
|
|
27
|
+
Pass `tagged: true` to produce an accessible, tagged PDF conforming to **PDF/UA-1 (ISO 14289)**. Output is verified compliant by veraPDF (`--flavour ua1`, 106/106 rules).
|
|
28
|
+
|
|
29
|
+
```jsonc
|
|
30
|
+
{ "markdown": "# Title\n\nBody.", "title": "Report", "tagged": true, "lang": "en" }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Markdown maps onto the structure tree: headings → `H1`–`H6`, lists → `L`/`LI`/`LBody`, tables → `Table`/`TR`/`TH`/`TD` (headers get `/Scope`), quotes → `BlockQuote`, code → `Code`. Rules, borders and code backgrounds become artifacts. Heading levels are normalised so they start at H1 and never skip — a Markdown `# → ###` jump becomes `H1 → H2` in the structure, while visual sizes stay as authored.
|
|
34
|
+
|
|
35
|
+
PDF/UA mandates a document title, so `tagged: true` requires `title`. `lang` (BCP 47) is inferred from the text when omitted and reported via `warnings` — pass it explicitly when you know it, since a wrong `/Lang` makes screen readers mispronounce the text.
|
|
36
|
+
|
|
37
|
+
> Tagging is opt-in: default output is unchanged. Machine validation cannot judge whether reading order or alt text are *appropriate*, only that they exist — human review still matters.
|
|
24
38
|
|
|
25
39
|
### Editing
|
|
26
40
|
|
|
@@ -128,8 +142,9 @@ TEST_FONT_PATH=/path/to/NotoSansJP-Regular.otf npm test
|
|
|
128
142
|
|
|
129
143
|
- [x] Editing Tier A wave 1 — metadata and page operations (v0.2.0)
|
|
130
144
|
- [x] Editing Tier A wave 2 — bookmarks and annotations (v0.4.0)
|
|
145
|
+
- [x] Tagged PDF / PDF/UA-1 — verified by veraPDF (v0.5.0)
|
|
131
146
|
- [ ] Editing Tier B — form filling/flattening, watermarks, attachments, page-number stamping
|
|
132
|
-
- [ ]
|
|
147
|
+
- [ ] Images with alt text (`Figure` + `/Alt`), annotations nested in `Annot` tags for tagged output
|
|
133
148
|
- [ ] Automatic face extraction from `.ttc`
|
|
134
149
|
- [ ] Separate faces for headings and body (bold face embedding)
|
|
135
150
|
- [ ] Image embedding, headers/footers
|
package/dist/config.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Application Configuration
|
|
3
3
|
* バージョンは package.json から動的取得(config と package.json の不一致を防ぐ)
|
|
4
4
|
*/
|
|
5
|
-
import { createRequire } from 'module';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
6
|
const require = createRequire(import.meta.url);
|
|
7
7
|
const packageJson = require('../package.json');
|
|
8
8
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAG5C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CACpB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,yCAAyC;IACzC,YAAY,EAAE,iBAAiB;CACvB,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,cAAc;IACd,QAAQ,EAAE,IAAI;IACd,eAAe;IACf,MAAM,EAAE,EAAE,EAAE,SAAS;IACrB,gBAAgB;IAChB,QAAQ,EAAE,EAAE;IACZ,wDAAwD;IACxD,UAAU,EAAE,IAAI;IAChB,eAAe;IACf,YAAY,EAAE,CAAC;CACP,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -43,6 +43,15 @@ export declare const ANNOTATION_TYPES: readonly ['text', 'highlight', 'square'];
|
|
|
43
43
|
export declare const ANNOTATION_ICONS: readonly ['Note', 'Comment', 'Key', 'Help', 'NewParagraph', 'Paragraph', 'Insert'];
|
|
44
44
|
/** rotate_pages が受け付ける回転角(時計回り・度) */
|
|
45
45
|
export declare const ROTATION_ANGLES: readonly [90, 180, 270];
|
|
46
|
+
/**
|
|
47
|
+
* レンダラが入力テキストに無くても描画しうる文字。
|
|
48
|
+
*
|
|
49
|
+
* フォントのサブセットは「入力テキスト」を基に行うため、レンダラが後から足す文字は
|
|
50
|
+
* サブセットに含まれず .notdef(豆腐)になる。実例: Markdown の `- item` は原文に
|
|
51
|
+
* 中黒を含まないが、箇条書きレンダラが '•' を描画する(v0.3.0〜v0.4.0 の回帰)。
|
|
52
|
+
* 番号リストの marker(`1. `)も同様に生成物。
|
|
53
|
+
*/
|
|
54
|
+
export declare const RENDERER_GENERATED_CHARS = "\u20220123456789. ";
|
|
46
55
|
/**
|
|
47
56
|
* フォントファイルのマジックナンバー(先頭 4 bytes)
|
|
48
57
|
* .ttc(TrueTypeCollection)は pdf-lib がサブセット化できないため検知して弾く
|
package/dist/constants.js
CHANGED
|
@@ -50,6 +50,15 @@ export const ANNOTATION_ICONS = [
|
|
|
50
50
|
];
|
|
51
51
|
/** rotate_pages が受け付ける回転角(時計回り・度) */
|
|
52
52
|
export const ROTATION_ANGLES = [90, 180, 270];
|
|
53
|
+
/**
|
|
54
|
+
* レンダラが入力テキストに無くても描画しうる文字。
|
|
55
|
+
*
|
|
56
|
+
* フォントのサブセットは「入力テキスト」を基に行うため、レンダラが後から足す文字は
|
|
57
|
+
* サブセットに含まれず .notdef(豆腐)になる。実例: Markdown の `- item` は原文に
|
|
58
|
+
* 中黒を含まないが、箇条書きレンダラが '•' を描画する(v0.3.0〜v0.4.0 の回帰)。
|
|
59
|
+
* 番号リストの marker(`1. `)も同様に生成物。
|
|
60
|
+
*/
|
|
61
|
+
export const RENDERER_GENERATED_CHARS = '•0123456789. ';
|
|
53
62
|
/**
|
|
54
63
|
* フォントファイルのマジックナンバー(先頭 4 bytes)
|
|
55
64
|
* .ttc(TrueTypeCollection)は pdf-lib がサブセット化できないため検知して弾く
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;CACV,CAAC;AAIX;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qBAAqB;IACrB,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE;IACjB,sCAAsC;IACtC,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,GAAG;IACf,6CAA6C;IAC7C,eAAe,EAAE,OAAO;IACxB,+BAA+B;IAC/B,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,KAAK;IACrB,4BAA4B;IAC5B,gBAAgB,EAAE,EAAE;IACpB,wBAAwB;IACxB,eAAe,EAAE,GAAG;IACpB,uBAAuB;IACvB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,CAAC;CACb,CAAC;AAEX,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAEzE,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,SAAS;IACT,KAAK;IACL,MAAM;IACN,cAAc;IACd,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,qCAAqC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAEvD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,mCAAmC;IACnC,GAAG,EAAE,MAAM;CACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACrB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;CACV,CAAC;AAIX;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qBAAqB;IACrB,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE;IACjB,sCAAsC;IACtC,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,GAAG;IACf,6CAA6C;IAC7C,eAAe,EAAE,OAAO;IACxB,+BAA+B;IAC/B,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,KAAK;IACrB,4BAA4B;IAC5B,gBAAgB,EAAE,EAAE;IACpB,wBAAwB;IACxB,eAAe,EAAE,GAAG;IACpB,uBAAuB;IACvB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,CAAC;CACb,CAAC;AAEX,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAEzE,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,SAAS;IACT,KAAK;IACL,MAAM;IACN,cAAc;IACd,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,qCAAqC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,mCAAmC;IACnC,GAAG,EAAE,MAAM;CACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
-
import { CallToolRequestSchema, ListToolsRequestSchema
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
9
9
|
import { PACKAGE_INFO } from './config.js';
|
|
10
10
|
import { tools } from './tools/definitions.js';
|
|
11
11
|
import { toolHandlers } from './tools/handlers.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,YAAY,CAAC,IAAI;IACvB,OAAO,EAAE,YAAY,CAAC,OAAO;CAC9B,EACD;IACE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;CAC5B,CACF,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK;CACN,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC7E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* 座標系は PDF 準拠(左下原点・pt)。生成系レンダラの top 基準とは異なる点に注意。
|
|
11
11
|
*/
|
|
12
|
-
import { PDFDocument, type RGB } from 'pdf-lib';
|
|
12
|
+
import { type PDFDocument, type RGB } from 'pdf-lib';
|
|
13
13
|
import type { AddAnnotationArgs } from '../types/index.js';
|
|
14
14
|
/** #rrggbb / #rgb を pdf-lib の RGB へ */
|
|
15
15
|
export declare function parseHexColor(hex: string): RGB;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* 座標系は PDF 準拠(左下原点・pt)。生成系レンダラの top 基準とは異なる点に注意。
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { PDFArray, PDFHexString, PDFName, PDFNumber, PDFString, rgb, } from 'pdf-lib';
|
|
13
13
|
/** #rrggbb / #rgb を pdf-lib の RGB へ */
|
|
14
14
|
export function parseHexColor(hex) {
|
|
15
15
|
const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotation.js","sourceRoot":"","sources":["../../src/services/annotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"annotation.js","sourceRoot":"","sources":["../../src/services/annotation.ts"],"names":[],"mappings":"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"}
|
package/dist/services/builder.js
CHANGED
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
* 埋め込みは入力テキストが確定した後(グリフ欠落ポリシー適用後)に行う。
|
|
8
8
|
*/
|
|
9
9
|
import { PDFDocument, rgb } from 'pdf-lib';
|
|
10
|
-
import { PAGE_SIZES } from '../constants.js';
|
|
11
10
|
import { DEFAULTS } from '../config.js';
|
|
12
|
-
import {
|
|
11
|
+
import { PAGE_SIZES, RENDERER_GENERATED_CHARS } from '../constants.js';
|
|
12
|
+
import { inferLang } from '../utils/lang.js';
|
|
13
|
+
import { applyMissingGlyphPolicy, embedFontFor, openFont, } from './font-manager.js';
|
|
13
14
|
import { LayoutEngine } from './layout.js';
|
|
14
15
|
import { finalizePdf } from './output.js';
|
|
15
16
|
import { assertRenderable } from './renderers/text.js';
|
|
17
|
+
import { StructTreeBuilder } from './struct-tree.js';
|
|
18
|
+
import { applyPdfuaCatalog } from './xmp.js';
|
|
16
19
|
export async function buildPdf(opts, inputTexts, render) {
|
|
17
20
|
const doc = await PDFDocument.create();
|
|
18
21
|
const source = await openFont(opts.fontPath);
|
|
@@ -29,11 +32,29 @@ export async function buildPdf(opts, inputTexts, render) {
|
|
|
29
32
|
const warnings = [...applied.warnings];
|
|
30
33
|
const title = opts.title ? applied.texts[0] : undefined;
|
|
31
34
|
const texts = opts.title ? applied.texts.slice(1) : applied.texts;
|
|
32
|
-
//
|
|
33
|
-
|
|
35
|
+
// 描画確定後のテキストでサブセットして埋め込む。
|
|
36
|
+
// レンダラが入力に無い文字(箇条書きの '•' 等)を足すため、それらも必ず含める
|
|
37
|
+
const loaded = await embedFontFor(doc, source, [...applied.texts, RENDERER_GENERATED_CHARS]);
|
|
34
38
|
const pageName = opts.pageSize ?? DEFAULTS.pageSize;
|
|
35
39
|
const [pageWidth, pageHeight] = PAGE_SIZES[pageName];
|
|
36
40
|
const fontSize = opts.fontSize ?? DEFAULTS.fontSize;
|
|
41
|
+
// タグ付き(PDF/UA)の準備
|
|
42
|
+
let struct;
|
|
43
|
+
let lang;
|
|
44
|
+
if (opts.tagged) {
|
|
45
|
+
if (!title) {
|
|
46
|
+
throw new Error('tagged: true requires "title" — PDF/UA (ISO 14289-1, 7.1) mandates a document title.');
|
|
47
|
+
}
|
|
48
|
+
lang = opts.lang;
|
|
49
|
+
if (!lang) {
|
|
50
|
+
const inferred = inferLang(applied.texts.join('\n'));
|
|
51
|
+
lang = inferred.lang;
|
|
52
|
+
warnings.push(inferred.confident
|
|
53
|
+
? `Inferred document language as "${lang}"; pass "lang" explicitly to override.`
|
|
54
|
+
: `Inferred document language as "${lang}", but the text has no kana so it could also be Chinese. Pass "lang" explicitly — a wrong /Lang makes screen readers mispronounce the text.`);
|
|
55
|
+
}
|
|
56
|
+
struct = new StructTreeBuilder(doc);
|
|
57
|
+
}
|
|
37
58
|
const engine = new LayoutEngine(doc, {
|
|
38
59
|
pageWidth,
|
|
39
60
|
pageHeight,
|
|
@@ -41,17 +62,24 @@ export async function buildPdf(opts, inputTexts, render) {
|
|
|
41
62
|
font: loaded.font,
|
|
42
63
|
fontSize,
|
|
43
64
|
lineHeight: DEFAULTS.lineHeight,
|
|
65
|
+
struct,
|
|
44
66
|
});
|
|
45
67
|
// タイトルが指定されていれば本文冒頭に見出しとして描画(メタデータにも finalizePdf で設定)
|
|
46
68
|
if (title) {
|
|
69
|
+
struct?.begin('H1');
|
|
47
70
|
engine.drawParagraph(title, {
|
|
48
71
|
size: fontSize + 7,
|
|
49
72
|
color: rgb(0, 0, 0),
|
|
50
73
|
lineHeight: 1.2,
|
|
51
74
|
spaceAfter: 12,
|
|
52
75
|
});
|
|
76
|
+
struct?.end();
|
|
53
77
|
}
|
|
54
78
|
render(engine, loaded, texts);
|
|
79
|
+
if (struct) {
|
|
80
|
+
struct.finalize();
|
|
81
|
+
applyPdfuaCatalog(doc, { title: title, author: opts.author, lang: lang });
|
|
82
|
+
}
|
|
55
83
|
const result = await finalizePdf(doc, opts, loaded.name);
|
|
56
84
|
if (warnings.length > 0)
|
|
57
85
|
result.warnings = warnings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/services/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAqB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/services/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/services/editor.js
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* 署名を保持する増分更新(incremental_save)は Tier C の課題。
|
|
14
14
|
*/
|
|
15
15
|
import { readFile } from 'node:fs/promises';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
16
|
+
import { basename, extname, join, resolve } from 'node:path';
|
|
17
|
+
import { degrees, PDFDocument } from 'pdf-lib';
|
|
18
18
|
import { LIMITS } from '../constants.js';
|
|
19
19
|
import { logger } from '../utils/logger.js';
|
|
20
20
|
import { parsePageSpec } from '../utils/page-spec.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/services/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/services/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* .ttc(TrueTypeCollection)は非対応のため検知して弾く。
|
|
15
15
|
*/
|
|
16
|
-
import { PDFDocument, type PDFFont } from 'pdf-lib';
|
|
16
|
+
import { type PDFDocument, type PDFFont } from 'pdf-lib';
|
|
17
17
|
import type { MissingGlyphPolicy } from '../types/index.js';
|
|
18
18
|
/** 埋め込み前のフォント情報(グリフ照会に使う) */
|
|
19
19
|
export interface FontSource {
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { readFile } from 'node:fs/promises';
|
|
17
17
|
import { basename } from 'node:path';
|
|
18
|
-
import { StandardFonts } from 'pdf-lib';
|
|
19
18
|
import fontkit from '@pdf-lib/fontkit';
|
|
19
|
+
import { StandardFonts } from 'pdf-lib';
|
|
20
20
|
import subsetFont from 'subset-font';
|
|
21
21
|
import { ENV_KEYS } from '../config.js';
|
|
22
22
|
import { FONT_MAGIC } from '../constants.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font-manager.js","sourceRoot":"","sources":["../../src/services/font-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"font-manager.js","sourceRoot":"","sources":["../../src/services/font-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* pdf-lib の低レベル API の上に、テキスト折り返し・改ページ・カーソル管理を載せる薄い層。
|
|
4
4
|
* 座標は「上端(top)基準」で管理し、見出し・本文・表でサイズが変わっても一貫して積み上げる。
|
|
5
5
|
*/
|
|
6
|
-
import { type PDFDocument, type
|
|
6
|
+
import { type PDFDocument, type PDFFont, type PDFPage, type RGB } from 'pdf-lib';
|
|
7
|
+
import type { StructTreeBuilder } from './struct-tree.js';
|
|
7
8
|
export interface LayoutOptions {
|
|
8
9
|
pageWidth: number;
|
|
9
10
|
pageHeight: number;
|
|
@@ -11,6 +12,11 @@ export interface LayoutOptions {
|
|
|
11
12
|
font: PDFFont;
|
|
12
13
|
fontSize: number;
|
|
13
14
|
lineHeight: number;
|
|
15
|
+
/**
|
|
16
|
+
* タグ付き PDF の構造木ビルダー。
|
|
17
|
+
* 指定すると全描画が BDC/EMC で囲まれる(PDF/UA 7.1-3)。
|
|
18
|
+
*/
|
|
19
|
+
struct?: StructTreeBuilder;
|
|
14
20
|
}
|
|
15
21
|
export interface DrawTextOptions {
|
|
16
22
|
font?: PDFFont;
|
|
@@ -46,6 +52,16 @@ export declare class LayoutEngine {
|
|
|
46
52
|
get defaultSize(): number;
|
|
47
53
|
get cursorTop(): number;
|
|
48
54
|
set cursorTop(v: number);
|
|
55
|
+
/** タグ付き生成のとき構造木ビルダーを返す(未指定なら undefined) */
|
|
56
|
+
get struct(): StructTreeBuilder | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* 実コンテンツの描画。タグ付きなら BDC/EMC で囲む。
|
|
59
|
+
* 構造要素の begin/end は呼び出し側(renderer)が行う。
|
|
60
|
+
* page へ直接描画する renderer(表・コード等)はこれを経由すること。
|
|
61
|
+
*/
|
|
62
|
+
drawTaggedContent(draw: () => void): void;
|
|
63
|
+
/** 意味を持たない描画(罫線・背景)。タグ付きなら Artifact で囲む */
|
|
64
|
+
drawArtifact(draw: () => void): void;
|
|
49
65
|
newPage(): void;
|
|
50
66
|
/** height 分の余白が下端まで残っていなければ改ページ */
|
|
51
67
|
ensureSpace(height: number): void;
|
package/dist/services/layout.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* pdf-lib の低レベル API の上に、テキスト折り返し・改ページ・カーソル管理を載せる薄い層。
|
|
4
4
|
* 座標は「上端(top)基準」で管理し、見出し・本文・表でサイズが変わっても一貫して積み上げる。
|
|
5
5
|
*/
|
|
6
|
-
import { rgb
|
|
6
|
+
import { rgb } from 'pdf-lib';
|
|
7
7
|
/** ベースライン近似係数(グリフ上端からベースラインまで ≒ size * この値) */
|
|
8
8
|
const ASCENT_RATIO = 0.8;
|
|
9
9
|
/**
|
|
@@ -12,7 +12,8 @@ const ASCENT_RATIO = 0.8;
|
|
|
12
12
|
*/
|
|
13
13
|
export function hasNonLatin1(text) {
|
|
14
14
|
for (const ch of text) {
|
|
15
|
-
|
|
15
|
+
const cp = ch.codePointAt(0);
|
|
16
|
+
if (cp !== undefined && cp > 0xff)
|
|
16
17
|
return true;
|
|
17
18
|
}
|
|
18
19
|
return false;
|
|
@@ -139,6 +140,32 @@ export class LayoutEngine {
|
|
|
139
140
|
set cursorTop(v) {
|
|
140
141
|
this._top = v;
|
|
141
142
|
}
|
|
143
|
+
/** タグ付き生成のとき構造木ビルダーを返す(未指定なら undefined) */
|
|
144
|
+
get struct() {
|
|
145
|
+
return this.opts.struct;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 実コンテンツの描画。タグ付きなら BDC/EMC で囲む。
|
|
149
|
+
* 構造要素の begin/end は呼び出し側(renderer)が行う。
|
|
150
|
+
* page へ直接描画する renderer(表・コード等)はこれを経由すること。
|
|
151
|
+
*/
|
|
152
|
+
drawTaggedContent(draw) {
|
|
153
|
+
if (this.opts.struct) {
|
|
154
|
+
this.opts.struct.markContent(this._page, draw);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
draw();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** 意味を持たない描画(罫線・背景)。タグ付きなら Artifact で囲む */
|
|
161
|
+
drawArtifact(draw) {
|
|
162
|
+
if (this.opts.struct) {
|
|
163
|
+
this.opts.struct.markArtifact(this._page, draw);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
draw();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
142
169
|
newPage() {
|
|
143
170
|
this._page = this.doc.addPage([this.opts.pageWidth, this.opts.pageHeight]);
|
|
144
171
|
this._top = this.opts.pageHeight - this.opts.margin;
|
|
@@ -165,12 +192,15 @@ export class LayoutEngine {
|
|
|
165
192
|
for (const line of lines) {
|
|
166
193
|
this.ensureSpace(leading);
|
|
167
194
|
if (line !== '') {
|
|
168
|
-
this.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
195
|
+
const y = this._top - size * ASCENT_RATIO;
|
|
196
|
+
this.drawTaggedContent(() => {
|
|
197
|
+
this._page.drawText(line, {
|
|
198
|
+
x: this.leftX + leftIndent,
|
|
199
|
+
y,
|
|
200
|
+
size,
|
|
201
|
+
font,
|
|
202
|
+
color,
|
|
203
|
+
});
|
|
174
204
|
});
|
|
175
205
|
}
|
|
176
206
|
this._top -= leading;
|
|
@@ -186,11 +216,14 @@ export class LayoutEngine {
|
|
|
186
216
|
const spaceAfter = options.spaceAfter ?? 8;
|
|
187
217
|
this.moveDown(spaceBefore);
|
|
188
218
|
this.ensureSpace(thickness + spaceAfter);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
219
|
+
// 水平線は意味を持たない装飾 → Artifact(PDF/UA 7.1-3)
|
|
220
|
+
this.drawArtifact(() => {
|
|
221
|
+
this._page.drawLine({
|
|
222
|
+
start: { x: this.leftX, y: this._top },
|
|
223
|
+
end: { x: this.leftX + this.contentWidth, y: this._top },
|
|
224
|
+
thickness,
|
|
225
|
+
color,
|
|
226
|
+
});
|
|
194
227
|
});
|
|
195
228
|
this.moveDown(spaceAfter);
|
|
196
229
|
}
|