Puppeteer — это библиотека Node.js для автоматизации браузера Chrome или
Chromium. Однако в некоторых случаях задача может включать извлечение
данных не только с веб-страниц, но и с локальных или удалённых файлов,
таких как PDF-документы. Хотя Puppeteer сам по себе не предназначен для
работы с PDF, можно эффективно интегрировать его с другими
инструментами, чтобы извлечь текст из PDF-файлов. Одним из
распространённых решений является использование Puppeteer для открытия
PDF-документов в браузере и извлечения текста с помощью инструментов,
таких как pdf.js.
Запуск Puppeteer и загрузка страницы с PDF
Для того чтобы извлечь текст из PDF, Puppeteer сначала должен открыть сам документ в браузере. Это может быть как локальный файл, так и PDF, доступный по URL. В случае с локальными файлами используется файловая система для передачи пути к файлу.
Пример кода для запуска Puppeteer и открытия PDF:
const puppeteer = require(&
async function extractTextFromPdf() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Загрузка PDF-документа
await page.goto('file:///path/to/your/document.pdf', { waitUntil: 'load' });
// Теперь можно извлечь текст или выполнять другие операции
await browser.close();
}
extractTextFromPdf();
Здесь goto используется для загрузки PDF, который можно
открыть в браузере. Важно учитывать, что при работе с локальными файлами
перед этим путь должен быть правильно сформирован.
Использование pdf.js для извлечения текста
Несмотря на то, что Puppeteer сам по себе не предоставляет прямых
методов для извлечения текста из PDF, можно интегрировать его с
pdf.js — библиотекой, которая работает с PDF-документами и
позволяет извлекать текст из них.
Для этого в браузере, который запускает Puppeteer, нужно использовать
pdf.js для рендеринга PDF-документа и извлечения текста.
Это потребует некоторых дополнительных шагов.
Пример кода для извлечения текста:
const puppeteer = require('puppeteer');
const fs = require('fs');
async function extractTextFromPdf() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('file:///path/to/your/document.pdf', { waitUntil: 'load' });
// Загружаем библиотеку pdf.js
await page.addScriptTag({ path: 'path/to/pdf.js' });
// Извлекаем текст из PDF
const text = await page.evaluate(() => {
return new Promise((resolve, reject) => {
const pdfjsLib = window.pdfjsLib;
const url = window.location.href;
pdfjsLib.getDocument(url).promise.then((pdfDoc_) => {
const pdfDoc = pdfDoc_;
let textContent = '';
let pages = pdfDoc.numPages;
let pageNum = 1;
function extractPageText(pageNum) {
pdfDoc.getPage(pageNum).then((page) => {
page.getTextContent().then((text) => {
text.items.forEach(item => {
textContent += item.str + ' ';
});
if (pageNum < pages) {
extractPageText(pageNum + 1);
} else {
resolve(textContent);
}
}).catch(reject);
}).catch(reject);
}
extractPageText(pageNum);
}).catch(reject);
});
});
console.log(text);
await browser.close();
}
extractTextFromPdf();
В этом примере используется библиотека pdf.js, которая
рендерит PDF-документ и извлекает текст с каждой страницы. При этом для
асинхронного извлечения текста применяется рекурсия, так как PDF может
состоять из нескольких страниц.
Извлечение текста с учётом структуры документа
Иногда текст в PDF-документе может быть разделён на несколько блоков,
таблиц или колонок. Чтобы точно извлечь информацию в таких случаях,
нужно учитывать структуру документа. pdf.js позволяет
извлекать текст в виде объектов, которые содержат информацию о каждом
фрагменте текста, включая его позицию на странице.
Для улучшения точности извлечения текста можно использовать информацию о координатах текста, что позволит лучше разделить текст на строки и абзацы, а также извлечь таблицы или колонки.
Пример кода с учётом структуры:
const puppeteer = require('puppeteer');
async function extractStructuredTextFromPdf() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('file:///path/to/your/document.pdf', { waitUntil: 'load' });
await page.addScriptTag({ path: 'path/to/pdf.js' });
const structuredText = await page.evaluate(() => {
return new Promise((resolve, reject) => {
const pdfjsLib = window.pdfjsLib;
const url = window.location.href;
pdfjsLib.getDocument(url).promise.then((pdfDoc_) => {
const pdfDoc = pdfDoc_;
let pages = pdfDoc.numPages;
let pageNum = 1;
let allText = [];
function extractPageText(pageNum) {
pdfDoc.getPage(pageNum).then((page) => {
page.getTextContent().then((textContent) => {
let pageText = [];
textContent.items.forEach(item => {
pageText.push({
text: item.str,
transform: item.transform,
});
});
allText.push(pageText);
if (pageNum < pages) {
extractPageText(pageNum + 1);
} else {
resolve(allText);
}
}).catch(reject);
}).catch(reject);
}
extractPageText(pageNum);
}).catch(reject);
});
});
console.log(JSON.stringify(structuredText, null, 2));
await browser.close();
}
extractStructuredTextFromPdf();
В этом примере извлекаются не только текстовые строки, но и информация о положении текста на странице. Это может быть полезно, если необходимо анализировать структуру документа или извлекать данные из таблиц и колонок.
При работе с PDF-документами важно учитывать несколько факторов:
pdf.js для корректного
отображения текста.
Puppeteer предоставляет мощные возможности для автоматизации работы с
веб-страницами, включая PDF-документы. С использованием библиотеки
pdf.js можно извлекать текст из PDF, рендерить страницы и
анализировать структуру документа. Этот подход может быть использован в
различных сценариях тестирования и извлечения данных, включая
автоматическую обработку документов в формате PDF на веб-страницах.