Извлечение текста из PDF через определенные пользователем области (pdfjs, DOMRect и Matrix) - PullRequest
0 голосов
/ 08 мая 2019

У нас есть приложение, которое должно автоматически импортировать, например, данные заказа из файла PDF.Пользователь может создать шаблон, в котором он может нарисовать прямоугольники вокруг областей в PDF-файле для текста, который необходимо извлечь позже.

Сейчас я отрисовываю PDF-файл через pdfjs в браузере и позволяю пользователюнарисуйте прямоугольники в PDF (DIV), а затем сохраните результат в базе данных со свойствами DOMRect из них (используя getBoundingClientRect ()).

PDFjs также предоставляет геометрические данные каждого текстового объекта, который он анализирует, НО преобразованиеданные представляют собой матрицу 3х3.Теперь моя проблема в том, что я не знаю, как правильно рассчитать координаты из определенных пользователем областей и матрицы PDFjs 3x3, поэтому они совпадают при обработке их через узел на стороне сервера.

I 'Мы попробовали пару вещей, которые не принесли необходимых результатов.Первый метод все еще использовал библиотеку парсинга PDF для PHP, но я быстро отказался от нее, поскольку она не предоставляла никаких позиционных данных.

Затем я использовал Node и PDFjs, что привело кпроблема вычисления пользовательских полей с матрицами текстовых объектов PDFjs.

Вчера я попытался использовать библиотеку jsdom для создания виртуального dom и просто проверил визуализированные объекты текстового слоя с данными, определенными пользователем.Это несколько сработало, НО как-то в то время как в обычном браузере позиции совпадают просто отлично, используя метод jsdom, я вижу разные результаты.Я подозреваю, что сама jsdom может быть причиной, так как это не настоящий движок рендеринга, поэтому он может искажать или не предоставлять некоторые вещи, которые есть у вас в обычном браузере.

Мои две другие альтернативы, которые я придумал, были былибо полностью обработать импорт данных на стороне клиента, либо поиграть с pupeteer.

Но прежде чем я это сделаю, я хотел спросить, может быть, есть более простой способ и просто правильно рассчитать позиционные данные из определенных пользователемобласти (x, y, w, h) и матрица 3x3.Я не очень хорош в математике.: D

Типичный текстовый объект из PDFjs выглядит следующим образом:

{ 
  "str": "Textstring", 
  "dir": "ltr", 
  "width": 71.24220000000001, 
  "height": 20.04, 
  "transform": [20.04, 0, 0, 20.04, 58.584, 804.24], 
  "fontName": "Helvetica" 
}

Хотя пользовательские данные выглядят следующим образом:

{
  "x": 274,
  "y": 397,
  "width": 140,
  "height": 83,
  "top": 397,
  "right": 414,
  "bottom": 480,
  "left": 274
}

Ожидаемый результат должен бытьчто позиционные данные текстовых объектов PDFjs и определенных пользователем областей могут использоваться вместе для расчета, если определенная пользователем область пересекается с текстовым объектом PDFjs.Либо путем каким-либо образом преобразовать матрицу 3x3 в действительные координаты x, y, w, h ИЛИ преобразовать пользовательские координаты x, y, w, h в матрицу 3x3.

...