@shuji-bonji/pdf-writer-mcp 0.2.0 → 0.3.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/README.md CHANGED
@@ -35,7 +35,7 @@ graph LR
35
35
  - **7 つの編集ツール**: メタデータ更新、結合・分割・抽出・削除・並べ替え・回転
36
36
  - **署名ガード**: 電子署名済み PDF(`/ByteRange` 検知)の編集は既定でエラーにし、
37
37
  署名の意図しない無効化を防止(`allowBreakingSignatures: true` で明示的に続行可能)
38
- - **日本語対応**: `.ttf` / `.otf` フォントを fontkit でサブセット埋め込み(16MB のフォントでも出力は数十 KB)
38
+ - **日本語対応**: `.ttf` / `.otf` フォントを harfbuzz でサブセット埋め込み(4.5MB のフォントでも出力は数十 KB)
39
39
  - **抽出・検索・コピー可能**: 埋め込みフォントでも ToUnicode CMap が付与されるため、
40
40
  生成した PDF のテキストは選択・コピー・全文検索・スクリーンリーダ読み上げが可能
41
41
  - **自動レイアウト**: テキスト折り返し(日英混在・長語の強制分割)、改ページ、表の改ページ時ヘッダ再描画
@@ -100,7 +100,19 @@ npm run typecheck # tsc --noEmit
100
100
  TTCollection('NotoSansCJK-Regular.ttc').fonts[0].save('NotoSansCJKjp-Regular.otf')"
101
101
  ```
102
102
 
103
- - 日本語フォントの入手先の例: [Noto Sans JP](https://fonts.google.com/noto/specimen/Noto+Sans+JP)(SIL OFL)。
103
+ - 日本語フォントの入手先の例:
104
+ [notofonts/noto-cjk の日本語サブセット OTF](https://github.com/notofonts/noto-cjk/tree/main/Sans/SubsetOTF/JP)(SIL OFL、静的・単一フェイス)。
105
+
106
+ ### フォント未収録文字(グリフ欠落)の扱い
107
+
108
+ 指定フォントに存在しない文字(例: Noto Sans JP に無い ✔ U+2714 や絵文字)を検知した場合の
109
+ 挙動を `onMissingGlyph` で選べます(v0.2.1〜):
110
+
111
+ | 値 | 挙動 |
112
+ |----|------|
113
+ | `error`(既定) | 欠落文字を `"✔" (U+2714)` 形式で列挙してエラー。無警告の空白出力を防ぐ |
114
+ | `replace` | 〓(下駄記号)に置換して生成し、`warnings` で報告 |
115
+ | `ignore` | そのまま生成(該当文字は空白になる)し、`warnings` で報告 |
104
116
 
105
117
  ## ツール
106
118
 
@@ -119,6 +131,7 @@ npm run typecheck # tsc --noEmit
119
131
  | `margin` | number | | 余白 pt(既定 56、0〜300) |
120
132
  | `title` | string | | タイトル(メタデータ+冒頭見出し) |
121
133
  | `author` | string | | 作成者(メタデータ) |
134
+ | `onMissingGlyph` | enum | | フォント未収録文字の扱い: error(既定)/ replace / ignore |
122
135
 
123
136
  ### `create_markdown_pdf`
124
137
 
@@ -179,9 +192,10 @@ Markdown → PDF。対応要素: 見出し / 段落 / 箇条書き・番号リ
179
192
  `pdftotext` 等で本文を抽出できます。この性質は `tests/extract.test.ts` の回帰テストで担保しています
180
193
  (ToUnicode に `日 → U+65E5` のマッピングが含まれることを検証)。
181
194
 
182
- > 補足: 一部の PDF ビューア(poppler 系)は埋め込み CFF サブセットに対して
183
- > `Embedded font file may be invalid` という警告を表示することがありますが、
184
- > 表示・抽出・`qpdf --check` はいずれも正常で、実害はありません。
195
+ > **v0.3.0 の重要な修正**: v0.2.1 以前は pdf-lib(fontkit)のサブセッタを使っており、
196
+ > 日本語フォントのグリフが破壊されて**すべてのビューアで文字が豆腐・空白になる**不具合がありました
197
+ > (テキスト抽出だけは正常なため気づきにくい状態でした)。v0.3.0 harfbuzz による事前サブセットに
198
+ > 切り替え、サイズはより小さく(実測 24KB → 14.5KB)、描画は正常になっています。
185
199
 
186
200
  ## 既知の制約
187
201
 
@@ -1,10 +1,17 @@
1
1
  /**
2
2
  * Builder
3
- * 「doc 生成フォント埋め込みレイアウトエンジン → 描画 → 保存」の共通フロー。
3
+ * 「フォント読込 グリフ検査 サブセット埋め込みレイアウト → 描画 → 保存」の共通フロー。
4
4
  * 各ツールハンドラは render コールバックだけ差し替えて使う。
5
+ *
6
+ * フォントのサブセットは「実際に描画するテキスト」に依存するため、
7
+ * 埋め込みは入力テキストが確定した後(グリフ欠落ポリシー適用後)に行う。
5
8
  */
6
9
  import type { CommonCreateOptions, CreateResult } from '../types/index.js';
7
10
  import { type LoadedFont } from './font-manager.js';
8
11
  import { LayoutEngine } from './layout.js';
9
- export type RenderFn = (engine: LayoutEngine, loaded: LoadedFont) => void;
10
- export declare function buildPdf(opts: CommonCreateOptions, render: RenderFn): Promise<CreateResult>;
12
+ /**
13
+ * render コールバック。texts には onMissingGlyph ポリシー適用済みの
14
+ * 入力テキスト(buildPdf の inputTexts と同順)が渡される。
15
+ */
16
+ export type RenderFn = (engine: LayoutEngine, loaded: LoadedFont, texts: string[]) => void;
17
+ export declare function buildPdf(opts: CommonCreateOptions, inputTexts: string[], render: RenderFn): Promise<CreateResult>;
@@ -1,18 +1,36 @@
1
1
  /**
2
2
  * Builder
3
- * 「doc 生成フォント埋め込みレイアウトエンジン → 描画 → 保存」の共通フロー。
3
+ * 「フォント読込 グリフ検査 サブセット埋め込みレイアウト → 描画 → 保存」の共通フロー。
4
4
  * 各ツールハンドラは render コールバックだけ差し替えて使う。
5
+ *
6
+ * フォントのサブセットは「実際に描画するテキスト」に依存するため、
7
+ * 埋め込みは入力テキストが確定した後(グリフ欠落ポリシー適用後)に行う。
5
8
  */
6
9
  import { PDFDocument, rgb } from 'pdf-lib';
7
10
  import { PAGE_SIZES } from '../constants.js';
8
11
  import { DEFAULTS } from '../config.js';
9
- import { loadFont } from './font-manager.js';
12
+ import { applyMissingGlyphPolicy, embedFontFor, openFont } from './font-manager.js';
10
13
  import { LayoutEngine } from './layout.js';
11
14
  import { finalizePdf } from './output.js';
12
15
  import { assertRenderable } from './renderers/text.js';
13
- export async function buildPdf(opts, render) {
16
+ export async function buildPdf(opts, inputTexts, render) {
14
17
  const doc = await PDFDocument.create();
15
- const loaded = await loadFont(doc, opts.fontPath);
18
+ const source = await openFont(opts.fontPath);
19
+ // 標準フォント × 非 Latin-1 は、この時点で分かりやすく弾く
20
+ for (const t of inputTexts)
21
+ assertRenderable(t, source);
22
+ if (opts.title)
23
+ assertRenderable(opts.title, source);
24
+ // フォント未収録文字の検査・置換(埋め込みフォントのみ)
25
+ // title もサブセット対象に含める必要があるため、先頭に連結して一括処理する
26
+ const policy = opts.onMissingGlyph ?? 'error';
27
+ const withTitle = opts.title ? [opts.title, ...inputTexts] : inputTexts;
28
+ const applied = applyMissingGlyphPolicy(withTitle, source, policy);
29
+ const warnings = [...applied.warnings];
30
+ const title = opts.title ? applied.texts[0] : undefined;
31
+ const texts = opts.title ? applied.texts.slice(1) : applied.texts;
32
+ // 描画確定後のテキストでサブセットして埋め込む
33
+ const loaded = await embedFontFor(doc, source, applied.texts);
16
34
  const pageName = opts.pageSize ?? DEFAULTS.pageSize;
17
35
  const [pageWidth, pageHeight] = PAGE_SIZES[pageName];
18
36
  const fontSize = opts.fontSize ?? DEFAULTS.fontSize;
@@ -25,16 +43,18 @@ export async function buildPdf(opts, render) {
25
43
  lineHeight: DEFAULTS.lineHeight,
26
44
  });
27
45
  // タイトルが指定されていれば本文冒頭に見出しとして描画(メタデータにも finalizePdf で設定)
28
- if (opts.title) {
29
- assertRenderable(opts.title, loaded);
30
- engine.drawParagraph(opts.title, {
46
+ if (title) {
47
+ engine.drawParagraph(title, {
31
48
  size: fontSize + 7,
32
49
  color: rgb(0, 0, 0),
33
50
  lineHeight: 1.2,
34
51
  spaceAfter: 12,
35
52
  });
36
53
  }
37
- render(engine, loaded);
38
- return finalizePdf(doc, opts, loaded.name);
54
+ render(engine, loaded, texts);
55
+ const result = await finalizePdf(doc, opts, loaded.name);
56
+ if (warnings.length > 0)
57
+ result.warnings = warnings;
58
+ return result;
39
59
  }
40
60
  //# sourceMappingURL=builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/services/builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAqB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAyB,EACzB,MAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAiB,IAAI,CAAC,QAAQ,IAAK,QAAQ,CAAC,QAAyB,CAAC;IACpF,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAEpD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE;QACnC,SAAS;QACT,UAAU;QACV,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;QACtC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ;QACR,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC;IAEH,sDAAsD;IACtD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE;YAC/B,IAAI,EAAE,QAAQ,GAAG,CAAC;YAClB,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACnB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvB,OAAO,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/services/builder.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,56 @@
1
1
  /**
2
2
  * Font Manager
3
3
  * カスタムフォント(.ttf/.otf)の埋め込みと、標準フォントへのフォールバックを担う。
4
- * .ttc(TrueTypeCollection)は pdf-lib がサブセット化できないため検知して弾く。
4
+ *
5
+ * サブセット戦略(v0.3.0 で変更・ADR-2 改訂):
6
+ * pdf-lib の `embedFont(subset: true)`(= fontkit のサブセッタ)は、Noto Sans JP のような
7
+ * CJK フォントでグリフを取りこぼし、**描画が豆腐化する**(poppler: "Embedded font file may be
8
+ * invalid" → "Couldn't create a font" / Acrobat: 一部の文字が空白)。ToUnicode は正しいため
9
+ * テキスト抽出だけは通り、破損に気づきにくい。
10
+ * そこで harfbuzz(subset-font)で**事前にサブセット**し、pdf-lib には subset:false で
11
+ * 「すでに小さいフォント」を埋め込ませる。実測(本文 35 文字):
12
+ * fontkit subset:true = 24KB(破損) / subset:false = 3.9MB(正常) / harfbuzz = 14.5KB(正常)
13
+ *
14
+ * .ttc(TrueTypeCollection)は非対応のため検知して弾く。
5
15
  */
6
16
  import { PDFDocument, type PDFFont } from 'pdf-lib';
17
+ import type { MissingGlyphPolicy } from '../types/index.js';
18
+ /** 埋め込み前のフォント情報(グリフ照会に使う) */
19
+ export interface FontSource {
20
+ /** 元のフォントバイト列。標準フォントの場合は undefined */
21
+ bytes?: Uint8Array;
22
+ name: string;
23
+ isStandard: boolean;
24
+ /** コードポイントのグリフ有無(埋め込みフォントのみ) */
25
+ hasGlyph?: (codePoint: number) => boolean;
26
+ }
7
27
  export interface LoadedFont {
8
28
  font: PDFFont;
9
29
  /** 表示用フォント名 */
10
30
  name: string;
11
31
  /** 標準フォント(英数字のみ)か否か。true の場合、日本語描画は不可 */
12
32
  isStandard: boolean;
33
+ /** コードポイントのグリフ有無(埋め込みフォントのみ。標準フォントは undefined) */
34
+ hasGlyph?: (codePoint: number) => boolean;
13
35
  }
14
36
  /**
15
- * フォントを読み込んで doc に埋め込む。
37
+ * フォントファイルを開き、グリフ照会用の情報を返す(まだ doc には埋め込まない)。
16
38
  * @param fontPath 明示指定のフォントパス(優先)。未指定なら環境変数 → 標準フォント。
17
39
  */
18
- export declare function loadFont(doc: PDFDocument, fontPath?: string): Promise<LoadedFont>;
40
+ export declare function openFont(fontPath?: string): Promise<FontSource>;
41
+ /**
42
+ * 実際に描画するテキストに合わせてフォントをサブセットし、doc に埋め込む。
43
+ * @param texts 描画予定の全テキスト(グリフ欠落ポリシー適用後のもの)
44
+ */
45
+ export declare function embedFontFor(doc: PDFDocument, source: FontSource, texts: string[]): Promise<LoadedFont>;
46
+ /**
47
+ * フォントに存在しない文字の扱い(onMissingGlyph オプション)を適用する。
48
+ *
49
+ * - error(既定): 欠落文字を列挙してエラー。無警告の空白(.notdef)出力を防ぐ
50
+ * - replace: 欠落文字を 〓(フォントに無ければ ?)へ置換し、warnings で報告
51
+ * - ignore: そのまま描画(空白になる)。warnings で報告
52
+ */
53
+ export declare function applyMissingGlyphPolicy(texts: string[], source: Pick<FontSource, 'hasGlyph' | 'name'>, policy?: MissingGlyphPolicy): {
54
+ texts: string[];
55
+ warnings: string[];
56
+ };
@@ -1,12 +1,23 @@
1
1
  /**
2
2
  * Font Manager
3
3
  * カスタムフォント(.ttf/.otf)の埋め込みと、標準フォントへのフォールバックを担う。
4
- * .ttc(TrueTypeCollection)は pdf-lib がサブセット化できないため検知して弾く。
4
+ *
5
+ * サブセット戦略(v0.3.0 で変更・ADR-2 改訂):
6
+ * pdf-lib の `embedFont(subset: true)`(= fontkit のサブセッタ)は、Noto Sans JP のような
7
+ * CJK フォントでグリフを取りこぼし、**描画が豆腐化する**(poppler: "Embedded font file may be
8
+ * invalid" → "Couldn't create a font" / Acrobat: 一部の文字が空白)。ToUnicode は正しいため
9
+ * テキスト抽出だけは通り、破損に気づきにくい。
10
+ * そこで harfbuzz(subset-font)で**事前にサブセット**し、pdf-lib には subset:false で
11
+ * 「すでに小さいフォント」を埋め込ませる。実測(本文 35 文字):
12
+ * fontkit subset:true = 24KB(破損) / subset:false = 3.9MB(正常) / harfbuzz = 14.5KB(正常)
13
+ *
14
+ * .ttc(TrueTypeCollection)は非対応のため検知して弾く。
5
15
  */
6
16
  import { readFile } from 'node:fs/promises';
7
17
  import { basename } from 'node:path';
8
18
  import { StandardFonts } from 'pdf-lib';
9
19
  import fontkit from '@pdf-lib/fontkit';
20
+ import subsetFont from 'subset-font';
10
21
  import { ENV_KEYS } from '../config.js';
11
22
  import { FONT_MAGIC } from '../constants.js';
12
23
  import { logger } from '../utils/logger.js';
@@ -18,15 +29,14 @@ function magic4(bytes) {
18
29
  return String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);
19
30
  }
20
31
  /**
21
- * フォントを読み込んで doc に埋め込む。
32
+ * フォントファイルを開き、グリフ照会用の情報を返す(まだ doc には埋め込まない)。
22
33
  * @param fontPath 明示指定のフォントパス(優先)。未指定なら環境変数 → 標準フォント。
23
34
  */
24
- export async function loadFont(doc, fontPath) {
35
+ export async function openFont(fontPath) {
25
36
  const resolvedPath = fontPath ?? process.env[ENV_KEYS.DEFAULT_FONT];
26
37
  if (!resolvedPath) {
27
- const font = await doc.embedFont(StandardFonts.Helvetica);
28
38
  logger.info(CTX, 'No fontPath given; using StandardFonts.Helvetica (ASCII only)');
29
- return { font, name: 'Helvetica', isStandard: true };
39
+ return { name: 'Helvetica', isStandard: true };
30
40
  }
31
41
  let bytes;
32
42
  try {
@@ -40,20 +50,106 @@ export async function loadFont(doc, fontPath) {
40
50
  }
41
51
  if (magic4(bytes) === FONT_MAGIC.TTC) {
42
52
  throw new Error(`Font file is a TrueTypeCollection (.ttc): ${resolvedPath}. ` +
43
- `pdf-lib cannot subset .ttc directly. Extract a single face to .otf/.ttf first ` +
53
+ `Extract a single face to .otf/.ttf first ` +
44
54
  `(e.g. Python fonttools: TTCollection(path).fonts[i].save('out.otf')).`);
45
55
  }
56
+ // グリフ有無の照会用にパースする(失敗しても埋め込み自体は続行)
57
+ let hasGlyph;
58
+ try {
59
+ const fk = fontkit.create(Buffer.from(bytes));
60
+ hasGlyph = (cp) => fk.hasGlyphForCodePoint(cp);
61
+ }
62
+ catch {
63
+ logger.warn(CTX, 'Glyph-coverage check unavailable (fontkit parse failed)');
64
+ }
65
+ return { bytes, name: basename(resolvedPath), isStandard: false, hasGlyph };
66
+ }
67
+ /**
68
+ * 実際に描画するテキストに合わせてフォントをサブセットし、doc に埋め込む。
69
+ * @param texts 描画予定の全テキスト(グリフ欠落ポリシー適用後のもの)
70
+ */
71
+ export async function embedFontFor(doc, source, texts) {
72
+ if (source.isStandard || !source.bytes) {
73
+ const font = await doc.embedFont(StandardFonts.Helvetica);
74
+ return { font, name: source.name, isStandard: true };
75
+ }
46
76
  doc.registerFontkit(fontkit);
77
+ // harfbuzz で使用グリフのみに絞る。失敗時は元フォントをそのまま埋め込む(正しさ優先・肥大は許容)
78
+ let toEmbed = source.bytes;
79
+ const used = texts.join('') || ' ';
80
+ try {
81
+ toEmbed = await subsetFont(Buffer.from(source.bytes), used, { targetFormat: 'sfnt' });
82
+ logger.info(CTX, `Subset ${source.name} with harfbuzz: ${source.bytes.length} -> ${toEmbed.length} bytes`);
83
+ }
84
+ catch (error) {
85
+ const msg = error instanceof Error ? error.message : String(error);
86
+ logger.warn(CTX, `harfbuzz subsetting failed (${msg}); embedding the full font instead`);
87
+ }
47
88
  let font;
48
89
  try {
49
- font = await doc.embedFont(bytes, { subset: true });
90
+ // subset:false サブセットは済んでいる。pdf-lib(fontkit) の再サブセットは
91
+ // グリフ破損を招くため使わない(上部コメント参照)
92
+ font = await doc.embedFont(toEmbed, { subset: false });
50
93
  }
51
94
  catch (error) {
52
95
  const msg = error instanceof Error ? error.message : String(error);
53
- throw new Error(`Failed to embed font ${resolvedPath}: ${msg}`);
96
+ throw new Error(`Failed to embed font ${source.name}: ${msg}`);
97
+ }
98
+ logger.info(CTX, `Embedded custom font: ${source.name}`);
99
+ return { font, name: source.name, isStandard: false, hasGlyph: source.hasGlyph };
100
+ }
101
+ /** 〓(下駄記号): 日本語組版でのグリフ欠落の慣習的代替 */
102
+ const GETA = 0x3013;
103
+ /**
104
+ * フォントに存在しない文字の扱い(onMissingGlyph オプション)を適用する。
105
+ *
106
+ * - error(既定): 欠落文字を列挙してエラー。無警告の空白(.notdef)出力を防ぐ
107
+ * - replace: 欠落文字を 〓(フォントに無ければ ?)へ置換し、warnings で報告
108
+ * - ignore: そのまま描画(空白になる)。warnings で報告
109
+ */
110
+ export function applyMissingGlyphPolicy(texts, source, policy = 'error') {
111
+ const hasGlyph = source.hasGlyph;
112
+ // 標準フォントは assertRenderable(Latin-1 検査)側で扱うため対象外
113
+ if (!hasGlyph)
114
+ return { texts, warnings: [] };
115
+ const missing = new Set();
116
+ for (const text of texts) {
117
+ for (const ch of text) {
118
+ if (ch === '\n' || ch === '\r' || ch === '\t')
119
+ continue;
120
+ if (!hasGlyph(ch.codePointAt(0)))
121
+ missing.add(ch);
122
+ }
123
+ }
124
+ if (missing.size === 0)
125
+ return { texts, warnings: [] };
126
+ const list = [...missing]
127
+ .slice(0, 10)
128
+ .map((ch) => `"${ch}" (U+${ch.codePointAt(0).toString(16).toUpperCase().padStart(4, '0')})`)
129
+ .join(', ');
130
+ const suffix = missing.size > 10 ? ` and ${missing.size - 10} more` : '';
131
+ if (policy === 'error') {
132
+ throw new Error(`The font "${source.name}" has no glyph for: ${list}${suffix}. ` +
133
+ 'These characters would render as blank boxes. ' +
134
+ 'Remove/replace them, use a font that covers them, ' +
135
+ 'or set onMissingGlyph to "replace" (substitutes 〓) or "ignore".');
136
+ }
137
+ if (policy === 'ignore') {
138
+ return {
139
+ texts,
140
+ warnings: [
141
+ `Rendered blank glyphs for unsupported characters (onMissingGlyph=ignore): ${list}${suffix}`,
142
+ ],
143
+ };
54
144
  }
55
- const name = basename(resolvedPath);
56
- logger.info(CTX, `Embedded custom font: ${name}`);
57
- return { font, name, isStandard: false };
145
+ // replace
146
+ const replacement = hasGlyph(GETA) ? '〓' : '?';
147
+ const replaced = texts.map((text) => [...text].map((ch) => (missing.has(ch) ? replacement : ch)).join(''));
148
+ return {
149
+ texts: replaced,
150
+ warnings: [
151
+ `Replaced ${missing.size} unsupported character(s) with "${replacement}": ${list}${suffix}`,
152
+ ],
153
+ };
58
154
  }
59
155
  //# sourceMappingURL=font-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"font-manager.js","sourceRoot":"","sources":["../../src/services/font-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAe,aAAa,EAAgB,MAAM,SAAS,CAAC;AACnE,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,GAAG,GAAG,aAAa,CAAC;AAE1B;;GAEG;AACH,SAAS,MAAM,CAAC,KAAiB;IAC/B,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAgB,EAAE,QAAiB;IAChE,MAAM,YAAY,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEpE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,+DAA+D,CAAC,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,KAAiB,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,6CAA6C,YAAY,IAAI;YAC3D,gFAAgF;YAChF,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"font-manager.js","sourceRoot":"","sources":["../../src/services/font-manager.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * プレーンテキスト → PDF。空行を段落区切りとして扱う。
4
4
  */
5
5
  import { LayoutEngine } from '../layout.js';
6
- import type { LoadedFont } from '../font-manager.js';
6
+ import type { FontSource, LoadedFont } from '../font-manager.js';
7
7
  export declare function renderText(engine: LayoutEngine, text: string, loaded: LoadedFont): void;
8
8
  /** 標準フォントに日本語などを渡すと壊れるため、事前に分かりやすく弾く */
9
- export declare function assertRenderable(text: string, loaded: LoadedFont): void;
9
+ export declare function assertRenderable(text: string, loaded: Pick<FontSource | LoadedFont, 'isStandard'>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/services/renderers/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAgB,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,MAAoB,EAAE,IAAY,EAAE,MAAkB;IAC/E,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/B,kBAAkB;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;YACzB,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACzB,UAAU,EAAE,QAAQ,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAkB;IAC/D,IAAI,MAAM,CAAC,UAAU,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC5F,oEAAoE;YACpE,cAAc,iBAAiB,wBAAwB,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/services/renderers/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAgB,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,MAAoB,EAAE,IAAY,EAAE,MAAkB;IAC/E,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/B,kBAAkB;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;YACzB,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACzB,UAAU,EAAE,QAAQ,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmD;IAChG,IAAI,MAAM,CAAC,UAAU,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC5F,oEAAoE;YACpE,cAAc,iBAAiB,wBAAwB,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -41,6 +41,11 @@ export declare const tools: readonly [{
41
41
  readonly type: 'string';
42
42
  readonly description: 'PDF 作成者(メタデータ)。';
43
43
  };
44
+ readonly onMissingGlyph: {
45
+ readonly type: 'string';
46
+ readonly enum: readonly ['error', 'replace', 'ignore'];
47
+ readonly description: string;
48
+ };
44
49
  readonly text: {
45
50
  readonly type: 'string';
46
51
  readonly description: '本文テキスト。\\n で改行、空行で段落区切り。';
@@ -87,6 +92,11 @@ export declare const tools: readonly [{
87
92
  readonly type: 'string';
88
93
  readonly description: 'PDF 作成者(メタデータ)。';
89
94
  };
95
+ readonly onMissingGlyph: {
96
+ readonly type: 'string';
97
+ readonly enum: readonly ['error', 'replace', 'ignore'];
98
+ readonly description: string;
99
+ };
90
100
  readonly markdown: {
91
101
  readonly type: 'string';
92
102
  readonly description: 'Markdown 文字列。';
@@ -133,6 +143,11 @@ export declare const tools: readonly [{
133
143
  readonly type: 'string';
134
144
  readonly description: 'PDF 作成者(メタデータ)。';
135
145
  };
146
+ readonly onMissingGlyph: {
147
+ readonly type: 'string';
148
+ readonly enum: readonly ['error', 'replace', 'ignore'];
149
+ readonly description: string;
150
+ };
136
151
  readonly headers: {
137
152
  readonly type: 'array';
138
153
  readonly items: {
@@ -37,6 +37,12 @@ const commonProperties = {
37
37
  type: 'string',
38
38
  description: 'PDF 作成者(メタデータ)。',
39
39
  },
40
+ onMissingGlyph: {
41
+ type: 'string',
42
+ enum: ['error', 'replace', 'ignore'],
43
+ description: 'フォントに存在しない文字(例: Noto Sans JP に無い ✔ U+2714)の扱い。' +
44
+ 'error(既定)=欠落文字を列挙してエラー / replace=〓 に置換して警告 / ignore=空白のまま描画して警告。',
45
+ },
40
46
  };
41
47
  const editCommonProperties = {
42
48
  outputPath: {
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
@@ -14,22 +14,30 @@ import { renderTable } from '../services/renderers/table.js';
14
14
  import { setMetadata, mergePdfs, splitPdf, extractPages, deletePages, reorderPages, rotatePages, } from '../services/editor.js';
15
15
  export async function handleCreateTextPdf(args) {
16
16
  validateCreateTextArgs(args);
17
- return buildPdf(args, (engine, loaded) => renderText(engine, args.text, loaded));
17
+ return buildPdf(args, [args.text], (engine, loaded, [text]) => renderText(engine, text, loaded));
18
18
  }
19
19
  export async function handleCreateMarkdownPdf(args) {
20
20
  validateCreateMarkdownArgs(args);
21
- return buildPdf(args, (engine, loaded) => renderMarkdown(engine, args.markdown, loaded));
21
+ return buildPdf(args, [args.markdown], (engine, loaded, [markdown]) => renderMarkdown(engine, markdown, loaded));
22
22
  }
23
23
  export async function handleCreateTablePdf(args) {
24
24
  validateCreateTableArgs(args);
25
- return buildPdf(args, (engine, loaded) => {
25
+ // ポリシー適用のためセルを平坦化して渡し、render 内で元の形に戻す
26
+ const cells = [...args.headers, ...args.rows.flat()];
27
+ return buildPdf(args, cells, (engine, loaded, texts) => {
26
28
  // 表は標準フォントで日本語不可のため、描画前に検査
27
- const flat = [...args.headers, ...args.rows.flat()].join('\n');
28
- if (loaded.isStandard && /[^\x00-\xff]/.test(flat)) {
29
+ if (loaded.isStandard && /[^\x00-\xff]/.test(texts.join('\n'))) {
29
30
  throw new Error('The table contains non-Latin characters (e.g. Japanese) but no embeddable font was provided. ' +
30
31
  'Pass "fontPath" pointing to a .ttf/.otf font, or set PDF_WRITER_FONT.');
31
32
  }
32
- renderTable(engine, args.headers, args.rows);
33
+ const headers = texts.slice(0, args.headers.length);
34
+ const rows = [];
35
+ let i = args.headers.length;
36
+ for (const row of args.rows) {
37
+ rows.push(texts.slice(i, i + row.length));
38
+ i += row.length;
39
+ }
40
+ renderTable(engine, headers, rows);
33
41
  });
34
42
  }
35
43
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,13 @@
2
2
  * 共有型
3
3
  */
4
4
  import type { PageSizeName } from '../constants.js';
5
+ /**
6
+ * フォントに存在しない文字(グリフ欠落)の扱い
7
+ * - error: 欠落文字を列挙してエラー(既定)
8
+ * - replace: 〓 に置換して警告
9
+ * - ignore: そのまま描画(空白になる)して警告
10
+ */
11
+ export type MissingGlyphPolicy = 'error' | 'replace' | 'ignore';
5
12
  /**
6
13
  * すべての生成ツールに共通するオプション
7
14
  */
@@ -22,6 +29,8 @@ export interface CommonCreateOptions {
22
29
  title?: string;
23
30
  /** PDF メタデータ: 作成者 */
24
31
  author?: string;
32
+ /** フォント未収録文字の扱い。既定 'error' */
33
+ onMissingGlyph?: MissingGlyphPolicy;
25
34
  }
26
35
  export interface CreateTextArgs extends CommonCreateOptions {
27
36
  /** 本文テキスト。\n で改行、空行で段落区切り */
@@ -51,6 +60,8 @@ export interface CreateResult {
51
60
  bytes: number;
52
61
  /** 埋め込みフォント名(標準フォント時は 'Helvetica') */
53
62
  font: string;
63
+ /** グリフ欠落の置換・無視など、注意すべき事象の報告 */
64
+ warnings?: string[];
54
65
  }
55
66
  /**
56
67
  * すべての編集ツールに共通するオプション
@@ -49,6 +49,11 @@ export function validateCommonOptions(opts) {
49
49
  if (opts.outputPath !== undefined) {
50
50
  validateNonEmptyString(opts.outputPath, 'outputPath');
51
51
  }
52
+ if (opts.onMissingGlyph !== undefined) {
53
+ if (!['error', 'replace', 'ignore'].includes(opts.onMissingGlyph)) {
54
+ throw new Error(`onMissingGlyph must be one of error, replace, ignore, got ${String(opts.onMissingGlyph)}`);
55
+ }
56
+ }
52
57
  }
53
58
  export function validatePageSize(value) {
54
59
  if (typeof value !== 'string' || !(value in PAGE_SIZES)) {
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shuji-bonji/pdf-writer-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server that generates and edits PDFs (text/Markdown/table creation, metadata & page operations) using pdf-lib, with Japanese font embedding (fontkit subset).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,7 +38,8 @@
38
38
  "@modelcontextprotocol/sdk": "^1.29.0",
39
39
  "@pdf-lib/fontkit": "^1.1.1",
40
40
  "marked": "^18.0.6",
41
- "pdf-lib": "^1.17.1"
41
+ "pdf-lib": "^1.17.1",
42
+ "subset-font": "^2.4.0"
42
43
  },
43
44
  "devDependencies": {
44
45
  "@types/node": "^26.1.1",