Пакет pdftools не может разобрать символы - PullRequest
0 голосов
/ 01 марта 2020

Я использую pdftools для разбора pdf и наткнулся на pdf, который он не в состоянии точно проанализировать (он работает с другими PDF-файлами, поэтому я не думаю, что он связан с кодом).

PDF можно найти здесь: https://eeas.europa.eu/sites/eeas/files/st_10113_2007_init_en.pdf

Мой код:

EU_text_2007 <- pdf_text("2007_CA_Strategy.pdf") %>% 
  readr::read_lines() %>% 
  str_squish()

Возвращает

[1 ] "('' & #! \ n% $ +! &,! -% &! 0 +% '2-3! (4 (-)! 7'2 -' + 9! +, 2! -! '+ -! = - 2'% + 24 $ (.! \ N! \ N! \ N # /! #% '2,&@0' (,%)!% $ +! &,!! -% & ! 0 +% '2-3! (4 (-! \ N! \ N345678 &!'): 8!; 8)! 8!% 456 $ 7: 4) 3 &! 678: 6: 5! @! (7: 5 (: 5 (! - $ 7 * B4! 85! '): 8! 6 *

EU_text_2007_long <- paste(EU_text_2007, collapse = ' ')

EU_text_2007_long <- EU_text_2007_long %>% 
  as.data.frame() 

colnames(EU_text_2007_long) <- c('Text')

EU_text_2007_long <- EU_text_2007_long %>%
  mutate(Year = 2007) %>% 
  mutate(Text = as.character(Text))


EU_text_2007_tokens <- EU_text_2007_long %>% 
  unnest_tokens(tokens, Text, token = "words")

При токенизации данные выглядят примерно так:

Год | токены

1 2007 0
1.1 2007 2
1.2 2007 3
1.3 2007 4
1.4 2007 7'2
1.5 2007 9
1.6 2007 2
1.7 2007 2
1.8 2007 24
1.9 2007 2

Я пытался удалить первую страницу, если водяной знак вызывал проблему, но это не помогло.

Может ли кто-нибудь узнать, не могут ли они также проанализировать этот документ, или нет предложений о том, почему это может произойти. Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Это проблема, с которой вы можете столкнуться при извлечении текста в формате PDF. Формат pdf может обрабатывать несколько разных типов шрифтов и обрабатывать их по-разному. В случае с вашим документом шрифт рассматриваемого текста - это шрифт type0 (PostScript), который называется CAL invisible TT.

Часто программа описания страниц в pdf выводит строки с низким значением, не -Аксии байтов. Затем они ищутся в словаре кодирования шрифта, и соответствующий глиф извлекается из программы описания шрифта, которая встроена в файл. У вашего шрифта нет словаря кодировки - он помечен как Identity-H. Обычно это означает, что вместо него будет запись ToUnicode, а на самом деле ваша - но она фактически пуста.

Как иногда случается, в вашем случае глифы в программе описания шрифтов не отображаются в их правильное значение Ascii и просто отображаются непосредственно в эти младшие байтовые значения (например, глиф A может отображаться в 0x01, а не в его обычное значение 0x41).

В случае этого конкретного документа это фактически делается на цель предотвратить копирование / вставку.

Так почему же текст на странице выглядит нормально?

Это потому, что программа описания шрифта получает сообщение для печати глифа 0x01, но изображение это dr aws относится к букве A. Ни в коем случае сам pdf «не знает» значение ascii того, что он печатает. Ни одна другая программа, за исключением, возможно, программы OCR.

Вы можете доказать это, попытавшись скопировать и вставить текст. Это не работает, потому что отображаемые глифы не имеют точного базового представления ascii.

Без некоторого серьезного обратного инжиниринга вы не можете копировать и вставлять из этого конкретного документа, равно как и извлечение текста в формате PDF. инструменты. Я не говорю, что это невозможно, но очень маловероятно, что это будет тривиальная проблема, которую можно решить с помощью переполнения стека.

Лучшим вариантом, вероятно, будет OCR.

1 голос
/ 01 марта 2020

Другой ответ совершенно верен и довольно ясен в диагностике проблемы (и предлагает впечатляющий объем справочной информации). И я согласен, что Оптическое распознавание символов (OCR), вероятно, является лучшим способом продвижения вперед.

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

pdftools к счастью, уже содержит хорошо работающую функцию для решения этой проблемы, и она должна правильно извлечь (большую часть) текст в этом документе:

text <- pdftools::pdf_ocr_text("https://eeas.europa.eu/sites/eeas/files/st_10113_2007_init_en.pdf", pages = 1)
#> Converting page 1 to st_10113_2007_init_en_1.png... done!
text[1]
#> [1] "COUNCIL OF Brussels, 31 May 2007\nTHE EUROPEAN UNION\n10113/07\nLIMITE\nPESC 655\nCOEST 179\nNOTE\nfrom: The Permanent Representatives Committee\ndated: 31 May 2007\nto: Council\nSubject : The EU and Central Asia: Strategy for a New Partnership\n1. |The Permanent Representatives Committee has endorsed at its meeting on 30 May 2007\nStrategy for a New Partnership with Central Asia as set out in Annex.\n2. The Council (General Affairs and External Relations) is invited to reach an agreement on the\ntext as set out in Annex with the view to its submission to the European Council.\n10113/07 AA/gso l\nDGE VI LIMITE EN\n"

(Установите pages = NULL, чтобы получить весь документ.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...