Извлечение PDF в текст в nodejs без зависимостей ОС

Есть ли способ извлечь текст из PDF-файлов в nodejs без каких-либо зависимостей ОС (например, pdf2text или xpdf в Windows)? Я не смог найти никаких "нативных" pdf-пакетов в nodejs. Они всегда являются оболочкой / утилитой поверх существующей команды ОС. Спасибо

5 ответов

Решение

Вы проверяли PDF2Json? Он построен поверх PDF.js. Хотя он не обеспечивает вывод текста в виде одной строки, но я думаю, что вы можете просто восстановить окончательный текст на основе сгенерированного вывода Json:

"Тексты": массив текстовых блоков с позицией, фактическим текстом и информацией о стилях: "x" и "y": относительные координаты для позиционирования "clr": индекс цвета в словаре цветов, то же поле "clr", что и в "Fill" объект Если цвет можно найти в словаре цветов, поле 'oc' будет добавлено в поле в качестве значения 'original color'. 'A': выравнивание текста, в том числе: по левому центру вправо 'R': массив текстового прогона, каждый Текстовый объект запуска имеет два основных поля: "T": фактический текст "S": индекс стиля из словаря стилей. Дополнительную информацию о "Словаре стиля" можно найти в разделе "Справочник по словарю"

Поработав, я наконец получил надежную функцию чтения текста из PDF с помощью https://github.com/mozilla/pdfjs-dist

Чтобы заставить это работать, сначала установите npm в командной строке:

npm i pdfjs-dist

Затем создайте файл с этим кодом (в этом примере я назвал файл "pdfExport.js"):

const pdfjsLib = require("pdfjs-dist");

async function GetTextFromPDF(path) {
    let doc = await pdfjsLib.getDocument(path).promise;
    let page1 = await doc.getPage(1);
    let content = await page1.getTextContent();
    let strings = content.items.map(function(item) {
        return item.str;
    });
    return strings;
}
module.exports = { GetTextFromPDF }

Затем его можно просто использовать в любом другом файле js, который у вас есть:

const pdfExport = require('./pdfExport');
pdfExport.GetTextFromPDF('./sample.pdf').then(data => console.log(data);

Думал, что перезвоню всем, кто сталкивался с этим вопросом в будущем. У меня была эта проблема, и я часами просматривал буквально все библиотеки PDF на NPM. Мои требования заключались в том, что мне нужно было запустить его на AWS Lambda, чтобы не зависеть от зависимостей ОС.

Приведенный ниже код адаптирован из другого ответа stackru (который я в настоящее время не могу найти). Единственная разница в том, что мы импортируем версию ES5, которая работает с Node >= 12. Если вы просто импортируете pdfjs-dist, появится ошибка "Читаемый поток не определен". Надеюсь, это поможет!

import * as pdfjslib from 'pdfjs-dist/es5/build/pdf.js';

export default class Pdf {
  public static async getPageText(pdf: any, pageNo: number) {
    const page = await pdf.getPage(pageNo);
    const tokenizedText = await page.getTextContent();
    const pageText = tokenizedText.items.map((token: any) => token.str).join('');
    return pageText;
  }

  public static async getPDFText(source: any): Promise<string> {
    const pdf = await pdfjslib.getDocument(source).promise;
    const maxPages = pdf.numPages;
    const pageTextPromises = [];
    for (let pageNo = 1; pageNo <= maxPages; pageNo += 1) {
      pageTextPromises.push(Pdf.getPageText(pdf, pageNo));
    }
    const pageTexts = await Promise.all(pageTextPromises);
    return pageTexts.join(' ');
  }
}

Применение

const fileBuffer = fs.readFile('sample.pdf');
const pdfText = await Pdf.getPDFText(fileBuffer);

Это решение сработало для меня, используя узел 14.20.1, используя"pdf-parse": "^1.1.1"

Вы можете установить его с помощью:

yarn add pdf-parse

Это основная функция, которая преобразует файл PDF в текст.

      const path = require('path');
const fs = require('fs');
const pdf = require('pdf-parse');
const assert = require('assert');

const extractText = async (pathStr) => {
  assert (fs.existsSync(pathStr), `Path does not exist ${pathStr}`)
  const pdfFile = path.resolve(pathStr)
  const dataBuffer = fs.readFileSync(pdfFile);
  const data = await pdf(dataBuffer)
  return data.text
}

module.exports = {
  extractText
}

Затем вы можете использовать функцию следующим образом:

      const { extractText } = require('../api/lighthouse/lib/pdfExtraction')

extractText('./data/CoreDeveloper-v5.1.4.pdf').then(t => console.log(t))

Вместо использования предложенного PDF2Json вы также можете использовать PDF.js напрямую ( https://github.com/mozilla/pdfjs-dist). Преимущество этого в том, что вы не зависите от скромности, которой принадлежит PDF2Json, и он обновляет базу PDF.js.

Другие вопросы по тегам