= {},
) {
if (options.method === "liteparse") {
const { method: _method, ...liteParseOptions } = options;
return convertPDFToHTMLWithLiteParse(pdfURLOrBuffer, liteParseOptions);
}
if (options.method === "liteparse-wasm") {
const { method: _method, ...liteParseOptions } = options;
return convertPDFToHTMLWithLiteParseWasm(
pdfURLOrBuffer,
liteParseOptions as unknown as LiteParseWasmHTMLOptions,
);
}
// try {
var { addPageNumbers = false, addCitation = true } = options;
// pass in databuffer or download all pdf data
// and convert to array buffer
var buffer =
typeof pdfURLOrBuffer === "string"
? await grab(pdfURLOrBuffer, {
responseType: "arraybuffer",
timeout: 10,
})
: pdfURLOrBuffer;
let pdfDocument;
try {
let { resolvePDFJS } = await import("https://cdn.jsdelivr.net/npm/pdfjs-serverless@1.1.0/+esm" as any);
const { getDocument } = await resolvePDFJS();
pdfDocument = await getDocument({
data: new Uint8Array(buffer),
useSystemFonts: true,
verbosity: 0,
}).promise;
} catch (e: any) {
return { error: e.message };
}
const pages = [...Array(pdfDocument.numPages).keys()].map(
(index) => new Page({ index }),
);
let pageIndexNumMap = {};
let firstPage;
for (let j = 1; j <= pdfDocument.numPages; j++) {
const page = await pdfDocument.getPage(j);
const textContent = await page.getTextContent();
if (Object.keys(pageIndexNumMap).length < 10) {
pageIndexNumMap = findPageNumbers(
pageIndexNumMap,
page.pageNumber - 1,
textContent.items,
);
} else {
firstPage = findFirstPage(pageIndexNumMap);
break;
}
}
let pageNum = firstPage ? firstPage.pageNum : 0;
for (let j = 1; j <= pdfDocument.numPages; j++) {
const page = await pdfDocument.getPage(j);
// Trigger the font retrieval for the page
await page.getOperatorList();
const scale = 1.0;
const viewport = page.getViewport({ scale });
let textContent = await page.getTextContent();
if (firstPage && (page as any).pageIndex >= firstPage.pageIndex) {
textContent = removePageNumber(textContent as any, pageNum) as any;
pageNum++;
}
const textItems = (textContent.items as any[]).map((item: any) => {
const tx = [1, 0, 0, 1, 0, 0];
for (let i = 0; i < 6; i++) {
tx[i] += item.transform[i] * viewport.transform[i % 2 ? 3 : 0];
if (i % 2) {
tx[i + 1] += item.transform[i] * viewport.transform[1];
}
}
const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);
const dividedHeight = item.height / fontHeight;
return new TextItem({
x: Math.round(item.transform[4]),
y: Math.round(item.transform[5]),
width: Math.round(item.width),
height: Math.round(dividedHeight <= 1 ? item.height : dividedHeight),
text: item.str,
font: item.fontName,
});
});
pages[page.pageNumber - 1].items = textItems;
}
var parseResult = new ParseResult({ pages });
let lastTransformation: (typeof transformations)[number] | undefined,
transformations = [
new CalculateGlobalStats(),
new CompactLines(),
new RemoveRepetitiveElements(),
new VerticalToHorizontal(),
new DetectTOC(),
new DetectHeaders(),
new DetectListItems(),
new GatherBlocks(),
new DetectCodeQuoteBlocks(),
new DetectListLevels(),
new ToTextBlocks(),
new ToHTML(),
];
transformations?.forEach((transformation) => {
if (lastTransformation) {
parseResult = lastTransformation.completeTransform(parseResult);
}
parseResult = transformation.transform(parseResult);
lastTransformation = transformation;
});
var html = parseResult.pages.reduce((acc, page, pageNumber) => {
return (
acc +
`${
addPageNumbers ? ` [${pageNumber + 1}] ` : ""
}${page.items.join('
')}
`
);
}, "");
if (addCitation) {
// Get metadata
// avoid using date as it is unreliable sand generally file mod date
var metadata = await pdfDocument.getMetadata();
var { Author: author, Title: title } = metadata.info as any;
// date =
// date.slice(2, 6) + "-" + date.slice(6, 8) + "-" + date.slice(8, 10);
// date = date ? new Date(date)?.toISOString().split("T")[0] : null;
//look for date in first page
// date = chrono
// .parseDate(content.slice(0, 400))
// ?.toISOString()
// .split("T")[0];
// // || date;
title = html.slice(0, 400).match(/(.*?)<\/h[0-9]>/)?.[1] || title;
}
return { author, title, html, format: "pdf" };
}
export { convertPDFToHTMLWithLiteParse };
export type { LiteParseHTMLOptions } from "./liteparse-to-html";
export { convertPDFToHTMLWithLiteParseWasm };
export type { LiteParseWasmHTMLOptions } from "./liteparse-wasm-to-html";
export { detectPdfNeedsOcr } from "./detect-needs-ocr";
export type {
DetectPdfNeedsOcrOptions,
PdfOcrAssessment,
} from "./detect-needs-ocr";