pdf.js mozilla lib проблема получения или извлечения чистого текста в правильном порядке - PullRequest
0 голосов
/ 11 июня 2018

Мне нужно получить чистый текст из pdf, используя pdf.js с правильным порядком текста.Мне нужна помощь с Mozilla pdf.js 2.x (я использую 2.0.550).Я посылаю несколько дней, чтобы найти решение без какого-либо успеха.

Цель: извлечь правильный чистый текст из файла pdf с помощью pdf.js Mozilla без рендеринга изображения в формате pdf (canvas или svg) и лучше без текстового слоя, если это возможно.

Я знаю, что вот такой же вопрос, но без ответа - причина и как это исправить.Ссылка PDF.js getTextContent возвращает текст в неправильном порядке Также я рассматриваю другие вопросы в списке с возможными ответами.

Можно получить с каждой страницы.Я использую функцию getTextContent (), и она возвращает объект с массивами 'items'.Нужен объект с элементами .str с текстом на странице.Но порядок неправильный.Можно ли получить правильный порядок текста, как на исходной странице?

В результате вы видите, что порядок неправильный.Но я очень удивлен, потому что с таким же или похожим кодом рендеринга слой показывает правильное изображение.Когда я проверяю приложение pdfjs с текстовым слоем, я вижу много тегов с разными частями текста.Иногда числа в одной строке.Я смотрю каждый тег содержит шрифт \ стиль текстовой группы.

  • Возможно ли это?
  • Есть ли ошибки в коде?Как я могу это исправить?
  • Есть ли какой-нибудь атрибут, показывающий порядок, который я могу использовать для восстановления исходного текста?
  • Может быть, другая функция для извлечения текста?
  • Другие идеи?

Дополнение: я вижу объект obj {}. Items []. Transform [] с элементом [4] как X и элементом [5] как координаты Y.Это правда?Полезно ли вручную сортировать и получать правильный порядок текста сверху вниз и слева направо для каждого элемента 'str'?Может быть, здесь есть в Pdf.js какая-нибудь функция, чтобы сделать это лучше?

Заранее спасибо.

Технические характеристики: Ссылка на файл PDF для тестирования: https://www.pdfill.com/example/pdf_commenting_new.pdf Та же проблема сдругое pdf.

Код:

let pdfurl = "https://www.pdfill.com/example/pdf_commenting_new.pdf";
pdfjsLib.getDocument( pdfurl )
  .then(function(pdf) {
      pdf.getPage( i )
      .then(function(page){ 
        return page.getTextContent( render_options ) })
      .then(function(textContent){
        console.log( i, "# textContent :", textContent );
        textContent.items.forEach( (el, ind) => console.log( (++ind) + ". " + el.str ) );
      });

    })

Результат в консоли:

 1. How to align these objects
 2. You can open a PDF or create a blank PDF by PDFill.
 3. Here are the seven types of PDF Commenting created by PDFill
 4. Goto Page 4: Text Box Tool
 5. Goto Page 6: Sticky Note Tool
 6. Goto Page 7: Popup Tool
 7. Goto Page 8: File Attachment Tool
 8. Goto Page 9: Play Video Tool
 9. Goto Page 11: Line or Arrow Tool
 10. Goto Page 12: Rectangle or Oval Tool
 11. Next Page
 12. Next Page
 13. First Page
 14. Previous Page
 15. Next Page
 16. Last Page
 17. Please save into a new PDF to see the effect!
 18. Online Help
 19. PDFill: PDF Commenting or Annotation
 20. Goto Page 13: Polyline, Cloud and Pencil Tool
 21. Goto Page 2: Select Original Texts
 22. Goto Page 5: Highlight Tool
 23. Goto Page 10: Link Tool
 24. Goto Page 3: Stamp Tool

Конфигурация: - Веб-браузер и его версия: Chrome Версия 66.0.3359.181 (Официальная сборка) (64-разрядная версия) - Операционная система и ее версия: Linux 4.15.0-22-generic # 24-Ubuntu SMP Ср 16 мая 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux - модуль NG - pdfjs-dist -PDF.js версия: 2.0.550 (также 2.0.489) - Угловой 6 / узел 8x / npm 5x / TS

1 Ответ

0 голосов
/ 15 июня 2018

Я понял. Вскоре - получить весь текст в массив и / или коллекцию и отсортировать по противоположным Y и затем координатам X из массива Transform, чтобы получить правильный порядок.

Описание: Очень приятно понимать, чтоось Y в файле PDF находится в противоположном направлении.Я получил его и нашел дополнительную информацию об этом после некоторого времени отладки.

Таким образом, вот простая работа, чтобы получить общий правильный порядок текста.1. Получить все элементы как есть.2. Затем найдите в массиве элементов массив Transform.3. Получить в массиве Преобразование значений X (4-й) и Y (5-й) позиций этого элемента.4. Я использую Lodash.js, чтобы сгруппировать по 2 категориям X и Y массив, который я получил наконец.Позаботьтесь о том, что вам нужно сначала отсортировать по Y от большего к меньшему, потому что Y в PDF обратный.Затем сортируйте по X;

_.orderBy(pagetext, ['y','x'], ['desc', 'asc'] )

В приведенном ниже коде, я полагаю, вы получили объект страницы PDF.Код:

// got text elements from getTextContent() to new array with page, x, y, and text
pagetext.push( 
{ 'p': i, 'x': el.transform[4], 'y': el.transform[5], 't': el.str } )
// follow what we got
          console.log( (++ind) + ". " 
          +" t: "+ el.transform
          +" x= "+ el.transform[4]
          +" y= "+ el.transform[5]
          +" | "+ el.str );

        })    

        return pagetext; // return all text as result from page
      })
      .then(function(ptext){
    // be careful :)
    // resort order by opposite Y and then X coordinates
            let pagetext = ptext;
            console.log( "# it is wrong # pagetext = ", pagetext );
        let p2 = _.orderBy(pagetext, ['y','x'], ['desc', 'asc'] )
        console.log( "# it is correct # pagetext = ", p2 );

});

Вот пример массива около 1 текстового элемента на странице.Вы получите много элементов с getTextContent в произвольном порядке, как я показал выше в вопросе.

//From console:
Object
items : Array(24)
str : "How to align these objects"
transform : (6) [18, 0, 0, 18, 349.76, 335.25]
width : 190.78199999999998
__proto__

Удачи:)

...