@shuji-bonji/pdf-constraints 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/LICENSE +21 -0
- package/README.md +121 -0
- package/dist/check.d.ts +25 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +67 -0
- package/dist/check.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/evaluate.d.ts +31 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +138 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/facts/document.d.ts +11 -0
- package/dist/facts/document.d.ts.map +1 -0
- package/dist/facts/document.js +79 -0
- package/dist/facts/document.js.map +1 -0
- package/dist/facts/embedded-font.d.ts +15 -0
- package/dist/facts/embedded-font.d.ts.map +1 -0
- package/dist/facts/embedded-font.js +113 -0
- package/dist/facts/embedded-font.js.map +1 -0
- package/dist/facts/registry.d.ts +14 -0
- package/dist/facts/registry.d.ts.map +1 -0
- package/dist/facts/registry.js +22 -0
- package/dist/facts/registry.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
- package/tables/document-metadata.json +253 -0
- package/tables/font-embedding.json +276 -0
- package/tables/schema.json +158 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope `document` の fact 抽出(Info 辞書と XMP)。
|
|
3
|
+
*
|
|
4
|
+
* XMP は**外形しか見ない**(xpacket + x:xmpmeta があるか)。R-14.3.2-2 は文法が
|
|
5
|
+
* ISO 16684-1 に従うことまで要求するが、その規格は family のコーパス外なので
|
|
6
|
+
* ここでの検査は近似である — テーブル側の `notMapped` にその旨を書いてある。
|
|
7
|
+
*/
|
|
8
|
+
import { decodePDFRawStream, PDFDict, PDFName, PDFRawStream } from 'pdf-lib';
|
|
9
|
+
function nameValue(dict, key) {
|
|
10
|
+
const value = dict.get(PDFName.of(key));
|
|
11
|
+
return value instanceof PDFName ? value.decodeText() : undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Info の日付・文字列は PDFString / PDFHexString のどちらもありうる */
|
|
14
|
+
function stringValue(value) {
|
|
15
|
+
if (value === undefined || value === null)
|
|
16
|
+
return null;
|
|
17
|
+
const candidate = value;
|
|
18
|
+
if (typeof candidate.decodeText === 'function')
|
|
19
|
+
return candidate.decodeText();
|
|
20
|
+
if (typeof candidate.asString === 'function')
|
|
21
|
+
return candidate.asString();
|
|
22
|
+
return String(value).replace(/^\(|\)$/g, '');
|
|
23
|
+
}
|
|
24
|
+
export function extractDocumentFacts(doc, given) {
|
|
25
|
+
const context = doc.context;
|
|
26
|
+
const facts = {
|
|
27
|
+
'doc.xmp.exists': false,
|
|
28
|
+
'doc.xmp.dict.Type': null,
|
|
29
|
+
'doc.xmp.dict.Subtype': null,
|
|
30
|
+
'doc.xmp.hasXmpEnvelope': null,
|
|
31
|
+
'doc.xmp.CreateDate': null,
|
|
32
|
+
'doc.xmp.ModifyDate': null,
|
|
33
|
+
'doc.info.CreationDate': null,
|
|
34
|
+
'doc.info.ModDate': null,
|
|
35
|
+
'doc.info.TrappedKind': null,
|
|
36
|
+
...given,
|
|
37
|
+
};
|
|
38
|
+
const infoRef = context.trailerInfo?.Info;
|
|
39
|
+
const info = infoRef ? context.lookup(infoRef) : undefined;
|
|
40
|
+
if (info instanceof PDFDict) {
|
|
41
|
+
facts['doc.info.CreationDate'] = stringValue(info.get(PDFName.of('CreationDate')));
|
|
42
|
+
facts['doc.info.ModDate'] = stringValue(info.get(PDFName.of('ModDate')));
|
|
43
|
+
const trapped = info.get(PDFName.of('Trapped'));
|
|
44
|
+
if (trapped !== undefined) {
|
|
45
|
+
// R-14.3.3-5/-6: name の True / False であって boolean ではない
|
|
46
|
+
facts['doc.info.TrappedKind'] =
|
|
47
|
+
trapped instanceof PDFName
|
|
48
|
+
? `name:${trapped.decodeText()}`
|
|
49
|
+
: trapped.constructor?.name === 'PDFBool'
|
|
50
|
+
? 'boolean'
|
|
51
|
+
: 'other';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const metadata = context.lookup(doc.catalog.get(PDFName.of('Metadata')));
|
|
55
|
+
if (metadata instanceof PDFRawStream) {
|
|
56
|
+
facts['doc.xmp.exists'] = true;
|
|
57
|
+
facts['doc.xmp.dict.Type'] = nameValue(metadata.dict, 'Type') ?? null;
|
|
58
|
+
facts['doc.xmp.dict.Subtype'] = nameValue(metadata.dict, 'Subtype') ?? null;
|
|
59
|
+
try {
|
|
60
|
+
const bytes = metadata.dict.has(PDFName.of('Filter'))
|
|
61
|
+
? decodePDFRawStream(metadata).decode()
|
|
62
|
+
: metadata.contents;
|
|
63
|
+
const text = new TextDecoder().decode(bytes);
|
|
64
|
+
facts['doc.xmp.hasXmpEnvelope'] =
|
|
65
|
+
/<\?xpacket begin=/.test(text) && /<x:xmpmeta[\s>]/.test(text);
|
|
66
|
+
facts['doc.xmp.CreateDate'] =
|
|
67
|
+
/<xmp:CreateDate>([^<]+)<\/xmp:CreateDate>/.exec(text)?.[1] ?? null;
|
|
68
|
+
facts['doc.xmp.ModifyDate'] =
|
|
69
|
+
/<xmp:ModifyDate>([^<]+)<\/xmp:ModifyDate>/.exec(text)?.[1] ?? null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// 復号できない XMP は「外形を満たさない」ではなく「読めなかった」— false に倒すと
|
|
73
|
+
// 冤罪になるので、外形検査だけ false にし他は null(= 未取得)のままにする
|
|
74
|
+
facts['doc.xmp.hasXmpEnvelope'] = false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { label: '(document)', scope: 'document', facts };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/facts/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope `embedded-font` の fact 抽出。
|
|
3
|
+
*
|
|
4
|
+
* **フォント辞書は委譲先が書いたものを自分の目で開く。** pdf-lib は自分が書いた辞書を
|
|
5
|
+
* そのまま読み返すので、「CFF なのに FontFile2 と名乗っている」は pdf-lib の API 越しには
|
|
6
|
+
* 見えない。ここではストリームを復号して **sfnt のテーブルディレクトリを直接読む**。
|
|
7
|
+
*/
|
|
8
|
+
import { type PDFDocument } from 'pdf-lib';
|
|
9
|
+
import type { Facts, Subject } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* 文書中の埋め込みフォントを 1 つずつ subject にする。
|
|
12
|
+
* FontDescriptor を軸に、参照元のフォント辞書(/Subtype・/BaseFont)を逆引きする。
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractEmbeddedFontFacts(doc: PDFDocument, given: Facts): Subject[];
|
|
15
|
+
//# sourceMappingURL=embedded-font.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-font.d.ts","sourceRoot":"","sources":["../../src/facts/embedded-font.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,KAAK,WAAW,EAKjB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AA8BlD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,CAuElF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope `embedded-font` の fact 抽出。
|
|
3
|
+
*
|
|
4
|
+
* **フォント辞書は委譲先が書いたものを自分の目で開く。** pdf-lib は自分が書いた辞書を
|
|
5
|
+
* そのまま読み返すので、「CFF なのに FontFile2 と名乗っている」は pdf-lib の API 越しには
|
|
6
|
+
* 見えない。ここではストリームを復号して **sfnt のテーブルディレクトリを直接読む**。
|
|
7
|
+
*/
|
|
8
|
+
import { decodePDFRawStream, PDFDict, PDFName, PDFNumber, PDFRawStream, PDFRef, } from 'pdf-lib';
|
|
9
|
+
/** sfnt / bare CFF のコンテナ種別とテーブル一覧を、復号後のバイト列から読む */
|
|
10
|
+
function inspectProgram(bytes) {
|
|
11
|
+
if (bytes.length < 12)
|
|
12
|
+
return { container: 'unknown', tables: [] };
|
|
13
|
+
const tag = String.fromCharCode(...bytes.slice(0, 4));
|
|
14
|
+
const version = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
|
|
15
|
+
let container = 'unknown';
|
|
16
|
+
if (version === 0x00010000 || tag === 'true')
|
|
17
|
+
container = 'truetype';
|
|
18
|
+
else if (tag === 'OTTO')
|
|
19
|
+
container = 'otto';
|
|
20
|
+
else if (tag === 'ttcf')
|
|
21
|
+
container = 'ttc';
|
|
22
|
+
else if (bytes[0] === 0x01 && bytes[1] === 0x00)
|
|
23
|
+
return { container: 'bareCFF', tables: [] };
|
|
24
|
+
if (container === 'unknown')
|
|
25
|
+
return { container, tables: [] };
|
|
26
|
+
const numTables = (bytes[4] << 8) | bytes[5];
|
|
27
|
+
const tables = [];
|
|
28
|
+
for (let i = 0; i < numTables; i++) {
|
|
29
|
+
const offset = 12 + i * 16;
|
|
30
|
+
if (offset + 4 > bytes.length)
|
|
31
|
+
break;
|
|
32
|
+
tables.push(String.fromCharCode(...bytes.slice(offset, offset + 4)));
|
|
33
|
+
}
|
|
34
|
+
return { container, tables };
|
|
35
|
+
}
|
|
36
|
+
function nameValue(dict, key) {
|
|
37
|
+
const value = dict.get(PDFName.of(key));
|
|
38
|
+
return value instanceof PDFName ? value.decodeText() : undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 文書中の埋め込みフォントを 1 つずつ subject にする。
|
|
42
|
+
* FontDescriptor を軸に、参照元のフォント辞書(/Subtype・/BaseFont)を逆引きする。
|
|
43
|
+
*/
|
|
44
|
+
export function extractEmbeddedFontFacts(doc, given) {
|
|
45
|
+
const context = doc.context;
|
|
46
|
+
const fontByDescriptor = new Map();
|
|
47
|
+
for (const [, object] of context.enumerateIndirectObjects()) {
|
|
48
|
+
if (!(object instanceof PDFDict))
|
|
49
|
+
continue;
|
|
50
|
+
if (nameValue(object, 'Type') !== 'Font')
|
|
51
|
+
continue;
|
|
52
|
+
const descriptor = object.get(PDFName.of('FontDescriptor'));
|
|
53
|
+
if (descriptor instanceof PDFRef) {
|
|
54
|
+
fontByDescriptor.set(descriptor.toString(), {
|
|
55
|
+
subtype: nameValue(object, 'Subtype'),
|
|
56
|
+
baseFont: nameValue(object, 'BaseFont'),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const subjects = [];
|
|
61
|
+
for (const [ref, object] of context.enumerateIndirectObjects()) {
|
|
62
|
+
if (!(object instanceof PDFDict))
|
|
63
|
+
continue;
|
|
64
|
+
if (nameValue(object, 'Type') !== 'FontDescriptor')
|
|
65
|
+
continue;
|
|
66
|
+
const font = fontByDescriptor.get(ref.toString()) ?? {};
|
|
67
|
+
let fontFileKey = 'none';
|
|
68
|
+
let streamRef;
|
|
69
|
+
for (const key of ['FontFile', 'FontFile2', 'FontFile3']) {
|
|
70
|
+
if (object.has(PDFName.of(key))) {
|
|
71
|
+
fontFileKey = key;
|
|
72
|
+
streamRef = object.get(PDFName.of(key));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const facts = {
|
|
76
|
+
'descriptor.fontFileKey': fontFileKey,
|
|
77
|
+
'descriptor.fontName': nameValue(object, 'FontName') ?? null,
|
|
78
|
+
'font.subtype': font.subtype ?? null,
|
|
79
|
+
'font.baseFont': font.baseFont ?? null,
|
|
80
|
+
'stream.dict.Subtype': null,
|
|
81
|
+
'stream.dict.Length1': null,
|
|
82
|
+
'stream.decodedLength': null,
|
|
83
|
+
'program.container': null,
|
|
84
|
+
'program.sfntTables': [],
|
|
85
|
+
'program.isCffBased': null,
|
|
86
|
+
...given,
|
|
87
|
+
};
|
|
88
|
+
if (streamRef !== undefined) {
|
|
89
|
+
const stream = context.lookup(streamRef);
|
|
90
|
+
if (stream instanceof PDFRawStream) {
|
|
91
|
+
facts['stream.dict.Subtype'] = nameValue(stream.dict, 'Subtype') ?? null;
|
|
92
|
+
const length1 = stream.dict.get(PDFName.of('Length1'));
|
|
93
|
+
facts['stream.dict.Length1'] = length1 instanceof PDFNumber ? length1.asNumber() : null;
|
|
94
|
+
const decoded = decodePDFRawStream(stream).decode();
|
|
95
|
+
facts['stream.decodedLength'] = decoded.length;
|
|
96
|
+
const program = inspectProgram(decoded);
|
|
97
|
+
facts['program.container'] = program.container;
|
|
98
|
+
facts['program.sfntTables'] = program.tables;
|
|
99
|
+
facts['program.isCffBased'] =
|
|
100
|
+
program.container === 'otto' ||
|
|
101
|
+
program.container === 'bareCFF' ||
|
|
102
|
+
program.tables.includes('CFF ');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
subjects.push({
|
|
106
|
+
label: String(facts['font.baseFont'] ?? ref.toString()),
|
|
107
|
+
scope: 'embedded-font',
|
|
108
|
+
facts,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return subjects;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=embedded-font.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-font.js","sourceRoot":"","sources":["../../src/facts/embedded-font.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope → fact 抽出器の対応表。
|
|
3
|
+
*
|
|
4
|
+
* ドメインを増やすときに触るのはここ(`annotation` / `page` を足す想定)。
|
|
5
|
+
* 抽出器は将来 reader の観測や normativepdf の読み口に差し替えうるので、
|
|
6
|
+
* 呼び出し側は必ずこのレジストリ越しに使うこと(specs/18 §6)。
|
|
7
|
+
*/
|
|
8
|
+
import type { PDFDocument } from 'pdf-lib';
|
|
9
|
+
import type { Facts, Scope, Subject } from '../types.js';
|
|
10
|
+
export type FactExtractor = (doc: PDFDocument, given: Facts) => Subject[];
|
|
11
|
+
export declare const extractors: Record<Scope, FactExtractor>;
|
|
12
|
+
/** テーブル群が要求する scope の分だけ subject を集める */
|
|
13
|
+
export declare function collectSubjects(doc: PDFDocument, scopes: Iterable<Scope>, given: Facts): Map<Scope, Subject[]>;
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/facts/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC;AAE1E,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,CAGnD,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EACvB,KAAK,EAAE,KAAK,GACX,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAMvB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope → fact 抽出器の対応表。
|
|
3
|
+
*
|
|
4
|
+
* ドメインを増やすときに触るのはここ(`annotation` / `page` を足す想定)。
|
|
5
|
+
* 抽出器は将来 reader の観測や normativepdf の読み口に差し替えうるので、
|
|
6
|
+
* 呼び出し側は必ずこのレジストリ越しに使うこと(specs/18 §6)。
|
|
7
|
+
*/
|
|
8
|
+
import { extractDocumentFacts } from './document.js';
|
|
9
|
+
import { extractEmbeddedFontFacts } from './embedded-font.js';
|
|
10
|
+
export const extractors = {
|
|
11
|
+
'embedded-font': extractEmbeddedFontFacts,
|
|
12
|
+
document: (doc, given) => [extractDocumentFacts(doc, given)],
|
|
13
|
+
};
|
|
14
|
+
/** テーブル群が要求する scope の分だけ subject を集める */
|
|
15
|
+
export function collectSubjects(doc, scopes, given) {
|
|
16
|
+
const result = new Map();
|
|
17
|
+
for (const scope of new Set(scopes)) {
|
|
18
|
+
result.set(scope, extractors[scope](doc, given));
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/facts/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,CAAC,MAAM,UAAU,GAAiC;IACtD,eAAe,EAAE,wBAAwB;IACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;CAC7D,CAAC;AAEF,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAC7B,GAAgB,EAChB,MAAuB,EACvB,KAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@shuji-bonji/pdf-constraints`
|
|
3
|
+
*
|
|
4
|
+
* ISO 32000 の条文を「ファイルが構造上どういう状態か」へ写像した制約テーブルと、
|
|
5
|
+
* その決定論的評価器。**条文原文は持たず**(pdf-spec の役割)、**verdict も出さない**
|
|
6
|
+
* (evaluate_policy の役割)。制約ごとに pass / fail / not_applicable /
|
|
7
|
+
* needs_external_fact の 4 状態までしか言わない。
|
|
8
|
+
*
|
|
9
|
+
* fail が無いことは「収録した制約の範囲で反証できなかった」以上を意味しない。
|
|
10
|
+
* 適合の証明ではない。
|
|
11
|
+
*/
|
|
12
|
+
export { type CheckOptions, checkBytes, checkFile, listTables, loadTable } from './check.js';
|
|
13
|
+
export { evaluateConstraint, evaluateDocumentAsserts, evaluatePredicate, parsePdfDate, } from './evaluate.js';
|
|
14
|
+
export { collectSubjects, extractors, type FactExtractor } from './facts/registry.js';
|
|
15
|
+
export type { Assertion, CheckReport, Constraint, ConstraintResult, ConstraintStatus, ConstraintTable, Facts, Failure, Predicate, PredicateOp, Scope, Subject, } from './types.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACtF,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,WAAW,EACX,KAAK,EACL,OAAO,GACR,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@shuji-bonji/pdf-constraints`
|
|
3
|
+
*
|
|
4
|
+
* ISO 32000 の条文を「ファイルが構造上どういう状態か」へ写像した制約テーブルと、
|
|
5
|
+
* その決定論的評価器。**条文原文は持たず**(pdf-spec の役割)、**verdict も出さない**
|
|
6
|
+
* (evaluate_policy の役割)。制約ごとに pass / fail / not_applicable /
|
|
7
|
+
* needs_external_fact の 4 状態までしか言わない。
|
|
8
|
+
*
|
|
9
|
+
* fail が無いことは「収録した制約の範囲で反証できなかった」以上を意味しない。
|
|
10
|
+
* 適合の証明ではない。
|
|
11
|
+
*/
|
|
12
|
+
export { checkBytes, checkFile, listTables, loadTable } from './check.js';
|
|
13
|
+
export { evaluateConstraint, evaluateDocumentAsserts, evaluatePredicate, parsePdfDate, } from './evaluate.js';
|
|
14
|
+
export { collectSubjects, extractors } from './facts/registry.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAqB,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAsB,MAAM,qBAAqB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 制約テーブルの型。
|
|
3
|
+
*
|
|
4
|
+
* ここに現れるのは「条文を満たすとはファイルがどういう状態か」の宣言だけである。
|
|
5
|
+
* 条文原文は持たない(pdf-spec の役割)。verdict も出さない(evaluate_policy の役割)。
|
|
6
|
+
* 詳細は `Document-Note/mcps/PDFfamily/specs/18-pdf-constraints-package.md` §1。
|
|
7
|
+
*/
|
|
8
|
+
/** 述語の演算子。v1 の凍結セット — 追加は minor バンプ(tables/schema.json と対で更新する) */
|
|
9
|
+
export type PredicateOp = 'eq' | 'in' | 'exists' | 'matches' | 'superset' | 'eqFact' | 'allDistinct' | 'dateEquiv';
|
|
10
|
+
/** 評価スコープ。fact 抽出器はこの単位で登録される */
|
|
11
|
+
export type Scope = 'embedded-font' | 'document';
|
|
12
|
+
export interface Predicate {
|
|
13
|
+
fact: string;
|
|
14
|
+
op: PredicateOp;
|
|
15
|
+
value?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface Assertion extends Predicate {
|
|
18
|
+
/**
|
|
19
|
+
* 違反時の説明。`subjectNote` を持つ制約では**「違反」ではなく「違反の痕跡」**と述べる
|
|
20
|
+
* (ファイルから観測できるのは行為の結果であって、誰がいつ破ったかではない)。
|
|
21
|
+
*/
|
|
22
|
+
onFail: string;
|
|
23
|
+
note?: string;
|
|
24
|
+
/** この assert だけに掛かる追加条件。満たさなければ検査自体を飛ばす */
|
|
25
|
+
onlyWhen?: Predicate[];
|
|
26
|
+
}
|
|
27
|
+
export interface Constraint {
|
|
28
|
+
/** `CT-<DOMAIN>-<n>`。一度公開した ID の意味は変えない */
|
|
29
|
+
id: string;
|
|
30
|
+
title: string;
|
|
31
|
+
/** 根拠条文の ID(例: R-9.9.1-33)。原文は複製せず pdf-spec で引く */
|
|
32
|
+
clauses: string[];
|
|
33
|
+
source: {
|
|
34
|
+
spec: string;
|
|
35
|
+
section: string;
|
|
36
|
+
table?: string;
|
|
37
|
+
key?: string;
|
|
38
|
+
};
|
|
39
|
+
level: string;
|
|
40
|
+
appliesTo: Scope;
|
|
41
|
+
/**
|
|
42
|
+
* 条文の主語が PDF processor(書き込み行為)であることの記録。
|
|
43
|
+
* これを持つ制約の fail は「どこかの writer が破った痕跡」であり、
|
|
44
|
+
* 直近の書き手の違反とは限らない(R-14.3.4-3 は既存の不整合の温存を許す)。
|
|
45
|
+
*/
|
|
46
|
+
subjectNote?: string;
|
|
47
|
+
/** 語彙で写像できなかった条文と、その理由。沈黙して存在しないふりをしない */
|
|
48
|
+
notMapped?: string;
|
|
49
|
+
when: Predicate[];
|
|
50
|
+
assert: Assertion[];
|
|
51
|
+
/** 文書横断の検査(同一フォントの別サブセットが同じタグを共有していないか等) */
|
|
52
|
+
documentAssert?: Assertion[];
|
|
53
|
+
}
|
|
54
|
+
export interface ConstraintTable {
|
|
55
|
+
name: string;
|
|
56
|
+
version: string;
|
|
57
|
+
description: string;
|
|
58
|
+
issue?: string;
|
|
59
|
+
/** 写像の出所。pdf-spec の版が上がったときに再照合するための情報 */
|
|
60
|
+
sourceSpec: {
|
|
61
|
+
spec: string;
|
|
62
|
+
retrievedWith?: string;
|
|
63
|
+
sections: string[];
|
|
64
|
+
specVersionAtMapping?: string;
|
|
65
|
+
};
|
|
66
|
+
factVocabulary: Record<string, string>;
|
|
67
|
+
newPredicates?: string[];
|
|
68
|
+
scopeFindings?: string[];
|
|
69
|
+
constraints: Constraint[];
|
|
70
|
+
}
|
|
71
|
+
/** fact 名 → 実測値。`given.*` は外部から供給される事実(ファイル単体では決定不能) */
|
|
72
|
+
export type Facts = Record<string, unknown>;
|
|
73
|
+
/** 評価対象 1 件(フォント 1 つ、または文書そのもの) */
|
|
74
|
+
export interface Subject {
|
|
75
|
+
/** レポートに出す識別子(BaseFont 名や "(document)") */
|
|
76
|
+
label: string;
|
|
77
|
+
scope: Scope;
|
|
78
|
+
facts: Facts;
|
|
79
|
+
}
|
|
80
|
+
export interface Failure {
|
|
81
|
+
clauses: string[];
|
|
82
|
+
message: string;
|
|
83
|
+
fact: string;
|
|
84
|
+
actual: unknown;
|
|
85
|
+
/** 主語が processor の条文か(レポート側で言い回しを変えるため機械可読にしておく) */
|
|
86
|
+
traceOnly: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 制約 1 件の評価結果。
|
|
90
|
+
*
|
|
91
|
+
* - `pass` — 収録した検査では反証できなかった。**適合の証明ではない**
|
|
92
|
+
* - `fail` — 反証できた
|
|
93
|
+
* - `not_applicable` — 適用条件を満たさない(この文書には関係ない条文)
|
|
94
|
+
* - `needs_external_fact` — `given.*` が供給されておらず判定に到達できない。
|
|
95
|
+
* pass にも fail にも倒さない(沈黙合格を作らないための状態)
|
|
96
|
+
*/
|
|
97
|
+
export type ConstraintStatus = 'pass' | 'fail' | 'not_applicable' | 'needs_external_fact';
|
|
98
|
+
export interface ConstraintResult {
|
|
99
|
+
constraint: string;
|
|
100
|
+
target: string;
|
|
101
|
+
status: ConstraintStatus;
|
|
102
|
+
failures?: Failure[];
|
|
103
|
+
/** needs_external_fact のとき、足りない fact 名 */
|
|
104
|
+
missing?: string;
|
|
105
|
+
}
|
|
106
|
+
export interface CheckReport {
|
|
107
|
+
/** 判定に使ったテーブルの出所(決定論の由来を言えるようにする) */
|
|
108
|
+
packageVersion: string;
|
|
109
|
+
tables: {
|
|
110
|
+
name: string;
|
|
111
|
+
version: string;
|
|
112
|
+
}[];
|
|
113
|
+
subjects: number;
|
|
114
|
+
results: ConstraintResult[];
|
|
115
|
+
violations: number;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shuji-bonji/pdf-constraints",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Machine-checkable constraint tables mapping ISO 32000 clauses to PDF structural conditions, with a deterministic evaluator. A mapping layer — it does not quote the specification, and it cannot prove conformance",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pdf",
|
|
7
|
+
"iso-32000",
|
|
8
|
+
"constraints",
|
|
9
|
+
"conformance",
|
|
10
|
+
"validation"
|
|
11
|
+
],
|
|
12
|
+
"author": "shuji-bonji",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/shuji-bonji/pdf-constraints.git"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"main": "dist/index.js",
|
|
20
|
+
"types": "dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./tables/*.json": "./tables/*.json",
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"pdf-constraints": "dist/cli.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"tables"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc && chmod +x dist/cli.js",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:watch": "vitest",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"typecheck:tests": "tsc --noEmit -p tsconfig.test.json",
|
|
43
|
+
"lint": "biome lint ./src ./tests",
|
|
44
|
+
"lint:fix": "biome lint --fix ./src ./tests",
|
|
45
|
+
"format": "biome format ./src ./tests",
|
|
46
|
+
"format:fix": "biome format --write ./src ./tests",
|
|
47
|
+
"check": "biome check ./src ./tests",
|
|
48
|
+
"check:fix": "biome check --fix ./src ./tests",
|
|
49
|
+
"validate:tables": "node scripts/validate-tables.mjs",
|
|
50
|
+
"prepublishOnly": "npm run build"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"pdf-lib": "^1.17.1"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@biomejs/biome": "2.5.4",
|
|
57
|
+
"@types/node": "^22.0.0",
|
|
58
|
+
"typescript": "^5.7.0",
|
|
59
|
+
"vitest": "^2.1.0"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=20.0.0"
|
|
63
|
+
},
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/shuji-bonji/pdf-constraints/issues"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://github.com/shuji-bonji/pdf-constraints#readme"
|
|
68
|
+
}
|