@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.
- package/dist/pdf-converter.d.ts +16 -33
- package/dist/pdf-converter.d.ts.map +1 -1
- package/dist/pdf-converter.js +298 -109
- package/dist/pdf-converter.js.map +1 -1
- package/package.json +3 -3
- package/dist/__tests__/pdf-converter.test.d.ts +0 -2
- package/dist/__tests__/pdf-converter.test.d.ts.map +0 -1
- package/dist/__tests__/pdf-converter.test.js +0 -39
- package/dist/__tests__/pdf-converter.test.js.map +0 -1
package/dist/pdf-converter.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
9
|
-
*
|
|
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
|
-
|
|
13
|
+
private detectColumns;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
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
|
-
|
|
17
|
+
private processTextItems;
|
|
25
18
|
/**
|
|
26
|
-
*
|
|
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
|
|
22
|
+
private detectTables;
|
|
35
23
|
/**
|
|
36
|
-
*
|
|
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
|
|
26
|
+
private groupByRow;
|
|
45
27
|
/**
|
|
46
|
-
*
|
|
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,
|
|
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"}
|
package/dist/pdf-converter.js
CHANGED
|
@@ -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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
70
|
-
const
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
//
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
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
|
-
*
|
|
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.
|
|
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.
|
|
22
|
-
"@markitdownjs/shared": "0.
|
|
21
|
+
"@markitdownjs/ast": "0.1.3",
|
|
22
|
+
"@markitdownjs/shared": "0.3.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"typescript": "^5.5.0"
|
|
@@ -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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"}
|