@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.
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/README.ja.md +190 -0
- package/README.md +206 -0
- package/dist/constants.d.ts +22 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +14 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +26 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/tier1.d.ts +104 -0
- package/dist/schemas/tier1.d.ts.map +1 -0
- package/dist/schemas/tier1.js +77 -0
- package/dist/schemas/tier1.js.map +1 -0
- package/dist/schemas/tier2.d.ts +68 -0
- package/dist/schemas/tier2.d.ts.map +1 -0
- package/dist/schemas/tier2.js +42 -0
- package/dist/schemas/tier2.js.map +1 -0
- package/dist/schemas/tier3.d.ts +44 -0
- package/dist/schemas/tier3.d.ts.map +1 -0
- package/dist/schemas/tier3.js +28 -0
- package/dist/schemas/tier3.js.map +1 -0
- package/dist/services/pdfjs-service.d.ts +65 -0
- package/dist/services/pdfjs-service.d.ts.map +1 -0
- package/dist/services/pdfjs-service.js +520 -0
- package/dist/services/pdfjs-service.js.map +1 -0
- package/dist/services/pdflib-service.d.ts +35 -0
- package/dist/services/pdflib-service.d.ts.map +1 -0
- package/dist/services/pdflib-service.js +318 -0
- package/dist/services/pdflib-service.js.map +1 -0
- package/dist/services/url-fetcher.d.ts +8 -0
- package/dist/services/url-fetcher.d.ts.map +1 -0
- package/dist/services/url-fetcher.js +40 -0
- package/dist/services/url-fetcher.js.map +1 -0
- package/dist/services/validation-service.d.ts +49 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +670 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +46 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tier1/get-metadata.d.ts +6 -0
- package/dist/tools/tier1/get-metadata.d.ts.map +1 -0
- package/dist/tools/tier1/get-metadata.js +49 -0
- package/dist/tools/tier1/get-metadata.js.map +1 -0
- package/dist/tools/tier1/get-page-count.d.ts +6 -0
- package/dist/tools/tier1/get-page-count.d.ts.map +1 -0
- package/dist/tools/tier1/get-page-count.js +50 -0
- package/dist/tools/tier1/get-page-count.js.map +1 -0
- package/dist/tools/tier1/read-images.d.ts +6 -0
- package/dist/tools/tier1/read-images.d.ts.map +1 -0
- package/dist/tools/tier1/read-images.js +79 -0
- package/dist/tools/tier1/read-images.js.map +1 -0
- package/dist/tools/tier1/read-text.d.ts +6 -0
- package/dist/tools/tier1/read-text.d.ts.map +1 -0
- package/dist/tools/tier1/read-text.js +57 -0
- package/dist/tools/tier1/read-text.js.map +1 -0
- package/dist/tools/tier1/read-url.d.ts +6 -0
- package/dist/tools/tier1/read-url.d.ts.map +1 -0
- package/dist/tools/tier1/read-url.js +64 -0
- package/dist/tools/tier1/read-url.js.map +1 -0
- package/dist/tools/tier1/search-text.d.ts +6 -0
- package/dist/tools/tier1/search-text.d.ts.map +1 -0
- package/dist/tools/tier1/search-text.js +62 -0
- package/dist/tools/tier1/search-text.js.map +1 -0
- package/dist/tools/tier1/summarize.d.ts +6 -0
- package/dist/tools/tier1/summarize.d.ts.map +1 -0
- package/dist/tools/tier1/summarize.js +70 -0
- package/dist/tools/tier1/summarize.js.map +1 -0
- package/dist/tools/tier2/inspect-annotations.d.ts +6 -0
- package/dist/tools/tier2/inspect-annotations.d.ts.map +1 -0
- package/dist/tools/tier2/inspect-annotations.js +47 -0
- package/dist/tools/tier2/inspect-annotations.js.map +1 -0
- package/dist/tools/tier2/inspect-fonts.d.ts +6 -0
- package/dist/tools/tier2/inspect-fonts.d.ts.map +1 -0
- package/dist/tools/tier2/inspect-fonts.js +54 -0
- package/dist/tools/tier2/inspect-fonts.js.map +1 -0
- package/dist/tools/tier2/inspect-signatures.d.ts +6 -0
- package/dist/tools/tier2/inspect-signatures.d.ts.map +1 -0
- package/dist/tools/tier2/inspect-signatures.js +48 -0
- package/dist/tools/tier2/inspect-signatures.js.map +1 -0
- package/dist/tools/tier2/inspect-structure.d.ts +6 -0
- package/dist/tools/tier2/inspect-structure.d.ts.map +1 -0
- package/dist/tools/tier2/inspect-structure.js +46 -0
- package/dist/tools/tier2/inspect-structure.js.map +1 -0
- package/dist/tools/tier2/inspect-tags.d.ts +6 -0
- package/dist/tools/tier2/inspect-tags.d.ts.map +1 -0
- package/dist/tools/tier2/inspect-tags.js +46 -0
- package/dist/tools/tier2/inspect-tags.js.map +1 -0
- package/dist/tools/tier3/compare-structure.d.ts +6 -0
- package/dist/tools/tier3/compare-structure.d.ts.map +1 -0
- package/dist/tools/tier3/compare-structure.js +47 -0
- package/dist/tools/tier3/compare-structure.js.map +1 -0
- package/dist/tools/tier3/validate-metadata.d.ts +6 -0
- package/dist/tools/tier3/validate-metadata.d.ts.map +1 -0
- package/dist/tools/tier3/validate-metadata.js +57 -0
- package/dist/tools/tier3/validate-metadata.js.map +1 -0
- package/dist/tools/tier3/validate-tagged.d.ts +6 -0
- package/dist/tools/tier3/validate-tagged.d.ts.map +1 -0
- package/dist/tools/tier3/validate-tagged.js +56 -0
- package/dist/tools/tier3/validate-tagged.js.map +1 -0
- package/dist/types.d.ts +226 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/batch-processor.d.ts +60 -0
- package/dist/utils/batch-processor.d.ts.map +1 -0
- package/dist/utils/batch-processor.js +72 -0
- package/dist/utils/batch-processor.js.map +1 -0
- package/dist/utils/error-handler.d.ts +23 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +76 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/formatter.d.ts +64 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +379 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/pdf-helpers.d.ts +22 -0
- package/dist/utils/pdf-helpers.d.ts.map +1 -0
- package/dist/utils/pdf-helpers.js +68 -0
- package/dist/utils/pdf-helpers.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC;AAUjB,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;QACvC,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;YACvC,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAE5B,0BAA0B;IAC1B,MAAM,cAAc,GAAmB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,cAAc,CAAC,IAAI,CAAC;YAClB,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE;YACrB,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI;YAC5B,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAoC,EAAE,CAAC;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,eAAe,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,CAAC,GAAG,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;YACxC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAiB;QAC7B,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE;QAC9B,eAAe;KAChB,CAAC;IAEF,oBAAoB;IACpB,MAAM,UAAU,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC;IACtD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,YAAY,EAAE,UAAU,CAAC,MAAM;QAC/B,WAAW;QACX,MAAM;KACP,CAAC;IAEF,yEAAyE;IACzE,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,YAAY,EAAE,CAAC;QACjB,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,6EAA6E;YAC7E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC7D,IAAI,KAAK;oBAAE,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,QAAQ;QACR,WAAW;QACX,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU;KACX,CAAC;AACJ,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IAC3D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE7B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;QACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;YAEzC,oCAAoC;YACpC,IAAI,UAA+B,CAAC;YACpC,IAAI,aAAa,YAAY,MAAM,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnD,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;oBAChC,UAAU,GAAG,QAAQ,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,IAAI,aAAa,YAAY,OAAO,EAAE,CAAC;gBAC5C,UAAU,GAAG,aAAa,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,0BAA0B;YAC1B,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5E,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAE3D,MAAM,YAAY,GAAG,WAAW,EAAE,UAAU,EAAE,IAAI,OAAO,CAAC;YAC1D,MAAM,OAAO,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,SAAS,CAAC;YACtD,MAAM,QAAQ,GAAG,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAElF,mFAAmF;YACnF,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACnE,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,UAA+B,CAAC;gBACpC,IAAI,aAAa,YAAY,MAAM,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBACnD,IAAI,QAAQ,YAAY,OAAO;wBAAE,UAAU,GAAG,QAAQ,CAAC;gBACzD,CAAC;qBAAM,IAAI,aAAa,YAAY,OAAO,EAAE,CAAC;oBAC5C,UAAU,GAAG,aAAa,CAAC;gBAC7B,CAAC;gBACD,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU;wBACR,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;4BACtC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;4BACvC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,uDAAuD;YACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;oBACxB,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,OAAO;oBACb,QAAQ;oBACR,UAAU;oBACV,QAAQ;oBACR,SAAS,EAAE,CAAC,OAAO,CAAC;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,oCAAoC;aAC3C,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,KAAK;gBAAE,SAAS;YAEvD,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,WAAW,CAAC;YACzF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7C,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,UAAU,GAAkB,IAAI,CAAC;YACrC,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,IAAI,QAAQ,GAAkB,IAAI,CAAC;YACnC,IAAI,WAAW,GAAkB,IAAI,CAAC;YACtC,IAAI,WAAW,GAAkB,IAAI,CAAC;YACtC,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,IAAI,SAAS,GAAkB,IAAI,CAAC;YAEpC,yCAAyC;YACzC,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,GAAG,IAAI,CAAC;gBAEhB,IAAI,OAA4B,CAAC;gBACjC,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC1C,IAAI,QAAQ,YAAY,OAAO;wBAAE,OAAO,GAAG,QAAQ,CAAC;gBACtD,CAAC;qBAAM,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;oBACnC,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAClD,QAAQ,GAAG,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBACtD,WAAW,GAAG,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;oBAC5D,WAAW,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAElD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;oBACrE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC;oBAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3E,SAAS,GAAG,YAAY,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS;gBACT,QAAQ;gBACR,UAAU;gBACV,MAAM;gBACN,QAAQ;gBACR,WAAW;gBACX,WAAW;gBACX,MAAM;gBACN,SAAS;aACV,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC5D,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,WAAW;QACX,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW;QAC1C,MAAM;QACN,IAAI,EAAE,2FAA2F;KAClG,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D;;GAEG;AACH,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,GAAG,YAAY,MAAM;QAAE,OAAO,OAAO,GAAG,CAAC,YAAY,GAAG,CAAC;IAC7D,IAAI,GAAG,YAAY,OAAO;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACpD,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;IAC3D,IAAI,GAAG,YAAY,OAAO;QAAE,OAAO,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,WAAW,CAAC;IAC3E,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,UAAU,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC;IAC9E,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACtD,IAAI,GAAG,YAAY,YAAY;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACzD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACrD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAa,EAAE,GAAW;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACtD,IAAI,GAAG,YAAY,YAAY;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACzD,IAAI,GAAG,YAAY,OAAO;QAAE,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -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"}
|