@markitdownjs/pdf 0.1.1 → 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.
@@ -4,49 +4,32 @@ export declare class PdfConverter implements Converter {
4
4
  readonly id: "pdf";
5
5
  readonly supportedMimeTypes: string[];
6
6
  readonly supportedExtensions: string[];
7
+ canConvert(input: ConversionInput): Promise<boolean>;
8
+ convert(input: ConversionInput): Promise<ConversionResult>;
7
9
  /**
8
- * Determine whether this converter can handle the given input.
9
- * @param input - The conversion input to inspect.
10
- * @returns True if the input is a supported PDF.
10
+ * Detect multi-column layout by clustering text items by x-coordinate.
11
+ * Returns column groups sorted left-to-right.
11
12
  */
12
- canConvert(input: ConversionInput): Promise<boolean>;
13
+ private detectColumns;
13
14
  /**
14
- * Convert a PDF document into markdown via an AST intermediate.
15
- *
16
- * The converter dynamically imports pdfjs-dist, disables the worker, loads
17
- * the PDF, and walks every page extracting text with positional data,
18
- * annotations (links), and font-size information for heading detection.
19
- * An AST is assembled first and then rendered to markdown.
20
- *
21
- * @param input - The conversion input containing PDF data.
22
- * @returns A complete ConversionResult with markdown, AST, and metadata.
15
+ * Process a list of text items into AST nodes (headings and paragraphs).
23
16
  */
24
- convert(input: ConversionInput): Promise<ConversionResult>;
17
+ private processTextItems;
25
18
  /**
26
- * Extract the font size from a PDF text item's transform matrix.
27
- *
28
- * The transform array is `[scaleX, skewX, skewY, scaleY, x, y]`.
29
- * The font size is derived from the absolute value of `scaleX`.
30
- *
31
- * @param item - A PDF text content item.
32
- * @returns The detected font size, or 0 if unavailable.
19
+ * Detect tables by finding text items that align on consistent x-positions
20
+ * across multiple rows.
33
21
  */
34
- private extractFontSize;
22
+ private detectTables;
35
23
  /**
36
- * Classify a text line as a heading based on its font size relative to the
37
- * document body font size.
38
- *
39
- * @param text - The raw text of the line.
40
- * @param fontSize - The font size of the line.
41
- * @param bodyFontSize - The most common (body) font size in the document.
42
- * @returns A HeadingInfo if the line qualifies as a heading, otherwise undefined.
24
+ * Group text items into rows by approximate y-position.
43
25
  */
44
- private classifyHeading;
26
+ private groupByRow;
45
27
  /**
46
- * Convert input data to a Uint8Array.
47
- * @param data - The input data in any supported format.
48
- * @returns The data as a Uint8Array.
28
+ * Build a TableNode AST node from TableData.
49
29
  */
30
+ private buildTableNode;
31
+ private extractFontSize;
32
+ private classifyHeading;
50
33
  private toByteArray;
51
34
  }
52
35
  //# sourceMappingURL=pdf-converter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-converter.d.ts","sourceRoot":"","sources":["../src/pdf-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAW9B,8DAA8D;AAC9D,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAC7B,QAAQ,CAAC,kBAAkB,WAAuB;IAClD,QAAQ,CAAC,mBAAmB,WAAY;IAExC;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B1D;;;;;;;;;;OAUG;IACG,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqLhE;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAOvB;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;;OAIG;YACW,WAAW;CAQ1B"}
1
+ {"version":3,"file":"pdf-converter.d.ts","sourceRoot":"","sources":["../src/pdf-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAKjB,MAAM,sBAAsB,CAAC;AAgC9B,8DAA8D;AAC9D,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAC7B,QAAQ,CAAC,kBAAkB,WAAuB;IAClD,QAAQ,CAAC,mBAAmB,WAAY;IAElC,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBpD,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmNhE;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6DxB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAmEpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAqBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,eAAe;YAuBT,WAAW;CAY1B"}
@@ -1,15 +1,14 @@
1
1
  import { createNode, } from "@markitdownjs/shared";
2
2
  import { MarkdownRenderer } from "@markitdownjs/ast";
3
+ /** Minimum text items per page to consider a PDF as having a text layer */
4
+ const SCANNED_PDF_THRESHOLD = 5;
5
+ /** Minimum x-gap (in PDF units) to consider items as separate columns */
6
+ const COLUMN_GAP_THRESHOLD = 50;
3
7
  /** Convert PDF files to markdown via AST-first processing. */
4
8
  export class PdfConverter {
5
9
  id = "pdf";
6
10
  supportedMimeTypes = ["application/pdf"];
7
11
  supportedExtensions = [".pdf"];
8
- /**
9
- * Determine whether this converter can handle the given input.
10
- * @param input - The conversion input to inspect.
11
- * @returns True if the input is a supported PDF.
12
- */
13
12
  async canConvert(input) {
14
13
  if (input.mimeType && this.supportedMimeTypes.includes(input.mimeType)) {
15
14
  return true;
@@ -21,9 +20,7 @@ export class PdfConverter {
21
20
  }
22
21
  }
23
22
  if (input.data instanceof Uint8Array || input.data instanceof ArrayBuffer) {
24
- const bytes = input.data instanceof Uint8Array
25
- ? input.data
26
- : new Uint8Array(input.data);
23
+ const bytes = input.data instanceof Uint8Array ? input.data : new Uint8Array(input.data);
27
24
  if (bytes.length >= 4 &&
28
25
  bytes[0] === 0x25 &&
29
26
  bytes[1] === 0x50 &&
@@ -34,49 +31,69 @@ export class PdfConverter {
34
31
  }
35
32
  return false;
36
33
  }
37
- /**
38
- * Convert a PDF document into markdown via an AST intermediate.
39
- *
40
- * The converter dynamically imports pdfjs-dist, disables the worker, loads
41
- * the PDF, and walks every page extracting text with positional data,
42
- * annotations (links), and font-size information for heading detection.
43
- * An AST is assembled first and then rendered to markdown.
44
- *
45
- * @param input - The conversion input containing PDF data.
46
- * @returns A complete ConversionResult with markdown, AST, and metadata.
47
- */
48
34
  async convert(input) {
49
35
  const startTime = Date.now();
50
36
  const data = await this.toByteArray(input.data);
51
37
  const renderer = new MarkdownRenderer();
38
+ const opts = input.options ?? {};
39
+ const ratios = opts.headingSizeRatios ?? {};
40
+ const warnings = [];
52
41
  let ast;
53
42
  let markdown;
54
43
  const headings = [];
55
44
  const tables = [];
56
45
  let pageCount = 0;
46
+ let pdfTitle = "";
47
+ let pdfAuthor = "";
57
48
  try {
58
- const pdfjsLib = await import("pdfjs-dist");
59
- // Disable the worker so we don't need a separate worker file.
60
- pdfjsLib.GlobalWorkerOptions.workerSrc = "";
61
- const loadingTask = pdfjsLib.getDocument({ data });
49
+ const pdfjsLib = await import("pdfjs-dist/legacy/build/pdf.mjs");
50
+ const loadingTask = pdfjsLib.getDocument({
51
+ data,
52
+ isEvalSupported: false,
53
+ ...(typeof Worker === "undefined" ? { disableWorker: true } : {}),
54
+ });
62
55
  const pdf = await loadingTask.promise;
63
56
  pageCount = pdf.numPages;
57
+ try {
58
+ const meta = await pdf.getMetadata();
59
+ const info = (meta?.info ?? {});
60
+ pdfTitle = typeof info.Title === "string" ? info.Title : "";
61
+ pdfAuthor = typeof info.Author === "string" ? info.Author : "";
62
+ }
63
+ catch {
64
+ // Metadata is best-effort.
65
+ }
64
66
  const pageNodes = [];
65
67
  for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
66
68
  const page = await pdf.getPage(pageNum);
67
69
  const textContent = await page.getTextContent();
68
70
  const annotations = await page.getAnnotations();
69
- // Collect font sizes for heading classification.
70
- const fontSizes = new Map();
71
+ // Collect text items with positional data.
72
+ const textItems = [];
71
73
  for (const item of textContent.items) {
72
74
  if (!("str" in item) || !item.str)
73
75
  continue;
74
- const fontSize = this.extractFontSize(item);
75
- if (fontSize > 0) {
76
- fontSizes.set(fontSize, (fontSizes.get(fontSize) ?? 0) + 1);
76
+ textItems.push({
77
+ str: item.str,
78
+ transform: item.transform ?? [1, 0, 0, 1, 0, 0],
79
+ fontSize: this.extractFontSize(item),
80
+ });
81
+ }
82
+ // Scanned PDF detection: check text density on first page.
83
+ if (pageNum === 1 && textItems.length < SCANNED_PDF_THRESHOLD) {
84
+ warnings.push({
85
+ converter: this.id,
86
+ message: `Page 1 has only ${textItems.length} text items — this may be a scanned/image PDF. Consider using @markitdownjs/image-ocr for better results.`,
87
+ severity: "warning",
88
+ });
89
+ }
90
+ // Collect font sizes for heading classification.
91
+ const fontSizes = new Map();
92
+ for (const item of textItems) {
93
+ if (item.fontSize > 0) {
94
+ fontSizes.set(item.fontSize, (fontSizes.get(item.fontSize) ?? 0) + 1);
77
95
  }
78
96
  }
79
- // Determine the body font size (most common).
80
97
  let bodyFontSize = 0;
81
98
  let maxCount = 0;
82
99
  for (const [size, count] of fontSizes) {
@@ -90,62 +107,33 @@ export class PdfConverter {
90
107
  for (const annot of annotations) {
91
108
  if (annot.subtype === "Link" && annot.url) {
92
109
  const rect = annot.rect;
93
- // Store by approximate bounding box for lookup.
94
110
  const key = `${Math.round(rect[0])},${Math.round(rect[1])},${Math.round(rect[2])},${Math.round(rect[3])}`;
95
111
  linkMap.set(key, annot.url);
96
112
  }
97
113
  }
98
- // Group text items into logical lines / paragraphs.
99
- const items = textContent.items;
100
- let currentLine = "";
101
- let lastFontSize = 0;
102
- let lastY = 0;
103
- const flushLine = () => {
104
- const trimmed = currentLine.trim();
105
- if (!trimmed)
106
- return;
107
- const heading = this.classifyHeading(trimmed, lastFontSize, bodyFontSize);
108
- if (heading) {
109
- headings.push(heading);
110
- const level = heading.level;
111
- pageNodes.push(createNode({
112
- type: "heading",
113
- level,
114
- children: [
115
- createNode({ type: "text", value: heading.text }),
116
- ],
117
- }));
118
- }
119
- else {
120
- pageNodes.push(createNode({
121
- type: "paragraph",
122
- children: [
123
- createNode({ type: "text", value: trimmed }),
124
- ],
125
- }));
114
+ // Detect multi-column layout.
115
+ const columns = this.detectColumns(textItems);
116
+ if (columns.length > 1) {
117
+ // Multi-column: process each column's items in reading order.
118
+ for (const col of columns) {
119
+ const colNodes = this.processTextItems(col.items, bodyFontSize, ratios, headings, linkMap);
120
+ pageNodes.push(...colNodes);
126
121
  }
127
- currentLine = "";
128
- };
129
- for (const item of items) {
130
- if (!("str" in item))
131
- continue;
132
- const str = item.str;
133
- if (!str)
134
- continue;
135
- const fontSize = this.extractFontSize(item);
136
- const y = "transform" in item && item.transform ? item.transform[5] : 0;
137
- // New line when Y position changes significantly or font size changes.
138
- if (currentLine &&
139
- (Math.abs(y - lastY) > fontSize * 0.5 ||
140
- (fontSize !== lastFontSize && lastFontSize > 0))) {
141
- flushLine();
122
+ }
123
+ else {
124
+ // Single column: original behavior.
125
+ const colNodes = this.processTextItems(textItems, bodyFontSize, ratios, headings, linkMap);
126
+ pageNodes.push(...colNodes);
127
+ }
128
+ // Detect and emit tables if grid-aligned text is found.
129
+ const detectedTables = this.detectTables(textItems);
130
+ for (const tableData of detectedTables) {
131
+ tables.push(tableData);
132
+ const tableNode = this.buildTableNode(tableData);
133
+ if (tableNode) {
134
+ pageNodes.push(tableNode);
142
135
  }
143
- currentLine += str;
144
- lastFontSize = fontSize;
145
- lastY = y;
146
136
  }
147
- flushLine();
148
- // Add page break between pages (not after the last page).
149
137
  if (pageNum < pdf.numPages) {
150
138
  pageNodes.push(createNode({
151
139
  type: "page-break",
@@ -158,8 +146,28 @@ export class PdfConverter {
158
146
  children: pageNodes,
159
147
  });
160
148
  markdown = renderer.render(ast);
149
+ if (opts.pageBreakMarker) {
150
+ markdown = markdown.replace(/\n\n---\n\n/g, `\n\n${opts.pageBreakMarker}\n\n`);
151
+ }
152
+ if (opts.injectFrontmatter) {
153
+ const fm = ["---"];
154
+ const yamlEscape = (s) => s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
155
+ if (pdfTitle)
156
+ fm.push(`title: "${yamlEscape(pdfTitle)}"`);
157
+ if (pdfAuthor)
158
+ fm.push(`author: "${yamlEscape(pdfAuthor)}"`);
159
+ fm.push(`pages: ${pageCount}`);
160
+ fm.push("---");
161
+ markdown = fm.join("\n") + "\n\n" + markdown;
162
+ }
161
163
  }
162
- catch {
164
+ catch (error) {
165
+ const message = error instanceof Error ? error.message : String(error);
166
+ warnings.push({
167
+ converter: this.id,
168
+ message: `PDF parsing failed: ${message}`,
169
+ severity: "error",
170
+ });
163
171
  ast = createNode({
164
172
  type: "document",
165
173
  children: [
@@ -181,6 +189,8 @@ export class PdfConverter {
181
189
  markdown,
182
190
  metadata: {
183
191
  pageCount,
192
+ ...(pdfTitle && { title: pdfTitle }),
193
+ ...(pdfAuthor && { author: pdfAuthor }),
184
194
  format: "application/pdf",
185
195
  source: "pdfjs-dist",
186
196
  },
@@ -199,17 +209,208 @@ export class PdfConverter {
199
209
  outputSize: markdown.length,
200
210
  pagesProcessed: pageCount,
201
211
  },
212
+ warnings: warnings.length > 0 ? warnings : undefined,
213
+ };
214
+ }
215
+ /**
216
+ * Detect multi-column layout by clustering text items by x-coordinate.
217
+ * Returns column groups sorted left-to-right.
218
+ */
219
+ detectColumns(items) {
220
+ if (items.length === 0)
221
+ return [];
222
+ // Extract x-positions from transform arrays.
223
+ const positions = items.map((item) => ({
224
+ item,
225
+ x: item.transform[4] ?? 0,
226
+ }));
227
+ // Sort by x position.
228
+ positions.sort((a, b) => a.x - b.x);
229
+ // Find gaps larger than threshold to split columns.
230
+ const posGroups = [[positions[0]]];
231
+ for (let i = 1; i < positions.length; i++) {
232
+ const prev = positions[i - 1];
233
+ const curr = positions[i];
234
+ if (curr.x - prev.x > COLUMN_GAP_THRESHOLD) {
235
+ posGroups.push([curr]);
236
+ }
237
+ else {
238
+ posGroups[posGroups.length - 1].push(curr);
239
+ }
240
+ }
241
+ if (posGroups.length <= 1) {
242
+ // Single column — return all items as one group.
243
+ return [{ xMin: 0, xMax: 0, items }];
244
+ }
245
+ return posGroups.map((group) => ({
246
+ xMin: Math.min(...group.map((p) => p.x)),
247
+ xMax: Math.max(...group.map((p) => p.x)),
248
+ items: group.map((p) => p.item),
249
+ }));
250
+ }
251
+ /**
252
+ * Process a list of text items into AST nodes (headings and paragraphs).
253
+ */
254
+ processTextItems(items, bodyFontSize, ratios, headings, _linkMap) {
255
+ const nodes = [];
256
+ let currentLine = "";
257
+ let lastFontSize = 0;
258
+ let lastY = 0;
259
+ const flushLine = () => {
260
+ const trimmed = currentLine.trim();
261
+ if (!trimmed)
262
+ return;
263
+ const heading = this.classifyHeading(trimmed, lastFontSize, bodyFontSize, ratios);
264
+ if (heading) {
265
+ headings.push(heading);
266
+ const level = heading.level;
267
+ nodes.push(createNode({
268
+ type: "heading",
269
+ level,
270
+ children: [createNode({ type: "text", value: heading.text })],
271
+ }));
272
+ }
273
+ else {
274
+ nodes.push(createNode({
275
+ type: "paragraph",
276
+ children: [createNode({ type: "text", value: trimmed })],
277
+ }));
278
+ }
279
+ currentLine = "";
202
280
  };
281
+ for (const item of items) {
282
+ if (!item.str)
283
+ continue;
284
+ const fontSize = item.fontSize;
285
+ const y = item.transform[5] ?? 0;
286
+ if (currentLine &&
287
+ (Math.abs(y - lastY) > fontSize * 0.5 ||
288
+ (fontSize !== lastFontSize && lastFontSize > 0))) {
289
+ flushLine();
290
+ }
291
+ currentLine += item.str;
292
+ lastFontSize = fontSize;
293
+ lastY = y;
294
+ }
295
+ flushLine();
296
+ return nodes;
297
+ }
298
+ /**
299
+ * Detect tables by finding text items that align on consistent x-positions
300
+ * across multiple rows.
301
+ */
302
+ detectTables(items) {
303
+ if (items.length < 6)
304
+ return []; // Need at least 6 items for a 2x3 table
305
+ // Group items by approximate y-position (same row).
306
+ const rows = this.groupByRow(items);
307
+ if (rows.length < 2)
308
+ return [];
309
+ // Find x-positions that appear across multiple rows.
310
+ const xBuckets = new Map(); // x-bucket -> count of rows
311
+ for (const row of rows) {
312
+ const uniqueXs = new Set();
313
+ for (const item of row) {
314
+ const xBucket = Math.round((item.transform[4] ?? 0) / 10) * 10; // bucket by 10 units
315
+ uniqueXs.add(xBucket);
316
+ }
317
+ for (const x of uniqueXs) {
318
+ xBuckets.set(x, (xBuckets.get(x) ?? 0) + 1);
319
+ }
320
+ }
321
+ // Columns must appear in at least half the rows.
322
+ const minRowCount = Math.ceil(rows.length * 0.5);
323
+ const columnXs = Array.from(xBuckets.entries())
324
+ .filter(([_, count]) => count >= minRowCount)
325
+ .map(([x]) => x)
326
+ .sort((a, b) => a - b);
327
+ if (columnXs.length < 2)
328
+ return []; // Need at least 2 columns for a table
329
+ // Build the table grid.
330
+ const tableRows = [];
331
+ for (const row of rows) {
332
+ const cells = new Array(columnXs.length).fill("");
333
+ for (const item of row) {
334
+ const x = item.transform[4] ?? 0;
335
+ // Find closest column.
336
+ let bestCol = 0;
337
+ let bestDist = Infinity;
338
+ for (let c = 0; c < columnXs.length; c++) {
339
+ const dist = Math.abs(x - columnXs[c]);
340
+ if (dist < bestDist) {
341
+ bestDist = dist;
342
+ bestCol = c;
343
+ }
344
+ }
345
+ if (bestDist < 30) {
346
+ cells[bestCol] = cells[bestCol] ? cells[bestCol] + " " + item.str : item.str;
347
+ }
348
+ }
349
+ if (cells.some((c) => c.trim() !== "")) {
350
+ tableRows.push(cells);
351
+ }
352
+ }
353
+ if (tableRows.length < 2)
354
+ return [];
355
+ const headers = tableRows[0];
356
+ const dataRows = tableRows.slice(1);
357
+ return [
358
+ {
359
+ headers,
360
+ rows: dataRows,
361
+ },
362
+ ];
363
+ }
364
+ /**
365
+ * Group text items into rows by approximate y-position.
366
+ */
367
+ groupByRow(items) {
368
+ const sorted = [...items].sort((a, b) => (b.transform[5] ?? 0) - (a.transform[5] ?? 0));
369
+ const rows = [];
370
+ let currentRow = [sorted[0]];
371
+ let lastY = sorted[0].transform[5] ?? 0;
372
+ for (let i = 1; i < sorted.length; i++) {
373
+ const item = sorted[i];
374
+ const y = item.transform[5] ?? 0;
375
+ if (Math.abs(y - lastY) < item.fontSize * 0.5) {
376
+ currentRow.push(item);
377
+ }
378
+ else {
379
+ rows.push(currentRow.sort((a, b) => (a.transform[4] ?? 0) - (b.transform[4] ?? 0)));
380
+ currentRow = [item];
381
+ lastY = y;
382
+ }
383
+ }
384
+ rows.push(currentRow.sort((a, b) => (a.transform[4] ?? 0) - (b.transform[4] ?? 0)));
385
+ return rows;
203
386
  }
204
387
  /**
205
- * Extract the font size from a PDF text item's transform matrix.
206
- *
207
- * The transform array is `[scaleX, skewX, skewY, scaleY, x, y]`.
208
- * The font size is derived from the absolute value of `scaleX`.
209
- *
210
- * @param item - A PDF text content item.
211
- * @returns The detected font size, or 0 if unavailable.
388
+ * Build a TableNode AST node from TableData.
212
389
  */
390
+ buildTableNode(data) {
391
+ if (data.headers.length === 0)
392
+ return null;
393
+ const headerRow = createNode({
394
+ type: "table-row",
395
+ isHeader: true,
396
+ children: data.headers.map((h) => createNode({
397
+ type: "table-cell",
398
+ children: [createNode({ type: "text", value: h })],
399
+ })),
400
+ });
401
+ const dataRowNodes = data.rows.map((row) => createNode({
402
+ type: "table-row",
403
+ isHeader: false,
404
+ children: row.map((cell) => createNode({
405
+ type: "table-cell",
406
+ children: [createNode({ type: "text", value: cell })],
407
+ })),
408
+ }));
409
+ return createNode({
410
+ type: "table",
411
+ children: [headerRow, ...dataRowNodes],
412
+ });
413
+ }
213
414
  extractFontSize(item) {
214
415
  const transform = item.transform;
215
416
  if (!transform || transform.length < 1)
@@ -217,31 +418,20 @@ export class PdfConverter {
217
418
  const val = transform[0];
218
419
  return val !== undefined ? Math.abs(val) : 0;
219
420
  }
220
- /**
221
- * Classify a text line as a heading based on its font size relative to the
222
- * document body font size.
223
- *
224
- * @param text - The raw text of the line.
225
- * @param fontSize - The font size of the line.
226
- * @param bodyFontSize - The most common (body) font size in the document.
227
- * @returns A HeadingInfo if the line qualifies as a heading, otherwise undefined.
228
- */
229
- classifyHeading(text, fontSize, bodyFontSize) {
421
+ classifyHeading(text, fontSize, bodyFontSize, ratios = {}) {
230
422
  const trimmed = text.trim();
231
423
  if (!trimmed)
232
424
  return undefined;
233
- // Use relative sizing when a body font size is known.
234
425
  if (bodyFontSize > 0) {
235
426
  const ratio = fontSize / bodyFontSize;
236
- if (ratio > 1.8)
427
+ if (ratio > (ratios.h1 ?? 1.8))
237
428
  return { level: 1, text: trimmed };
238
- if (ratio > 1.4)
429
+ if (ratio > (ratios.h2 ?? 1.4))
239
430
  return { level: 2, text: trimmed };
240
- if (ratio > 1.15)
431
+ if (ratio > (ratios.h3 ?? 1.15))
241
432
  return { level: 3, text: trimmed };
242
433
  return undefined;
243
434
  }
244
- // Fallback to absolute thresholds.
245
435
  if (fontSize > 20)
246
436
  return { level: 1, text: trimmed };
247
437
  if (fontSize > 16)
@@ -250,18 +440,17 @@ export class PdfConverter {
250
440
  return { level: 3, text: trimmed };
251
441
  return undefined;
252
442
  }
253
- /**
254
- * Convert input data to a Uint8Array.
255
- * @param data - The input data in any supported format.
256
- * @returns The data as a Uint8Array.
257
- */
258
443
  async toByteArray(data) {
259
- if (data instanceof Uint8Array)
260
- return data;
444
+ if (data instanceof Uint8Array) {
445
+ return data.constructor === Uint8Array
446
+ ? data
447
+ : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
448
+ }
261
449
  if (data instanceof ArrayBuffer)
262
450
  return new Uint8Array(data);
263
- if (data instanceof Blob)
451
+ if (typeof Blob !== "undefined" && data instanceof Blob) {
264
452
  return new Uint8Array(await data.arrayBuffer());
453
+ }
265
454
  return new TextEncoder().encode(data);
266
455
  }
267
456
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-converter.js","sourceRoot":"","sources":["../src/pdf-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdf-converter.js","sourceRoot":"","sources":["../src/pdf-converter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markitdownjs/pdf",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "PDF converter for MarkItDownJS",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -18,8 +18,8 @@
18
18
  ],
19
19
  "dependencies": {
20
20
  "pdfjs-dist": "^4.0.0",
21
- "@markitdownjs/ast": "0.1.1",
22
- "@markitdownjs/shared": "0.1.1"
21
+ "@markitdownjs/ast": "0.1.3",
22
+ "@markitdownjs/shared": "0.3.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "typescript": "^5.5.0"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=pdf-converter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdf-converter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pdf-converter.test.ts"],"names":[],"mappings":""}
@@ -1,39 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { PdfConverter } from '../pdf-converter.js';
3
- describe('PdfConverter', () => {
4
- const converter = new PdfConverter();
5
- it('should detect PDF by MIME type', async () => {
6
- expect(await converter.canConvert({ data: '', mimeType: 'application/pdf' })).toBe(true);
7
- });
8
- it('should detect PDF by extension', async () => {
9
- expect(await converter.canConvert({ data: '', fileName: 'test.pdf' })).toBe(true);
10
- expect(await converter.canConvert({ data: '', fileName: 'DOCUMENT.PDF' })).toBe(true);
11
- });
12
- it('should detect PDF by magic bytes', async () => {
13
- const pdfHeader = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d, 0x31, 0x2e, 0x34]);
14
- expect(await converter.canConvert({ data: pdfHeader })).toBe(true);
15
- });
16
- it('should detect PDF from ArrayBuffer', async () => {
17
- const buffer = new ArrayBuffer(8);
18
- const view = new Uint8Array(buffer);
19
- view[0] = 0x25;
20
- view[1] = 0x50;
21
- view[2] = 0x44;
22
- view[3] = 0x46;
23
- expect(await converter.canConvert({ data: buffer })).toBe(true);
24
- });
25
- it('should reject non-PDF files', async () => {
26
- expect(await converter.canConvert({ data: 'hello', fileName: 'test.txt' })).toBe(false);
27
- expect(await converter.canConvert({ data: new Uint8Array([0x00, 0x01, 0x02, 0x03]) })).toBe(false);
28
- });
29
- it('should return fallback markdown for invalid PDF data', async () => {
30
- const result = await converter.convert({
31
- data: new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x00, 0x00]),
32
- mimeType: 'application/pdf',
33
- });
34
- expect(result.markdown).toContain('[PDF content could not be extracted]');
35
- expect(result.ast).toBeDefined();
36
- expect(result.ast.type).toBe('document');
37
- });
38
- });
39
- //# sourceMappingURL=pdf-converter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdf-converter.test.js","sourceRoot":"","sources":["../../src/__tests__/pdf-converter.test.ts"],"names":[],"mappings":"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"}