Почему я не могу разобрать непропорциональный текст с помощью CAM :: PDF? - PullRequest
0 голосов
/ 12 июня 2011

При разборе страницы нет.22 из http://sfdoccentral.symantec.com/sf/5.1/linux/pdf/vxfs_admin.pdf, Я могу проанализировать все слова, кроме mount_vxfs, поскольку его стиль кодирования и / или шрифт отличается от обычного обычного текста.Пожалуйста, найдите прилагаемую страницу PDF для подробностей.

Пожалуйста, найдите мой код: -

`#!/usr/bin/perl
use CAM::PDF;
my $file_name="vxfs_admin_51sp1_lin.pdf";
my $pdf = CAM::PDF ->new($file_name);
my $no_pages=$pdf->numPages();
print "$no_pages\n";
for(my $i=1;$i<$no_pages;$i++){
my $page = $pdf->getPageText($i);
//for page no. 22
//if($i==22){ 
print $page;
//}
}`

1 Ответ

1 голос
/ 15 июля 2011

PDF не хранит семантический текст, который вы прочитали, а использует коды символов, которые отображаются на глифы (закрашенные символы) в определенном шрифте. Однако часто сопоставление код-глиф соответствует общим наборам символов (таким как ISO-8859-1 или UTF-8), так что коды удобочитаемы человеком. Это относится ко всему тексту, который вы смогли проанализировать, хотя иногда нечетный символ, в основном пунктуация, также «неправильный».

Текст для "mount_vxfs" в вашем документе закодирован совершенно по-другому, к сожалению, что приводит к очевидному мусору. Если вам интересно, вы можете увидеть, что там на самом деле, заменив getPageText () на getPageContent () в вашем коде.

Чтобы преобразовать PDF-текст обратно в значимые символы, читатели PDF должны пройти через несколько таблиц преобразования (включая так называемые CMaps). Поскольку это большая работа по программированию, многие более простые библиотеки предпочитают не реализовывать их. Так обстоит дело с CAM :: PDF.

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

  1. Получить xpdf (http://foolabs.com/xpdf) или Poppler (http://poppler.freedesktop.org/). Poppler - более новая ветвь xpdf). Если вы используете * nix, будет доступен пакет.

  2. Используйте инструмент командной строки 'pdftotext' для извлечения текста из файла, по страницам или сразу.

Пример: * * один тысяча двадцать-одна

#!/usr/bin/perl
use English;
my $file_name="vxfs_admin.pdf";

open my $text_fh, "/usr/bin/pdftotext -layout -q '$file_name' - 2>/dev/null |";
local $INPUT_RECORD_SEPARATOR = "\f";    # slurp a whole page at a time
while (my $page_text = <$text_fh>) {
    # this is here only for demo purposes
    print $page_text if $INPUT_LINE_NUMBER == 19;
}
close $text_fh;

(Примечание. Документ, который я получил с помощью вашей ссылки, немного отличается; бит «оскорбительный» находится на стр. 19.)

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