@shuji-bonji/pdf-reader-mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +190 -0
  4. package/README.md +206 -0
  5. package/dist/constants.d.ts +22 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +23 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +35 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/schemas/common.d.ts +14 -0
  14. package/dist/schemas/common.d.ts.map +1 -0
  15. package/dist/schemas/common.js +26 -0
  16. package/dist/schemas/common.js.map +1 -0
  17. package/dist/schemas/tier1.d.ts +104 -0
  18. package/dist/schemas/tier1.d.ts.map +1 -0
  19. package/dist/schemas/tier1.js +77 -0
  20. package/dist/schemas/tier1.js.map +1 -0
  21. package/dist/schemas/tier2.d.ts +68 -0
  22. package/dist/schemas/tier2.d.ts.map +1 -0
  23. package/dist/schemas/tier2.js +42 -0
  24. package/dist/schemas/tier2.js.map +1 -0
  25. package/dist/schemas/tier3.d.ts +44 -0
  26. package/dist/schemas/tier3.d.ts.map +1 -0
  27. package/dist/schemas/tier3.js +28 -0
  28. package/dist/schemas/tier3.js.map +1 -0
  29. package/dist/services/pdfjs-service.d.ts +65 -0
  30. package/dist/services/pdfjs-service.d.ts.map +1 -0
  31. package/dist/services/pdfjs-service.js +520 -0
  32. package/dist/services/pdfjs-service.js.map +1 -0
  33. package/dist/services/pdflib-service.d.ts +35 -0
  34. package/dist/services/pdflib-service.d.ts.map +1 -0
  35. package/dist/services/pdflib-service.js +318 -0
  36. package/dist/services/pdflib-service.js.map +1 -0
  37. package/dist/services/url-fetcher.d.ts +8 -0
  38. package/dist/services/url-fetcher.d.ts.map +1 -0
  39. package/dist/services/url-fetcher.js +40 -0
  40. package/dist/services/url-fetcher.js.map +1 -0
  41. package/dist/services/validation-service.d.ts +49 -0
  42. package/dist/services/validation-service.d.ts.map +1 -0
  43. package/dist/services/validation-service.js +670 -0
  44. package/dist/services/validation-service.js.map +1 -0
  45. package/dist/tools/index.d.ts +10 -0
  46. package/dist/tools/index.d.ts.map +1 -0
  47. package/dist/tools/index.js +46 -0
  48. package/dist/tools/index.js.map +1 -0
  49. package/dist/tools/tier1/get-metadata.d.ts +6 -0
  50. package/dist/tools/tier1/get-metadata.d.ts.map +1 -0
  51. package/dist/tools/tier1/get-metadata.js +49 -0
  52. package/dist/tools/tier1/get-metadata.js.map +1 -0
  53. package/dist/tools/tier1/get-page-count.d.ts +6 -0
  54. package/dist/tools/tier1/get-page-count.d.ts.map +1 -0
  55. package/dist/tools/tier1/get-page-count.js +50 -0
  56. package/dist/tools/tier1/get-page-count.js.map +1 -0
  57. package/dist/tools/tier1/read-images.d.ts +6 -0
  58. package/dist/tools/tier1/read-images.d.ts.map +1 -0
  59. package/dist/tools/tier1/read-images.js +79 -0
  60. package/dist/tools/tier1/read-images.js.map +1 -0
  61. package/dist/tools/tier1/read-text.d.ts +6 -0
  62. package/dist/tools/tier1/read-text.d.ts.map +1 -0
  63. package/dist/tools/tier1/read-text.js +57 -0
  64. package/dist/tools/tier1/read-text.js.map +1 -0
  65. package/dist/tools/tier1/read-url.d.ts +6 -0
  66. package/dist/tools/tier1/read-url.d.ts.map +1 -0
  67. package/dist/tools/tier1/read-url.js +64 -0
  68. package/dist/tools/tier1/read-url.js.map +1 -0
  69. package/dist/tools/tier1/search-text.d.ts +6 -0
  70. package/dist/tools/tier1/search-text.d.ts.map +1 -0
  71. package/dist/tools/tier1/search-text.js +62 -0
  72. package/dist/tools/tier1/search-text.js.map +1 -0
  73. package/dist/tools/tier1/summarize.d.ts +6 -0
  74. package/dist/tools/tier1/summarize.d.ts.map +1 -0
  75. package/dist/tools/tier1/summarize.js +70 -0
  76. package/dist/tools/tier1/summarize.js.map +1 -0
  77. package/dist/tools/tier2/inspect-annotations.d.ts +6 -0
  78. package/dist/tools/tier2/inspect-annotations.d.ts.map +1 -0
  79. package/dist/tools/tier2/inspect-annotations.js +47 -0
  80. package/dist/tools/tier2/inspect-annotations.js.map +1 -0
  81. package/dist/tools/tier2/inspect-fonts.d.ts +6 -0
  82. package/dist/tools/tier2/inspect-fonts.d.ts.map +1 -0
  83. package/dist/tools/tier2/inspect-fonts.js +54 -0
  84. package/dist/tools/tier2/inspect-fonts.js.map +1 -0
  85. package/dist/tools/tier2/inspect-signatures.d.ts +6 -0
  86. package/dist/tools/tier2/inspect-signatures.d.ts.map +1 -0
  87. package/dist/tools/tier2/inspect-signatures.js +48 -0
  88. package/dist/tools/tier2/inspect-signatures.js.map +1 -0
  89. package/dist/tools/tier2/inspect-structure.d.ts +6 -0
  90. package/dist/tools/tier2/inspect-structure.d.ts.map +1 -0
  91. package/dist/tools/tier2/inspect-structure.js +46 -0
  92. package/dist/tools/tier2/inspect-structure.js.map +1 -0
  93. package/dist/tools/tier2/inspect-tags.d.ts +6 -0
  94. package/dist/tools/tier2/inspect-tags.d.ts.map +1 -0
  95. package/dist/tools/tier2/inspect-tags.js +46 -0
  96. package/dist/tools/tier2/inspect-tags.js.map +1 -0
  97. package/dist/tools/tier3/compare-structure.d.ts +6 -0
  98. package/dist/tools/tier3/compare-structure.d.ts.map +1 -0
  99. package/dist/tools/tier3/compare-structure.js +47 -0
  100. package/dist/tools/tier3/compare-structure.js.map +1 -0
  101. package/dist/tools/tier3/validate-metadata.d.ts +6 -0
  102. package/dist/tools/tier3/validate-metadata.d.ts.map +1 -0
  103. package/dist/tools/tier3/validate-metadata.js +57 -0
  104. package/dist/tools/tier3/validate-metadata.js.map +1 -0
  105. package/dist/tools/tier3/validate-tagged.d.ts +6 -0
  106. package/dist/tools/tier3/validate-tagged.d.ts.map +1 -0
  107. package/dist/tools/tier3/validate-tagged.js +56 -0
  108. package/dist/tools/tier3/validate-tagged.js.map +1 -0
  109. package/dist/types.d.ts +226 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +5 -0
  112. package/dist/types.js.map +1 -0
  113. package/dist/utils/batch-processor.d.ts +60 -0
  114. package/dist/utils/batch-processor.d.ts.map +1 -0
  115. package/dist/utils/batch-processor.js +72 -0
  116. package/dist/utils/batch-processor.js.map +1 -0
  117. package/dist/utils/error-handler.d.ts +23 -0
  118. package/dist/utils/error-handler.d.ts.map +1 -0
  119. package/dist/utils/error-handler.js +76 -0
  120. package/dist/utils/error-handler.js.map +1 -0
  121. package/dist/utils/formatter.d.ts +64 -0
  122. package/dist/utils/formatter.d.ts.map +1 -0
  123. package/dist/utils/formatter.js +379 -0
  124. package/dist/utils/formatter.js.map +1 -0
  125. package/dist/utils/pdf-helpers.d.ts +22 -0
  126. package/dist/utils/pdf-helpers.d.ts.map +1 -0
  127. package/dist/utils/pdf-helpers.js +68 -0
  128. package/dist/utils/pdf-helpers.js.map +1 -0
  129. package/package.json +78 -0
@@ -0,0 +1,318 @@
1
+ /**
2
+ * pdf-lib wrapper service.
3
+ *
4
+ * Provides low-level PDF structure access via pdf-lib for Tier 2 tools.
5
+ * Runs alongside pdfjs-service.ts (which handles text/image extraction).
6
+ */
7
+ import { PDFArray, PDFDict, PDFDocument, PDFName, PDFNumber, PDFRef, PDFStream, PDFString, PDFHexString, } from 'pdf-lib';
8
+ import { open } from 'node:fs/promises';
9
+ import { readPdfFile } from '../utils/pdf-helpers.js';
10
+ /**
11
+ * Load a PDF document with pdf-lib.
12
+ */
13
+ export async function loadWithPdfLib(filePath) {
14
+ const data = await readPdfFile(filePath);
15
+ const doc = await PDFDocument.load(data, {
16
+ ignoreEncryption: true,
17
+ updateMetadata: false,
18
+ });
19
+ return doc;
20
+ }
21
+ /**
22
+ * Check if a PDF is encrypted.
23
+ */
24
+ export async function detectEncryption(filePath) {
25
+ try {
26
+ const data = await readPdfFile(filePath);
27
+ const doc = await PDFDocument.load(data, {
28
+ ignoreEncryption: true,
29
+ updateMetadata: false,
30
+ });
31
+ return doc.isEncrypted;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Analyze PDF internal structure (catalog, page tree, objects).
39
+ */
40
+ export async function analyzeStructure(filePath) {
41
+ const doc = await loadWithPdfLib(filePath);
42
+ const catalog = doc.catalog;
43
+ const context = doc.context;
44
+ // Extract catalog entries
45
+ const catalogEntries = [];
46
+ for (const [key, value] of catalog.entries()) {
47
+ catalogEntries.push({
48
+ key: key.decodeText(),
49
+ type: value.constructor.name,
50
+ value: summarizeObject(value),
51
+ });
52
+ }
53
+ // Page tree info
54
+ const pages = doc.getPages();
55
+ const maxSamples = Math.min(pages.length, 5);
56
+ const mediaBoxSamples = [];
57
+ for (let i = 0; i < maxSamples; i++) {
58
+ const box = pages[i].getMediaBox();
59
+ mediaBoxSamples.push({
60
+ page: i + 1,
61
+ width: Math.round(box.width * 100) / 100,
62
+ height: Math.round(box.height * 100) / 100,
63
+ });
64
+ }
65
+ const pageTree = {
66
+ totalPages: doc.getPageCount(),
67
+ mediaBoxSamples,
68
+ };
69
+ // Object statistics
70
+ const allObjects = context.enumerateIndirectObjects();
71
+ const byType = {};
72
+ let streamCount = 0;
73
+ for (const [_ref, obj] of allObjects) {
74
+ const typeName = obj.constructor.name;
75
+ byType[typeName] = (byType[typeName] ?? 0) + 1;
76
+ if (obj instanceof PDFStream) {
77
+ streamCount++;
78
+ }
79
+ }
80
+ const objectStats = {
81
+ totalObjects: allObjects.length,
82
+ streamCount,
83
+ byType,
84
+ };
85
+ // PDF version: prefer catalog /Version, fallback to file header %PDF-x.y
86
+ let pdfVersion = null;
87
+ const versionEntry = catalog.lookupMaybe(PDFName.of('Version'), PDFName);
88
+ if (versionEntry) {
89
+ pdfVersion = versionEntry.decodeText();
90
+ }
91
+ else {
92
+ try {
93
+ // Read only the first 20 bytes for the PDF header instead of the entire file
94
+ const fh = await open(filePath, 'r');
95
+ try {
96
+ const buf = Buffer.alloc(20);
97
+ await fh.read(buf, 0, 20, 0);
98
+ const match = buf.toString('ascii').match(/%PDF-(\d+\.\d+)/);
99
+ if (match)
100
+ pdfVersion = match[1];
101
+ }
102
+ finally {
103
+ await fh.close();
104
+ }
105
+ }
106
+ catch {
107
+ // Ignore header read errors
108
+ }
109
+ }
110
+ return {
111
+ catalog: catalogEntries,
112
+ pageTree,
113
+ objectStats,
114
+ isEncrypted: doc.isEncrypted,
115
+ pdfVersion,
116
+ };
117
+ }
118
+ /**
119
+ * Analyze fonts across all pages using pdf-lib's low-level access.
120
+ * Returns font map and total pages scanned.
121
+ */
122
+ export async function analyzeFontsWithPdfLib(filePath) {
123
+ const doc = await loadWithPdfLib(filePath);
124
+ const fontMap = new Map();
125
+ const pages = doc.getPages();
126
+ for (let pageIdx = 0; pageIdx < pages.length; pageIdx++) {
127
+ const pageNum = pageIdx + 1;
128
+ const pageNode = pages[pageIdx].node;
129
+ const resources = pageNode.Resources();
130
+ if (!resources)
131
+ continue;
132
+ const fontDict = resources.lookupMaybe(PDFName.of('Font'), PDFDict);
133
+ if (!fontDict)
134
+ continue;
135
+ for (const [fontNameObj, fontRefOrDict] of fontDict.entries()) {
136
+ const fontKey = fontNameObj.decodeText();
137
+ // Resolve to actual font dictionary
138
+ let actualFont;
139
+ if (fontRefOrDict instanceof PDFRef) {
140
+ const resolved = doc.context.lookup(fontRefOrDict);
141
+ if (resolved instanceof PDFDict) {
142
+ actualFont = resolved;
143
+ }
144
+ }
145
+ else if (fontRefOrDict instanceof PDFDict) {
146
+ actualFont = fontRefOrDict;
147
+ }
148
+ if (!actualFont)
149
+ continue;
150
+ // Extract font properties
151
+ const subtypeObj = actualFont.lookupMaybe(PDFName.of('Subtype'), PDFName);
152
+ const baseFontObj = actualFont.lookupMaybe(PDFName.of('BaseFont'), PDFName);
153
+ const encodingObj = actualFont.get(PDFName.of('Encoding'));
154
+ const baseFontName = baseFontObj?.decodeText() ?? fontKey;
155
+ const subtype = subtypeObj?.decodeText() ?? 'Unknown';
156
+ const encoding = encodingObj instanceof PDFName ? encodingObj.decodeText() : null;
157
+ // Check if font is embedded (has FontDescriptor with FontFile/FontFile2/FontFile3)
158
+ let isEmbedded = false;
159
+ const descriptorRef = actualFont.get(PDFName.of('FontDescriptor'));
160
+ if (descriptorRef) {
161
+ let descriptor;
162
+ if (descriptorRef instanceof PDFRef) {
163
+ const resolved = doc.context.lookup(descriptorRef);
164
+ if (resolved instanceof PDFDict)
165
+ descriptor = resolved;
166
+ }
167
+ else if (descriptorRef instanceof PDFDict) {
168
+ descriptor = descriptorRef;
169
+ }
170
+ if (descriptor) {
171
+ isEmbedded =
172
+ descriptor.has(PDFName.of('FontFile')) ||
173
+ descriptor.has(PDFName.of('FontFile2')) ||
174
+ descriptor.has(PDFName.of('FontFile3'));
175
+ }
176
+ }
177
+ // Check if subset (name starts with 6 uppercase + '+')
178
+ const isSubset = /^[A-Z]{6}\+/.test(baseFontName);
179
+ const existing = fontMap.get(baseFontName);
180
+ if (existing) {
181
+ if (!existing.pagesUsed.includes(pageNum)) {
182
+ existing.pagesUsed.push(pageNum);
183
+ }
184
+ }
185
+ else {
186
+ fontMap.set(baseFontName, {
187
+ name: baseFontName,
188
+ type: subtype,
189
+ encoding,
190
+ isEmbedded,
191
+ isSubset,
192
+ pagesUsed: [pageNum],
193
+ });
194
+ }
195
+ }
196
+ }
197
+ return { fontMap, pagesScanned: pages.length };
198
+ }
199
+ /**
200
+ * Analyze digital signature fields.
201
+ */
202
+ export async function analyzeSignatures(filePath) {
203
+ const doc = await loadWithPdfLib(filePath);
204
+ const fields = [];
205
+ try {
206
+ const acroForm = doc.catalog.getAcroForm();
207
+ if (!acroForm) {
208
+ return {
209
+ totalFields: 0,
210
+ signedCount: 0,
211
+ unsignedCount: 0,
212
+ fields: [],
213
+ note: 'No AcroForm found in the document.',
214
+ };
215
+ }
216
+ const allFields = acroForm.getAllFields();
217
+ for (const [field, _ref] of allFields) {
218
+ const ftName = field.dict.lookupMaybe(PDFName.of('FT'), PDFName);
219
+ if (!ftName || ftName.decodeText() !== 'Sig')
220
+ continue;
221
+ const fieldName = field.getFullyQualifiedName() ?? field.getPartialName() ?? '(unnamed)';
222
+ const vObj = field.dict.get(PDFName.of('V'));
223
+ let isSigned = false;
224
+ let signerName = null;
225
+ let reason = null;
226
+ let location = null;
227
+ let contactInfo = null;
228
+ let signingTime = null;
229
+ let filter = null;
230
+ let subFilter = null;
231
+ // If V exists, the field has been signed
232
+ if (vObj) {
233
+ isSigned = true;
234
+ let sigDict;
235
+ if (vObj instanceof PDFRef) {
236
+ const resolved = doc.context.lookup(vObj);
237
+ if (resolved instanceof PDFDict)
238
+ sigDict = resolved;
239
+ }
240
+ else if (vObj instanceof PDFDict) {
241
+ sigDict = vObj;
242
+ }
243
+ if (sigDict) {
244
+ signerName = extractStringFromDict(sigDict, 'Name');
245
+ reason = extractStringFromDict(sigDict, 'Reason');
246
+ location = extractStringFromDict(sigDict, 'Location');
247
+ contactInfo = extractStringFromDict(sigDict, 'ContactInfo');
248
+ signingTime = extractStringFromDict(sigDict, 'M');
249
+ const filterObj = sigDict.lookupMaybe(PDFName.of('Filter'), PDFName);
250
+ filter = filterObj?.decodeText() ?? null;
251
+ const subFilterObj = sigDict.lookupMaybe(PDFName.of('SubFilter'), PDFName);
252
+ subFilter = subFilterObj?.decodeText() ?? null;
253
+ }
254
+ }
255
+ fields.push({
256
+ fieldName,
257
+ isSigned,
258
+ signerName,
259
+ reason,
260
+ location,
261
+ contactInfo,
262
+ signingTime,
263
+ filter,
264
+ subFilter,
265
+ });
266
+ }
267
+ }
268
+ catch {
269
+ // Some PDFs may have malformed AcroForm
270
+ }
271
+ const signedCount = fields.filter((f) => f.isSigned).length;
272
+ return {
273
+ totalFields: fields.length,
274
+ signedCount,
275
+ unsignedCount: fields.length - signedCount,
276
+ fields,
277
+ note: 'Cryptographic signature verification is not performed. Only field structure is inspected.',
278
+ };
279
+ }
280
+ // ─── Internal helpers ────────────────────────────────────
281
+ /**
282
+ * Summarize a PDF object for display (truncated).
283
+ */
284
+ function summarizeObject(obj) {
285
+ if (obj instanceof PDFRef)
286
+ return `ref(${obj.objectNumber})`;
287
+ if (obj instanceof PDFName)
288
+ return obj.decodeText();
289
+ if (obj instanceof PDFArray)
290
+ return `Array[${obj.size()}]`;
291
+ if (obj instanceof PDFDict)
292
+ return `Dict{${obj.entries().length} entries}`;
293
+ if (obj instanceof PDFStream)
294
+ return `Stream{${obj.getContentsSize()} bytes}`;
295
+ if (obj instanceof PDFNumber)
296
+ return String(obj.asNumber());
297
+ if (obj instanceof PDFString)
298
+ return obj.decodeText();
299
+ if (obj instanceof PDFHexString)
300
+ return obj.decodeText();
301
+ if (obj === undefined || obj === null)
302
+ return 'null';
303
+ return String(obj);
304
+ }
305
+ /**
306
+ * Extract a string value from a PDFDict by key name.
307
+ */
308
+ function extractStringFromDict(dict, key) {
309
+ const obj = dict.get(PDFName.of(key));
310
+ if (obj instanceof PDFString)
311
+ return obj.decodeText();
312
+ if (obj instanceof PDFHexString)
313
+ return obj.decodeText();
314
+ if (obj instanceof PDFName)
315
+ return obj.decodeText();
316
+ return null;
317
+ }
318
+ //# sourceMappingURL=pdflib-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdflib-service.js","sourceRoot":"","sources":["../../src/services/pdflib-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Remote PDF fetcher service.
3
+ */
4
+ /**
5
+ * Fetch a PDF from a URL and return it as Uint8Array.
6
+ */
7
+ export declare function fetchPdfFromUrl(url: string): Promise<Uint8Array>;
8
+ //# sourceMappingURL=url-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuDtE"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Remote PDF fetcher service.
3
+ */
4
+ import { MAX_FILE_SIZE, SERVER_NAME, SERVER_VERSION } from '../constants.js';
5
+ import { PdfReaderError } from '../utils/error-handler.js';
6
+ /**
7
+ * Fetch a PDF from a URL and return it as Uint8Array.
8
+ */
9
+ export async function fetchPdfFromUrl(url) {
10
+ let parsedUrl;
11
+ try {
12
+ parsedUrl = new URL(url);
13
+ }
14
+ catch {
15
+ throw new PdfReaderError(`Invalid URL: ${url}`, 'INVALID_URL', 'Provide a valid HTTP or HTTPS URL pointing to a PDF file.');
16
+ }
17
+ if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
18
+ throw new PdfReaderError(`Unsupported protocol: ${parsedUrl.protocol}`, 'UNSUPPORTED_PROTOCOL', 'Only HTTP and HTTPS URLs are supported.');
19
+ }
20
+ const response = await fetch(url, {
21
+ headers: {
22
+ Accept: 'application/pdf',
23
+ 'User-Agent': `${SERVER_NAME}/${SERVER_VERSION}`,
24
+ },
25
+ signal: AbortSignal.timeout(30_000),
26
+ });
27
+ if (!response.ok) {
28
+ throw new PdfReaderError(`Failed to fetch PDF: HTTP ${response.status} ${response.statusText}`, 'FETCH_FAILED', 'Check the URL is correct and accessible.');
29
+ }
30
+ const contentLength = response.headers.get('content-length');
31
+ if (contentLength && parseInt(contentLength, 10) > MAX_FILE_SIZE) {
32
+ throw new PdfReaderError(`Remote PDF size (${(parseInt(contentLength, 10) / 1024 / 1024).toFixed(1)}MB) exceeds the 50MB limit.`, 'FILE_TOO_LARGE', 'Try a smaller PDF file.');
33
+ }
34
+ const buffer = await response.arrayBuffer();
35
+ if (buffer.byteLength > MAX_FILE_SIZE) {
36
+ throw new PdfReaderError(`Downloaded PDF size (${(buffer.byteLength / 1024 / 1024).toFixed(1)}MB) exceeds the 50MB limit.`, 'FILE_TOO_LARGE', 'Try a smaller PDF file.');
37
+ }
38
+ return new Uint8Array(buffer);
39
+ }
40
+ //# sourceMappingURL=url-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-fetcher.js","sourceRoot":"","sources":["../../src/services/url-fetcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CACtB,gBAAgB,GAAG,EAAE,EACrB,aAAa,EACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,cAAc,CACtB,yBAAyB,SAAS,CAAC,QAAQ,EAAE,EAC7C,sBAAsB,EACtB,yCAAyC,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,MAAM,EAAE,iBAAiB;YACzB,YAAY,EAAE,GAAG,WAAW,IAAI,cAAc,EAAE;SACjD;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,cAAc,CACtB,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACrE,cAAc,EACd,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;QACjE,MAAM,IAAI,cAAc,CACtB,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EACvG,gBAAgB,EAChB,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,MAAM,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CACtB,wBAAwB,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EACjG,gBAAgB,EAChB,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Validation & comparison service for Tier 3 tools.
3
+ *
4
+ * Provides PDF/UA tag validation, metadata conformance checks,
5
+ * and structural comparison between two PDFs.
6
+ */
7
+ import type { MetadataValidation, StructureComparison, TaggedValidation } from '../types.js';
8
+ /**
9
+ * Validate PDF/UA tagged structure requirements.
10
+ *
11
+ * Checks performed:
12
+ * - Document is marked as tagged
13
+ * - Structure tree root exists
14
+ * - Document-level root tag present
15
+ * - Heading hierarchy (H1-H6) is sequential
16
+ * - Figure tags have content (potential alt text)
17
+ * - Table tags are present when expected
18
+ * - Minimum structure depth
19
+ */
20
+ export declare function validateTagged(filePath: string): Promise<TaggedValidation>;
21
+ /**
22
+ * Validate PDF metadata conformance.
23
+ *
24
+ * Checks performed:
25
+ * - Title is present (required for PDF/UA, PDF/A)
26
+ * - Author is present
27
+ * - CreationDate format
28
+ * - ModificationDate format
29
+ * - Producer is present
30
+ * - PDF version is detected
31
+ * - Document is tagged (metadata flag)
32
+ * - Subject and Keywords (informational)
33
+ */
34
+ export declare function validateMetadata(filePath: string): Promise<MetadataValidation>;
35
+ /**
36
+ * Compare the structure of two PDF documents.
37
+ *
38
+ * Compares:
39
+ * - Page count
40
+ * - PDF version
41
+ * - Encryption status
42
+ * - Tagged status
43
+ * - Total objects
44
+ * - Stream count
45
+ * - Page dimensions (first page)
46
+ * - Fonts used (set difference)
47
+ */
48
+ export declare function compareStructure(filePath1: string, filePath2: string): Promise<StructureComparison>;
49
+ //# sourceMappingURL=validation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-service.d.ts","sourceRoot":"","sources":["../../src/services/validation-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAYrB;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgShF;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8PpF;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAyF9B"}